HzuHtx


私信TA

用户名:hetangxin123

访问量:44769

签 名:

私はいつまでもレムが好きです。

等  级
排  名 32
经  验 14532
参赛次数 10
文章发表 76
年  龄 0
在职情况 学生
学  校 贺州学院
专  业 软件工程

  自我简介:

写不动,根本写不动




#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 位,所以并不是最快的算法

 

0.0分

0 人评分

  评论区

  • «
  • »