求调
查看原帖
求调
989034
MMXIandCCXXII楼主2024/3/18 19:17

高精乘有些离谱问题,不知道是为什么。 现在发现的就是除了第一次乘,后面每次乘都会变成乘 3333 (样例)。

#include <bits/stdc++.h>
#define int long long
using namespace std;

struct node
{
	int a[1010];
	void read()
	{
		string s;
		cin >> s;
		a[0] = s.size ();
		for (int i = 1; i <= a[0]; i++)
			a[i] = s[a[0] - i] - '0';
	}
	void print()
	{
//		cout << a[0] << endl;
		for (int i = a[0]; i >= 1; i--) cout << a[i];
		cout << endl;
	}
	string change()
	{
		string s = "";
		for (int i = a[0]; i >= 1; i--) s += a[i] + '0';
		return s;
	}
//	friend bool operator < (node x, node y)
//	{
//		return x.a[0] < y.a[0];
//	}
};

map <string, bool> mp;

int k;

node operator * (node a, node b)
{
	node c;
	c.a[0] = a.a[0] + b.a[0] - 1;
	for (int i = 1; i <= a.a[0]; i++)
		for (int j = 1; j <= b.a[0]; j++)
		    c.a[i + j - 1] += a.a[i] * b.a[j];
	for (int i = 1; i <= c.a[0] - 1; i++)
	{
	    c.a[i + 1] += c.a[i] / 10;
	    c.a[i] %= 10;
	}
	while (c.a[c.a[0]] / 10)
	{
	    c.a[++c.a[0]] = c.a[c.a[0] - 1] / 10;
	    c.a[c.a[0] - 1] %= 10;
	}
	while (c.a[0] > 1 && c.a[c.a[0]] == 0)
	    c.a[0]--;
//	c.print ();
	while (c.a[0] > k) c.a[c.a[0]--] = 0;
	return c;
}

signed main()
{
	node a;
	a.read ();
//	a.print ();
	cin >> k;
	
	node tep = a;
	while (!mp.count (tep.change ()))
	{
		mp[tep.change ()] = true;
//		tep.print ();
		tep = a * tep;
//		a.print ();
//		tep.print ();
	}
	cout << mp.size () << endl;
	return 0;
}
2024/3/18 19:17
加载中...