高精度求积
Time Limit: 10 second
Memory Limit: 2 MB
问题描述
输入两个高精度正整数m和n(m和n均小于100位),求这两个高精度的积
Input
文件输入两行,第一行输入m的值,第二行输入n的值
Output
输出积,最后不带任何符号(不用换行)
Sample Input
36 3
Sample Output
108
【题解】
代码提供的是4位的压位。5位压位会导致一个点通过不了。应该是做乘法的时候溢出了。用了unsigned long long 。。。
【代码】
提供一张图片供理解。
#include <cstdio> #include <string> #include <iostream> using namespace std; const int MAXN = 800; string s1,s2; int l1,l2,l3; unsigned long long ta[MAXN],tb[MAXN],a[MAXN],b[MAXN],c[MAXN]; void input_data() { cin >> s1; cin >> s2; l1 = s1.size(); l2 = s2.size(); for (int i = 1;i <= l1;i++) //ta和tb用于以不压位的形式存储输入的数据 ta[i] = s1[l1-i] - '0'; for (int i = 1;i <= l2;i++) tb[i] = s2[l2-i] - '0'; for (int i = 1;i <= l1 / 4;i++) //4个数字4个数字地存入相应的a和b数组. a[i] = ta[4*i]*1000 + ta[4*i-1]*100 + ta[4*i-2]*10 + ta[4*i-3]; int a1 = l1 / 4; int d = l1 % 4; //有时候不会刚好数的长度为4的倍数,会有剩下的。直接放到最后面。 if (d != 0) { int now = 0; for (int i= 1; i <= d;i++) //获取剩余的数字 now = now*10 + ta[l1-i+1]; a1++; a[a1] = now;//存入a数组中 } for (int i = 1;i <= l2 / 4;i++) //b数组也是同样的步骤 b[i] = tb[4*i]*1000 + tb[4*i-1]*100 + tb[4*i-2]*10 + tb[4*i-3]; int b1 = l2 / 4; int re = l2 % 4; if (re != 0) { int dd = 0; for (int i = 1;i <= re;i++) dd = dd*10 + tb[l2-i+1]; b1++; b[b1] = dd; } l3 = l1 + l2 ; } void get_ans() { for (int i = 1 ;i <= MAXN - 20;i++) c[i] = 0; for (int i = 1;i <= l1;i++) for (int j = 1;j <= l2;j++) c[i+j-1] = c[i+j-1] + a[i]*b[j]; //c[i+j-1]+=a[i]*b[j] 这是高精度乘法的通用步骤 for (int i = 1;i <= l3;i++) //接下来开始进位,和普通的高精度乘法有所不同。 if (c[i] >= 10000) { c[i+1] = c[i+1] + (c[i] / 10000); c[i] = c[i] % 10000; } while (c[l3+1] >0) { l3++; c[l3+1] = c[l3+1] + (c[l3] / 10000); c[l3] = c[l3] / 10000; } while (c[l3]==0 && l3>0) l3--; //防止位数超过了实际位数。做一下检验工作。 } void output_ans() { printf("%d",c[l3]); //最高位前面是不会有多余的0的,所以直接输出。如a[1]=462 a[2]=56 l3=2 a[l3] = 56 这个时候你不能在56前面加0.而465前要加0 //最后结果就是560462 for (int i = l3-1;i >= 1;i--) //控制一下输出就可以了。 { if (c[i] >= 1000) { printf("%d",c[i]); continue; } if (c[i] >= 100) { printf("0%d",c[i]); continue; } if (c[i] >= 10) { printf("00%d",c[i]); continue; } if (c[i] >=1) { printf("000%d",c[i]); } printf("0000"); } } int main() { input_data(); get_ans(); output_ans(); return 0; }