c语言代码大数求余,C语言大数相除及求余(一种方法)

这里进行大数相除的思路是从被除数中减去除数,每减一次,就将结果加1,直到被除数小于除数为止,从被除数中减去除数使用的是大数减法,结果+1使用的是大数加法(略有不同),但是这样计算很耗费时间,以后希望找到一种省时的算法。

算法主要涉及三个函数:

void minus(char *a,const char *b);    //大数相减,a>b

void plus_one(char* a);               //结果增1

int comp(const char *a,const char *b);//大数比较,返回1表示a>b,返回-1表示a

主要算法如下:

#include #include #include /*

大数除法:

从被除数中减去除数,用计数器统计减去的个数

涉及到的操作:大数相减,大数增1

*/

void plus_one(char* a); //大数增1

void minus(char *a,const char *b); //大数相减,a>b

int comp(const char *a,const char *b);//大数比较

void main(){

char a[100],b[100],count[100];

int alen,count_len;

int i;

gets(a);

gets(b);

memset(count,'\0',sizeof(char)*100); //初始化计数器数组为0

count[0] = '0';

while(comp(a,b)>=0){ //从被除数中减去除数,直到被除数=0;i--){

printf("%c",count[i]);

}

printf("\n");

}

//执行a-b,将结果存入a中,相减的条件为a>b,这个方法与大数减法一致

void minus(char *a,const char *b){

int alen,blen,clen;

int carry = 0;

int temp;

int i,j,k;

char c[100];

memset(c,'\0',sizeof(char)*100);

alen = strlen(a);

blen = strlen(b);

i = alen-1;

j = blen-1;

k = 0;

while(j>=0){

temp = a[i--]-b[j--]-carry; // temp=(a[i]-'0')-(b[i]-'0')-carry

if(temp<0){

temp += 10;

carry = 1;

}else{

carry = 0;

}

c[k++] = temp+'0';

}

while(i>=0){

temp = a[i--]-'0'-carry;

if(temp<0){

temp += 10;

carry = 1;

}else{

carry = 0;

}

c[k++] = temp+'0';

}

k--;

while(c[k]=='0'){

c[k] = '\0';

}

clen = strlen(c);

for(i=0;ib,返回-1表示ablen){

return 1;

}else if(alenb[i]){

return 1;

}else{

return -1;

}

}

}

//大数增1,将结果临时存放在c,后将c复制为a

//为了进位方便,c数组的低位存放大数的低位

void plus_one(char* a){

int carry = 1;

int alen = strlen(a);

int i;

char temp;

for(i=0;i=10+'0'){

temp = '0';

carry = 1;

}else{

carry = 0;

}

a[i] = temp;

}

if(carry==1){

a[i++] = '1';

}

a[i] = '\0';

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的我会尽力回答你的问题。大数相除算法可以使用长除法来实现。具体步骤如下: 1. 将被除和除表示为字符串,将它们转换为整组。 2. 根据除法的规则,从被除的最高位开始,依次取出与除相同位进行除法运算。 3. 如果除比被除的当前部分小,则将当前部分向左依次加上小点后面的,直到满足除大于等于当前部分为止。 4. 第一步中取出的,减去第三步中得到的结果,即为当前的商。 5. 将第三步得到的结果与第一步中取出的相减,得到当前的余。 6. 重复执行2~5步,直到被除的所有位都被处理完毕。 7. 最终余即为除法运算的余,将所有的商拼接起来,即为除法运算的商。 以上就是实现大数相除算法的基本步骤。相应的C语言代码如下(仅供参考): ```C #include <stdio.h> #include <string.h> #define MAX_LEN 10000 void BigIntegerDivide(char a[], char b[], char res[]) { int la = strlen(a), lb = strlen(b); int numA[MAX_LEN], numB[MAX_LEN], numRes[MAX_LEN]; memset(numA, 0, sizeof(numA)); memset(numB, 0, sizeof(numB)); memset(numRes, 0, sizeof(numRes)); int i, j, k; for (i = la - 1, j = 0; i >= 0; --i) numA[j++] = a[i] - '0'; for (i = lb - 1, j = 0; i >= 0; --i) numB[j++] = b[i] - '0'; for (i = la - 1; i >= 0; --i) { for (k = 0; k < MAX_LEN; ++k) numRes[k] *= 10; for (k = MAX_LEN - 1; k > 0; --k) numRes[k] += numRes[k - 1]; numRes[0] += numA[i]; for (j = 0; j < MAX_LEN; ++j) { if (numRes[j] < numB[lb - 1]) continue; int d = numRes[j] / numB[lb - 1]; for (k = 0; k < lb; ++k) { numRes[j + k] -= d * numB[k]; if (numRes[j + k] < 0) { numRes[j + k] += 10; --numRes[j + k + 1]; } } numRes[j + lb] += d; break; } } int pos = MAX_LEN - 1; while (pos > 0 && numRes[pos] == 0) --pos; for (i = pos, j = 0; i >= 0; --i) res[j++] = numRes[i] + '0'; res[j] = '\0'; } int main() { char a[MAX_LEN], b[MAX_LEN], res[MAX_LEN]; printf("Enter dividend: "); scanf("%s", a); printf("Enter divisor: "); scanf("%s", b); BigIntegerDivide(a, b, res); printf("Result: %s\n", res); return 0; } ``` 以上代码实现了一个基于长除法大数相除算法,可以处理非常大的。需要注意的是,由于我们使用了整型组,因此最大能处理的受到了组大小的限制。可以根据需要适当调整组大小,以处理更大的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值