题目链接:http://acm.pku.edu.cn/JudgeOnline/problem?id=1047
这道题难点:
1,带前导0的大整数乘法,最终结果怎么处理
2,如何判断结果中的数字和原数中的数字是否相同
解决方法:
1,一个m位数和一个n位数相乘,结果最多为m+n位,最少位m+n-1位。根据本题的条件限制,假设带前导0的op为m位,另一个乘数为1位或者2位且最大不超过60,所以结果可能的位数为m、m+1、m+2位,只要能确定m+1、m+2位不为0就知道结果为m位,如果能确定m+1、m+2位有一位不为0,就知道这个数一定不是循环数。
2,为了判定结果中的数字和原数中的数字是否相同用了两个整型数组,统计两个数中各个数字出现的频率,然后调用标准库算法比较这两个数组中的内容是否相等就可以判断结果了。
#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
using namespace std;
#define MAX 61
int main()
{
freopen("in.txt","r",stdin);
int in1[10],in2[10];
char op1[MAX],op2[3],res[MAX+2];
int i,j,k,len1,len2,len;
stringstream ss;
bool yes;
while(cin >> op1)
{
yes = true;
i = 0;
memset(in1,0,sizeof(in1));
while(op1[i] != '/0')
{
++in1[op1[i] - '0'];
++i;
}
len1 =strlen(op1);
reverse(op1,op1 + len1);
for(i = 1;i <= len1;++i)
{
ss << i;
ss >> op2;
ss.clear();
len2 = strlen(op2);
reverse(op2,op2 + len2);
memset(res,0,sizeof(res));
for(j = 0;j < len1;++j)
{
for(k = 0;k < len2;++k)
{
res[j+k] += (op1[j] - '0') * (op2[k] - '0');
if(res[j+k] > 9)
{
res[j+k+1] += res[j+k] / 10;
res[j+k] %= 10;
}
}
}
if(res[len1] != 0 ||res[len1 + 1] != 0)
{
reverse(op1,op1 + len1);
cout << op1 << " is not cyclic" << endl;
yes = false;
break;
}
else
len = len1;
memset(in2,0,sizeof(in2));
for(j = 0;j < len;++j)
++in2[res[j]];
if(!equal(in1,in1 + 10,in2))
{
reverse(op1,op1 + len1);
cout << op1 << " is not cyclic" << endl;
yes = false;
break;
}
}
if(yes)
{
reverse(op1,op1 + len1);
cout << op1 << " is cyclic" << endl;
}
}
return 0;
}