贝贝的保险库密码
题目描述 :某银行的保险库收藏着多件珍贵的物品。为了保证物品的安全,除非有特别的原因,否则银行的保险库要全天24小时开启监控设备进行实时监控:当确实需要临时关闭监控设备时,需要使用为特定操作人员设计的监控密码,这种密码要与操作人员的指纹信息结合,生成一个符合规定的数据,该操作人员才能关闭银行的保险库的监控设备。于是银行的行长就找到了贝贝,请他帮忙设置一个系统判断输入的密码是否正确。密码要求如下:行长设想的监控密码是一个不超过9位的十进制正整数,且要有如下特征:它的各位数字之和等于该数的12进制表示的各位数字之和,还等于该数的16进制表示的各位数字之和。例如,2991的各位数字之和为2+9+9+1=21,因为2991=l×1728+8×144+9×12+3,它的12进制表示是189312,各位数字之和也是21。但是2991的16进制表示是BAF16,并且11+10+15=36,所以2991不是合法的监控密码。又如,2992在全部三种表示法中各位数字之和都是22,所以2992是合法的监控密码。
现在请你帮贝贝的忙,编一个程序判断输入的密码是否可以用作银行保险库的监控密码。
输入:输入只有一个长度不超过9位的十进制正整数。
输出:第1行为输入的十进制数所对应的十六进制数各位数字之和,第2行为“Right”(可用作监控密码)或“Wrong”(不可用作监控密码)。
样例输入:
2992
样例输出:
22
Right
只要我们把12和16的9位之内的乘方全部算出来,逐次进行运算,最后进行比较即可(当然,10进制就不用这么麻烦了,逐次删除最后一位,再加上最后一位就行了)。其实12进制和16进制也可以用循环,但是数字本来就少,我就没用循环,直接列举了。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,a=0,m,b=0,c=0;//a,b,c分别为10进制,12进制,16进制的各位数字之和
scanf("%d",&m);
n=m;
while(n!=0)
{
a=n%10+a;
n=n/10;
}
int p=m;
b=b+p/429981696;//完全可以用循环代替下面一串代码,使用其进行乘方递归即可
p=p%429981696;
b=b+p/35831808;
p=p%35831808;
b=b+p/2985984;
p=p%2985984;
b=b+p/248832;
p=p%248832;
b=b+p/20736;
p=p%20736;
b=b+p/1728;
p=p%1728;
b=b+p/144;
p=p%144;
b=b+p/12;
p=p%12;
b=b+p;
int q=m;
c=c+q/268435456;
q=q%268435456;
c=c+q/16777216;
q=q%16777216;
c=c+q/1048576;
q=q%1048576;
c=c+q/65536;
q=q%65536;
c=c+q/4096;
q=q%4096;
c=c+q/256;
q=q%256;
c=c+q/16;
q=q%16;
c=c+q;
printf("%d\n",c);
if(a==b&&a==c) printf("Right\n");//三个都相同才行
else printf("Wrong\n");
return 0;
}