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"。
Sample Input
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");
}
}