这里进行大数相除的思路是从被除数中减去除数,每减一次,就将结果加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';
}