大数相除 /大数相乘 大数相除是低精度

本文提供了大数相除和相乘的C语言实现代码。通过数组模拟竖式除法过程完成大数相除;通过将字符串转换为整数数组并利用逐位相乘的方式实现大数相乘。适用于处理超出基本数据类型表示范围的大数运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大数相除代码:

//模仿竖式除法
void  division(char * src,int n,int *s,char *dest)
{
    int len = strlen(src),i,k,t=0;
  *s=0;
   
    bool flag = true;    //商是否有了第一个有效位,防止商首部一直出现0   
    for(i=0,k=0; i<len; i++)
    {
 
        t = (*s)*10+(src[i]-48);    //新余数 2
        if(t/n>0 || t==0)        //余数为0要修改商
        {
            dest[k++] = t/n+48,*s = t%n,flag = false;
        }
       else                    //不够除,修改余数
        {
            *s = t;    //-42
            if(!flag)            //商已经有有效位了,补零
                dest[k++] = '0';
        }
    }
 dest[k]='\0';

}

大数相乘代码
/*
 *将在数组中保存的字符串转成数字存到int数组中
*/
void getdigits(int *a,char *s)
{
     int i;
     char digit;
     int len = strlen(s);

     //对数组初始化
     for(i = 0; i < N; ++i)
           *(a + i) = 0;
     for(i = 0; i < len; ++i){
           digit = *(s + i);
           *(a + len - 1 - i) = digit - '0';//字符串s="12345",因此第一个字符应该存在int数组的最后一个位置
     }
}

/*
 *将数组a与数组b逐位相乘以后存入数组c
 */
void multiply(int *a,int *b,int *c)
{
     int i,j;

     //数组初始化
     for(i = 0; i < 2 * N; ++i)
           *(c + i) = 0;
  /*
   *数组a中的每位逐位与数组b相乘,并把结果存入数组c
   *比如,12345*12345,a中的5与12345逐位相乘
   *对于数组c:*(c+i+j)在i=0,j=0,1,2,3,4时存的是5与各位相乘的结果
   *而在i=1,j=0,1,2,3,4时不光会存4与各位相乘的结果,还会累加上上次相乘的结果.这一点是需要注意的!!!
  */
     for(i = 0; i < N; ++i)
           for(j = 0; j < N; ++j)
                 *(c + i + j) += *(a + i) * *(b + j);
  /*
   *这里是移位、进位
  */
     for(i = 0; i < 2 * N - 1; ++i)
     {
           *(c + i + 1) += *(c + i)/10;//将十位上的数向前进位,并加上原来这个位上的数
           *(c + i) = *(c + i)%10;//将剩余的数存原来的位置上
     }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值