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){	    //从被除数中减去除数,直到被除数<除数为止,每减一次,结果就加1
		minus(a,b);		
		plus_one(count);
	}

	printf("operator %%: ");    //输出余数
	for(i=0;a[i]!='\0';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,'\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';
}


你可能感兴趣的:(算法,C/C++)