ZUFE 问题 C: 会长爱数学

题目描述

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值