大數運算模板(加,減,乘,階乘)

ps:模板中直接調用了strlen(),max(),memset()等函數需要添加頭文件。
大整數加法(a+b)

void f1(char s1[],char s2[]);大整數加法:
調用參數兩個字符串存儲的大整數,
函數爲空返回值,計算結果在函數中直接輸出。

void f1(char s1[],char s2[]){		//大整數加法 
	printf("a+b:\n");
	int i,j;
	int flag=0;
	int a[1010],b[1010];			//數據存儲 
	int l1=strlen(s1);
	int l2=strlen(s2);
	int digit=max(l1,l2);
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	j=0;
	for(i=l1-1;i>=0;i--)			//字符串轉化爲數組 
		a[j++]=s1[i]-'0';
	j=0;
	for(i=l2-1;i>=0;i--)
		b[j++]=s2[i]-'0';
	for(i=0;i<digit;i++){			//判斷是否有多個00 
		if(a[i]){
			flag=1;
			break;
		}
		if(b[i]){
			flag=1;
			break;
		}
	}
	if(!flag){						//兩個0相加 
		printf("0\n");
		return ;
	}
	for(i=0;i<=digit;i++){			//加法運算並判斷進位 
		a[i]+=b[i];
		if(a[i]>=10){
			a[i+1]++;
			a[i]%=10;
		}
	}
	flag=0;
	for(i=digit+1;i>=0;i--){		//加法運算結果輸出 
		if(a[i]){
			printf("%d",a[i]);
			flag=1;
		}
		else if(flag)
			printf("0");
	}
	printf("\n");
	return ;		
}

大整數減法(a-b)

void f2(char s1[],char s2[]);大整數減法:
調用參數兩個字符串存儲的大整數,
函數爲空返回值,計算結果在函數中直接輸出。

void f2(char s1[],char s2[]){		//大整數減法 
	printf("a-b:\n");
	int i,j;
	int flag=0;
	int a[1010],b[1010];			//數據存儲 
	int l1=strlen(s1);
	int l2=strlen(s2);
	int digit=max(l1,l2);
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	j=0;
	for(i=l1-1;i>=0;i--)			//字符串轉化爲數組 
		a[j++]=s1[i]-'0';
	j=0;
	for(i=l2-1;i>=0;i--)
		b[j++]=s2[i]-'0';
	for(i=0;i<digit;i++){			//判斷是否有多個00 
		if(a[i]){
			flag=1;
			break;
		}
		if(b[i]){
			flag=1;
			break;
		}
	}
	if(!flag){						//兩個0相減 
		printf("0\n");
		return ;
	}
	for(i=0;i<=digit;i++){			//減法運算並判斷進位 
		a[i]-=b[i];
		if(a[i]<0){
			a[i+1]--;
			a[i]+=10;
		}
	}
	flag=0;
	for(i=digit+1;i>=0;i--){		//減法運算結果輸出 
		if(a[i]){
			printf("%d",a[i]);
			flag=1;
		}
		else if(flag)
			printf("0");
	}
	printf("\n");
	return ;
}

大整數乘法(a*b)

void f3(char s1[],char s2[]);大整數乘法:
調用參數兩個字符串存儲的大整數,
函數爲空返回值,計算結果在函數中直接輸出。

void f3(char s1[],char s2[]){		//大整數乘法 
	printf("a*b:\n");
	int i,j;
	int flag=0;
	int a[1010],b[1010],r[2020];	//數組存儲數據 
	int l1=strlen(s1);
	int l2=strlen(s2);
	int digit=l1+l2;
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(r,0,sizeof(r));
	j=0;
	for(i=l1-1;i>=0;i--)			//字符串轉化爲數組 
		a[j++]=s1[i]-'0';
	j=0;
	for(i=l2-1;i>=0;i--)
		b[j++]=s2[i]-'0';
	for(i=0;i<digit;i++){			//判斷輸入是否爲多個00 
		if(a[i]){
			flag=1;
			break;
		}
		if(b[i]){
			flag=1;
			break;
		}
	}
	if(!flag){						//兩個0相乘 
		printf("0\n");
		return ;
	}
	for(i=0;i<l1;i++)				//乘法運算 
		for(j=0;j<l2;j++)
			r[i+j]+=a[i]*b[j];
	for(i=0;i<digit;i++)			//判斷是否需要進位 
		if(r[i]>=10){
			r[i+1]+=r[i]/10;
			r[i]%=10;
		}
	flag=0;
	for(i=digit;i>=0;i--){			//乘法運算結果輸出 
		if(r[i]){
			printf("%d",r[i]);
			flag=1;
		}
		else if(flag)
			printf("0");		
	}
	printf("\n");
	return ;
}

大數階乘運算(n!)

完整代碼,輸入需要計算階乘的數值,輸出該數值的階乘。

#include <stdio.h>
#include <string.h>
int a[200020];

int main(){
	int i,j,k,n;
	int digit,num,temp;
	while(scanf("%d",&n)!=EOF) {
		memset(a,0,sizeof(a));   //計算記過存在數組a[]裏
		a[0]=1;
		digit=1;                 //記錄位數
		for(i=1;i<=n;i++){
			num=0;
			for(j=0;j<digit;j++){ //與當前每一位相乘
				temp=a[j]*i+num;  //temp記錄當前的結果,num表示進位的數值
				a[j]=temp%10;
				num=temp/10;
			}
			while(num){          //數組最高位的進位
				a[digit]=num%10;
				num=num/10;
				digit++;
			}
		}
		for(i=digit-1;i>=0;i--)
			printf("%d",a[i]);
		printf("\n");
	}
	return 0;
}
發佈了84 篇原創文章 · 獲贊 9 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章