高进制各位数字之和的比较

贝贝的保险库密码

题目描述 :某银行的保险库收藏着多件珍贵的物品。为了保证物品的安全,除非有特别的原因,否则银行的保险库要全天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;
    }

猜你喜欢

转载自blog.csdn.net/soul_mingling/article/details/86838355