刘子闻(神!)讲的高精度【太强了】
1.6 10:大整数加法
总时间限制: 1000ms 内存限制: 65536kB
描述
求两个不超过200位的非负整数的和。
输入
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。
输出
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
样例输入
22222222222222222222
33333333333333333333
样例输出
55555555555555555555
#include<cstdio> #include<cstring> using namespace std; int main() { char a[205]={0},b[205]={0}; int d[205]={0},f[205]={0},e[205]={0},c,l=0; int l1,l2; gets(a); gets(b); l1=strlen(a); l2=strlen(b); for(c=0;c<l1;c++) { d[205-l1+c]=a[c]-'0'; } for(c=0;c<l2;c++) { f[205-l2+c]=b[c]-'0'; } c=205; while(c--) { e[c]+=d[c]+f[c]; if(e[c]>=10) { e[c-1]++; e[c]=e[c]%10; } } for(c=0;c<205;c++) { if(e[c]!=0) break; } for( c;c<205;c++) l+=printf("%d",e[c]); if(l==0) printf("0"); return 0; }
- 看好了哈,主程序第一行和第二行那些数组,如果你在开的小一点,你就会得到(等会儿,我看一下)额。。。九分的好成绩!!!
1.6 11:大整数减法
总时间限制: 1000ms 内存限制: 65536kB
描述
求两个大的正整数相减的差。
输入
共2行,第1行是被减数a,第2行是减数b(a > b)。每个大整数不超过200位,不会有多余的前导零。
输出
一行,即所求的差。
样例输入
9999999999999999999999999999999999999
9999999999999
样例输出
9999999999999999999999990000000000000
#include<cstdio> #include<cstring> #define m 220 int x[m],y[m]; char b[m],c[m]; int i,s,r,t,z; int main() { scanf("%s%s",b,c); s=strlen(b); r=strlen(c); if(s>r) t=s; else t=r; for(int i=0;i<s;i++) x[i]=b[s-i-1]-'0'; for(int i=0;i<r;i++) y[i]=c[r-i-1]-'0'; for(int i=0;i<t;i++) { x[i]-=y[i]; if(x[i]<0) { x[i+1]--; x[i]+=10; } } int z=t; while(x[z]==0&&z!=0) { z--; } for(int i=z;i>=0;i--) { printf("%d",x[i]); } return 0; }
- 这次我好像注意数组了,然鹅。。。逻辑上有些失误,运算过程中出现了一点差错。嗯。没了(听取WA声一片)
1.13 09:大整数乘法
总时间限制: 1000ms 内存限制: 65536kB
描述
求两个不超过200位的非负整数的积。
输入
有两行,每行是一个不超过200位的非负整数,没有多余的前导0。
输出
一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
样例输入
12345678900
98765432100
样例输出
1219326311126352690000
#include<cstdio> #include<cstring> #include<cmath> #define m 500 using namespace std; int x[m],y[m], z[m]; char b[m],c[m]; int main() { int len1, len2, len3; scanf("%s%s", b, c); len1=strlen(b); len2=strlen(c); for(int i=0; i<len1; i++) x[i] = b[len1-1-i]-'0'; for(int i=0; i<len2; i++) y[i] = c[len2-1-i]-'0'; for(int i=0; i<len1; i++) { for(int j=0; j<len2; j++) z[i+j]+=x[i]*y[j]; len3 = len1+len2; } for(int i=0; i<=len3; i++) { if(z[i]>=10) { z[i+1]+=z[i]/10; z[i]%=10; } } while(z[len3-1]==0 && len3>1) len3--; for(int i=len3-1; i>=0; i--) { printf("%d", z[i]); } return 0; }
- 乘法就和加法减法不太一样了
- 最大到(i+j),最小是(i+j-1)
- 再就是进位不同,加法最多只进1,而乘法呢/手动滑稽/
除法。。。让我再想想吧(我太菜了)
来源:https://www.cnblogs.com/orange-233/p/12018894.html