题目描述
会长不仅是个爱晨刷的girl,也特别喜欢数学呢。然而她已经不满足于高数线代这些简单玩意了,
她要自己定义一种运算改变世界!有一天她垂死梦中惊坐起,突然就想到了一种新的运算F(X)。
如F(123)=1*2+2*3+3*1=11。她发现对于所有的数字来说不停的运用 F 函数会进入一个循环,例如
F(123)=11,F(11)=2, F(2)=4 ,F(4)=16, F(16)=12 ,F(12)=4,循环节的大小就是3。
现在,我们定义 X 的循环节大小为 G(X) 。
现在会长要用自己的方法考验你,给你一个 X ,请你计算G(X)。
如果不知道循环节是什么,请看两个例子:
如果输入了4,你应该输出3
F(4)=16, F(16)=12 ,F(12)=4,F(4)=16... ...
F(4)=16, F(16)=12 ,F(12)=4 为循环节,所以循环节长度为3,即G(4)=3。
如果输入了123,你应该输出3
F(123)=11,F(11)=2, F(2)=4 ,F(4)=16, F(16)=12 ,F(12)=4,F(4)=16... ...
F(4)=16, F(16)=12 ,F(12)=4 为循环节,所以循环节长度为3,即G(123)=3。
输入
多组测试数据,每组测试数据输入一个整数x(x<=1000000)
输出
对于每组测试数据,输出一个整数,代表 G(x)。
样例输入
1
4
样例输出
1
3
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1000000+10;
int f[MAXN], g[MAXN], book[MAXN];
int main()
{
int i ,j ,first ,last ,temp, ans, n;
for(i = 1; i <= 1000000; i ++)
{
j = i; ans = 0; first = j % 10;
last = j % 10; j /= 10;
while(j)
{
temp = j % 10;
ans += last * temp;
last = temp;
j /= 10;
}
ans += last * first ;
f[i] = ans;
}
/*for(int i = 1; i <= 100; i ++)
cout << f[i] << " ";
cout << endl;*/
while(cin >> n)
{
int huan = 0, num = 0, q= n;
memset(book, 0 , sizeof(book));
while(num <= 1000000)
{
if(book[q] == 1)
{
huan ++;
book[q] = 2;
q = f[q];
while(book[q] != 2)
{
huan ++;
book[q] = 2;
q = f[q];
}
cout << huan << endl;
break;
}
else
{
num ++ ;
book[q] = 1;
q = f[q];
}
}
}
return 0;
}