超级无敌简单题

Problem Description
通常来说,题面短的题目一般都比较难,所以我要把题面写得很长很长。
通常来说,题面短的题目一般都比较难,所以我要把题面写得很长很长。
通常来说,题面短的题目一般都比较难,所以我要把题面写得很长很长。
鸽子数字由以下过程定义:从任何正整数开始,将数字替换为其各个数位的平方和,并重复该过程,直到该数字等于1。如果不能,则这个数字不是鸽子数。
例如7是鸽子数,因为7->49->97->130->10->1。(7*7=49,4*4+9*9=97,9*9+7*7=130....如此类推)
显然1是第一个鸽子数。
有Q个询问,每个询问给出一个数k,你需要输出第k个鸽子数。
 
Input
第一行一个Q,代表询问的个数(Q<=100000)
接下来Q行,每行一个数字k(k<150000)
 
Output
每行输出一个数,代表第k个鸽子数
 
Sample Input
2 1 2
 
Sample Output
1 7
暴力打表即可 
在纸上进行对1-9的模拟  发现4会进入死循环 也就是到4时必不可能是
#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define LL long long
#define REP(i,N)  for(int i=0;i<(N);i++)
#define CLR(A,v)  memset(A,v,sizeof A)
//////////////////////////////////
#define N 150000+5
int ans[N];
bool judge(int x)
{
    while(x!=1&&x!=4)
    {
        int sum=0;
        while(x)
        {
            sum+=(x%10)*(x%10);
            x/=10;
        }
        x=sum;
    }
    return x==1;
}
void get(void)
{
    int cnt=1;
    ans[1]=1;
    int i=2;
    while(cnt<=150000)
    {
        if(judge(i))
            ans[++cnt]=i;
        i++;
    }
}

int main()
{
    get();
    int q;
    RI(q);
    while(q--)
    {
        int x;
        RI(x);
        printf("%d\n",ans[x]);
    }
}
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/bxd123/p/10560285.html