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

52 篇文章 0 订阅

这里进行大数相除的思路是从被除数中减去除数,每减一次,就将结果加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,'\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;i<clen;i++){
		a[i] = c[clen-1-i];
	}
	a[i] = '\0';
}  

//返回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] = '\0';
}


  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值