Description
对于正整数n ,不存在整数k ,使得n 等于k 加上k 的数码累加和,我们称这样的数是哥伦比亚数或者自我数。
比如 11就不是一个哥伦比亚数,因为10加上10的数码累加和1等于11;而20则是一个哥伦比亚数。
Input
第一行是一个整数K(K≤10,000) ,表示样例的个数。
以后每行一个正整数n(1≤n≤1,000,000,000)
Output
每行输出一个样例的结果,如果是哥伦比亚数输出"Yes",否则输出"No"。
SampleInput
5
1
2
3
20
21
Sample Output
Yes
No
Yes
Yes
No
解题思路:
一、当题目要求判断的自我数数值范围不大,可以采用模拟筛选,如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 1000001
int k,t;
int n,i;
int flag[N]={0};int colombian(int a)
{int cnt=0;cnt+=a;while(a!=0){cnt+=a%10;a/=10;}return cnt;
}
int main()
{for(i=1; i<1000001; i++){t=colombian(i);if(t<1000001)flag[t]=1;else break;}//结果存入数组scanf("%d",&k);while(k--){scanf("%d",&n);if(!flag[n]) printf("Yes\n");else printf("No\n");}
}
二、当题目要求判断的自我数范围比较大,比如1≤n≤1,000,000,000:
如果n不是哥伦比亚数,则必定有一个小于n的数m,并且m加上m的数码和之和等于n,由题目可知m的数码之和不会超过81,由此可得:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;int colombian(int a)
{int count=0;while(a!=0){count=count+a%10;a=a/10;}return count;
}int main()
{int n,k;scanf("%d",&k);while(k--){scanf("%d",&n);int i=0,flag=0;for(i=n-1;i>n-81&&i>0;i--){if(colombian(i)+i==n)flag=1;}if(flag) printf("No\n");else printf("Yes\n");}
}