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;
}