试题 算法提高 高精度乘法
蓝桥杯试题解答汇总链接
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
计算机真是最傻的东西;他都不能计算大于10^65-1的a*b,请你帮这个“最傻”的东西过关,否则它就真的只认识1和0了。
输入格式
共两行;第一行输入一个整数a;第一行输入一个整数b。
输出格式
共一行,一个表示a*b的整数。
样例输入
2147483647
2147483647
样例输出
4611686014132420609
数据规模与约定
10^65-1<a,b<10^201-1
代码
#include <stdio.h>
#include <string.h>
int main() {
char num1[210], num2[210];// 每个数最长200位注意开的数组大小
scanf("%s\n%s",num1,num2);
int num[400] = {0}, i, j;// 因为是两个数相乘所以结果最大可能为400位
int len1 = strlen(num1), len2 = strlen(num2), ca, len;
len = len1+len2;// len1、len2分别代表num1、num2的长度
for(i = len2-1;i >= 0; --i) {
ca = 0;// ca代表进位
for(j = len1-1;j >= 0; --j) {
num[i+j+1] += (num1[j]-'0')*(num2[i]-'0');// 模拟手算相乘
ca = num[i+j+1]/10;// 求出进位
num[i+j+1] %= 10;// 保留本位的数字
num[i+j] += ca;// 向前进位
}
}
int f = 0;
for(i = 0;i < len; ++i) {
if(num[i]) {// 排除开头的0
f = 1;
}
if(f) {
printf("%d",num[i]);
}
}
return 0;
}