【暴力】 会长爱数学 校OJ2346

题目描述

会长不仅是个爱晨刷的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;

int seat[1000];

int main()
{
	int x;
	while (~scanf ("%d", &x) )
	{
		memset(seat,-1,sizeof(seat));
		for(int i=0;;i++)
		{
			int t=-1;
			int ch[10];
			memset(ch,0,sizeof(ch));

			while (x)
			{
				t++;
				ch[t] = x % 10;
				x /= 10;
			} //将x按位存入ch[]

			int num=0;
			for(int i=0;i<t;i++)
				num+=ch[i]*ch[i+1];
			num+=ch[0]*ch[t];

			if(seat[num]!=-1)
			{
				printf("%d\n",i-seat[num]);
				break;
			}
			else  //标记num的位置
			{
				seat[num]=i;
				x=num;
			}
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ummmmm/article/details/80337507
今日推荐