C语言大数相除及求余(一种方法)
发布时间:2020-12-14 02:46:46 所属栏目:大数据 来源:网络整理
导读:这里进行大数相除的思路是从被除数中减去除数,每减一次,就将结果加1,直到被除数小于除数为止,从被除数中减去除数使用的是大数减法,结果+1使用的是大数加法(略有不同),但是这样计算很耗费时间,以后希望找到一种省时的算法。 算法主要涉及三个函数:
这里进行大数相除的思路是从被除数中减去除数,每减一次,就将结果加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<b,返回0表示a==b ? 主要算法如下: #include <stdio.h> #include <string.h> #include <stdlib.h> /* 大数除法: 从被除数中减去除数,用计数器统计减去的个数 涉及到的操作:大数相减,大数增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,' ',sizeof(char)*100); //初始化计数器数组为0 count[0] = '0'; while(comp(a,b)>=0){ //从被除数中减去除数,直到被除数<除数为止,每减一次,结果就加1 minus(a,b); plus_one(count); } printf("operator %%: "); //输出余数 for(i=0;a[i]!=' ';i++){ printf("%c",a[i]); } printf("n"); printf("operator : "); //输出除法运算的结果 count_len = strlen(count); for(i=count_len;i>=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,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] = ' '; } clen = strlen(c); for(i=0;i<clen;i++){ a[i] = c[clen-1-i]; } a[i] = ' '; } //返回1表示a>b,返回-1表示a<b,返回0表示a==b int comp(const char *a,const char *b){ int alen = strlen(a); int blen = strlen(b); int i=0; if(alen>blen){ return 1; }else if(alen<blen){ return -1; }else{ while(a[i]==b[i] && i<alen){ i++; } if(i==alen){ return 0; }else if(a[i]>b[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<alen;i++){ temp = a[i]+carry; if(temp>=10+'0'){ temp = '0'; carry = 1; }else{ carry = 0; } a[i] = temp; } if(carry==1){ a[i++] = '1'; } a[i] = ' '; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |