XTUOJ-1251-Colombian Number

  1. 题目

题目描述
对于正整数n,不存在整数k,使得n等于k加上k的数码累加和,我们称这样的数是哥伦比亚数或者自我数。
比如 11就不是一个哥伦比亚数,因为10加上10的数码累加和1等于11;而20则是一个哥伦比亚数。
输入
第一行是一个整数K(K≤10,000),表示样例的个数。
以后每行一个正整数n(1≤n≤1,000,000,000)
输出
每行输出一个样例的结果,如果是哥伦比亚数输出"Yes",否则输出"No"。
样例输入
5
1
2
3
20
21
样例输出
Yes
No
Yes
Yes
No

  1. 解法
    因为1≤n≤1,000,000,000,所以n的数码和最小是1,最大是81(999999999),即数码和在1-81之间。所以我们最多只需要枚举比n小1-81之间的数字即可。明白这一点这一题就很简单了,我的代码如下。
#include 
using namespace std;
typedef long long ll;
//计算数码和
ll sum(ll n) {
	ll sum = n;
	while(n) {
		sum+=n%10;
		n/=10;
	}
	return sum;
}
int main(int argc, char const **argv) {
	int K;
	ll n;
	cin >> K;
	while(K--) {
		cin >> n;
		bool flag = true;
		for(int i = 1; i <= 81; i++) {
			if(n-i > 0) {
				if(sum(n-i) == n) {
					flag = false;
					break;
				}
			} else {
				break;
			}
		}
		if(flag) {
			cout << "Yes" << endl;
		} else {
			cout << "No" << endl;
		}
	}
	return 0;
} 

你可能感兴趣的:(XTUOJ)