这部分主要是学习一下计算 无法用内置整数类型来保存它的值(即位数多到long long都表示不了) 的整数的加法和乘法
这里使用的方法是首先读入到一个char的数组里,然后初始化转换到int数组里,这样一位就对应数组的一项。
下面这道题是加法计算,思路就是将对应两个数组位置的数与前一位的进位相加
题目描述
实现一个加法器,使其能够输出a+b的值。
输入描述:
输入包括两个数a和b,其中a和b的位数不超过1000位。
输出描述:
可能有多组测试数据,对于每组数据, 输出a+b的值。
示例1
输入
2 6 10000000000000000000 10000000000000000000000000000000
输出
8 10000000000010000000000000000000
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 char a[1001]; 6 char b[1001]; 7 int ansa[1001]; //转换后的a 8 int ansb[1001]; //转换后的b 9 int ans[1002]; //输出目标 10 11 int main() 12 { 13 int i; 14 int lena,lenb; 15 int temp,fd; 16 while( scanf("%s%s",a,b)!=EOF) 17 { 18 lena = strlen(a); 19 lenb = strlen(b); 20 memset(ansa,0,1001); 21 memset(ansb,0,1001); 22 memset(ans,0,1002); 23 fd = 0; //进位 24 for( i=0; i<lena; i++) 25 ansa[i] = a[lena-1-i]-‘0‘; //注意这里是从后往前 26 for( i=0; i<lenb; i++) 27 ansb[i] = b[lenb-1-i]-‘0‘; 28 29 if( lena<lenb ) lena = lenb; //选择两个中较大数 30 31 for( i=0; i<lena; i++) 32 { 33 temp = ansa[i]+ansb[i]+fd; 34 fd = temp/10; 35 ans[i] = temp%10; 36 } 37 if( fd ) printf("%d",fd); //如果最后一次进位不为0则先输出 38 for( i=lena-1; i>=0; i--) printf("%d",ans[i]); 39 printf("\n"); 40 } 41 return 0; 42 }
下面这道题是高精度的乘法,这个问题主要就是一个大数乘一个小数(两个大数相乘数字就很大了)
用小乘数乘大乘数的每一位数并加上来自低位的进位,从而得到该位的结果以及向高位的进位。
题目描述
输入一个正整数N,输出N的阶乘。
输入描述:
正整数N(0<=N<=1000)
输出描述:
输入可能包括多组数据,对于每一组输入数据,输出N的阶乘
示例1
输入
4 5 15
输出
24 120 1307674368000
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 int ans[10000]; //输出目标 6 7 int main() 8 { 9 int n; 10 int i,j; 11 int temp,fd; 12 int index; 13 while( scanf("%d",&n)!=EOF) 14 { 15 memset(ans,0,10000); 16 index=0; //数组下标,统计个数 17 ans[index++] = 1; //阶乘第一位为1 18 19 for( i=2; i<=n; i++) 20 { 21 fd=0; //进位置0 22 for( j=0; j<index; j++) 23 { 24 temp = ans[j]*i+fd; 25 ans[j] = temp%10; 26 fd = temp/10; 27 } 28 while( fd ) 29 { 30 //这里要小心最高位进位可能有多位 31 ans[index++] = fd%10; 32 fd /= 10; 33 } 34 } 35 for( i=index-1; i>=0; i--) 36 { 37 printf("%d",ans[i]); 38 } 39 } 40 41 return 0; 42 }
原文地址:https://www.cnblogs.com/yuxiaoba/p/8443984.html
时间: 2024-10-06 23:21:46