特殊的四位数

来源:互联网 发布:自动外呼软件 编辑:程序博客网 时间:2024/05/21 09:14

(来源:POJ 2196 ZOJ 2405程序设计方法及在线实践指导(王衍等)例3.4,P140)

问题描述:

找出并输出所有的4位数(十进制数)中具有如下属性的数:四位数字之和等于其十六进制形式各位数字之和,也等于其十二进制形式各位数字之和。

例如:十进制数2991,其四位数字之和2+9+9+1 = 21。由于2991 = 1*1728 + 8*144 + 9*12 + 3,其十二进制形式为1893(12),其各位数字之和也为21.但是它的十六进制形式为BAF(16),其各位数字之和等于11+10+15 = 36。因此你的程序要舍去2991这个数据。

       下一个数2992,其十进制、十二进制、十六进制形式各位数字之和均为22,因此2992符合要求,应该输出来。(只考虑4位数,2992是第一个符合要求的数)

输入:

本题没有输入。

输出:

你的程序要求输出2992及其他更大的、满足要求的四位数(要求严格按升序输出),每个数占一行(前后都没有空行),整个输出以换行符结尾。输出中没有空行。输出中的前几行如样例输出所示。

样例输入:

本题没有输入。

样例输出:

2992

2993

2994

2995

2996

2997

2998

2999

...

解题思路:

       该题在求解时要用到枚举的算法思想,即枚举所有的四位数(1000-9999),判断其是否满足十六进制、十二进制和十进制形式的各位数之和相等。

       这里要注意进制转换方法。将一个十进制数Num转换到M进制,其方法是:将Num除以M取余数,直到商为0为止,存储得到的余数,先得到的余数为低位,后得到的余数为高位进行排序,余数0不能舍去。由于此题需要得到Num在16、12和10进制下各位的和,所以只要累加其余数即可。


#include <stdio.h>#include <string.h>int main(){    int i;   for(i=2000;i<=9999;i++)   {        int sum1=0,sum2=0,sum3=0;        int tmp;        tmp=i;        while(tmp)        {            sum1+=tmp%16;            tmp/16;        }        tmp=i;        while(tmp)        {            sum2+=tmp%12;            tmp/=12;        }        if(sum1!=sum2) continue;        tmp=i;        while(tmp)        {            sum3+=tmp%10;            tmp/=10;        }        if(sum1==sum3) printf("%d\n",i);   }    return 0;}


0 0
原创粉丝点击