#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "iomanip"
using namespace std;
typedef long long ll;
const int maxn = 100001;
char a[maxn], b[maxn];
ll aa[maxn], bb[maxn], c[maxn];
#define p 9                        //压9位高精
#define m 1000000000                //10的p次方
int main()
{
	scanf("%s%s", a, b);
	int len1 = strlen(a);
	int len2 = strlen(b);
	int w, ta = -1, tb = -1;
	reverse(a, a + len1);        //逆序字符串
	for (int i = 0; i < len1; i++, w = w * 10)    //将字符串转换为高精度数组
	{
		if (i%p == 0)                    //每p位进一
		{
			w = 1;
			ta++;
		}
		aa[ta] += w * (a[i] - '0');
	}
	reverse(b, b + len2);
	for (int i = 0; i < len2; i++, w = w * 10)    //同上
	{
		if (i%p == 0)
		{
			w = 1;
			tb++;
		}
		bb[tb] += w * (b[i] - '0');
	}
	for (int i = 0; i <= ta; i++)        //两数相乘
	{
		for (int j = 0; j <= tb; j++)
		{
			c[i + j] += aa[i] * bb[j];
			c[i + j + 1] += c[i + j] / m;
			c[i + j] %= m;
		}
	}
	int t = ta + tb + 2;
	while (!c[t])	t--;            //找数组长度
	for (int i = t; i >= 0; i--)
	{
		if (t == i)
			cout << c[i];
		else
		{
			cout << setw(p) << setfill('0') << c[i];    //补0
		}
	}
	printf("\n");
	return 0;
}


注意:高精压位最多只能压到 9 位,所以并不是最快的算法

点赞(5)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论