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]); } }
原文地址:https://www.cnblogs.com/bxd123/p/10560285.html
时间: 2024-10-14 20:49:43