Sky数问题
问题描述:
Sky从小喜欢奇特的东西,而且天生对数字特别敏感,一次偶然的机会,他发现了一个有趣的四位数2992,这个数,它的十进制数表示,其四位数字之和为2+9+9+2=22,它的十六进制数BB0,其四位数字之和也为22,同时它的十二进制数表示1894,其四位数字之和也为22,啊哈,真是巧啊。Sky非常喜欢这种四位数,由于他的发现,所以这里我们命名其为Sky数。但是要判断这样的数还是有点麻烦啊,那么现在请你帮忙来判断任何一个十进制的四位数,是不是Sky数吧。
输入:
输入含有一些四位正整数,如果为0,则输入结束。
输出:
若n为Sky数,则输出“#n is a Sky Number.”,否则输出“#n is not a Sky Number.”。每个结果占一行。注意:#n表示所读入的n值。
样例输入:
2992
1234
0
样例输出:
2992 is a Sky Number.
1234 is not a Sky Number
题目分析
本题经过不断取数的方法,读取相应数位的值,然后累积相加判断其在10进制,12进制,16进制下各位数之和是否相等,不等则输出非Sky数。
代码
#include<iostream>
using namespace std;
int main ()
{
int k,m;
int tmp,acc; //储存数字在不同进制下,各数位值之和
while((cin >> k) && (k!=0))//判断输入是否结束
{
m = k; //用m代替k作为变量,参与运算
acc = 0; //十进制数位之和
tmp = 0;
for(int i = 0;i<4;++i)//计算十进制下各数位值之和
{
acc += (m % 10);
m /= 10;
}
m = k; //刷新m的值
while(m != 0)
{
tmp += (m % 12);
m /= 12;
}
if(acc != tmp)//判定两种进制下和是否相等
{
cout << k << " is not a Sky Number."<<endl;
continue;//不相等则输出并读取下一个数字
}
tmp = 0;
m = k;
while(m != 0)
{
tmp += (m % 16);
m /= 16;
}
if(acc != tmp)
{
cout << k << " is not a Sky Number."<<endl;
continue;
}
cout << k << " is a Sky Number."<<endl;//是Sky数,输出
}
return 0;
}