100c之21:4位反序数
1 问题
设n是一个四位数,它的9倍恰好是其反序数。反序数就是将整数的数字倒过来形成的整数,比如1234的反序数是4321
2 分析
穷举法,穷举范围从1000到1111即可。因为大于1111的四位数乘以九得到的是个五位数,所以最大的穷举数为1111,另外从1000到1111尾数为0的不用考虑
3 解决方案
1: /** 2: * @file 021fourdigitinversal.c 3: * @author Chaolong Zhang <emacsun@163.com> 4: * @date Tue May 21 18:44:31 2013 5: * 6: * @brief 设n是一个四位数,它的9倍恰好是其反序数。反序数就是将整数的数字倒过来形成的整数,比如1234的反序数是4321 7: * 8: * 9: */ 10: 11: #include <stdio.h> 12: 13: int main(int argc, char *argv[]) 14: { 15: int n; 16: for (n=1000; n <=1111; ++n) 17: { 18: if (0 == n%10 ) continue; 19: else if (n*9 == ((n%10) * 1000 + ((n/10)%10) *100 + ((n/100)%10)*10 + n/1000) ) 20: { 21: printf ("the inverse number of %d is %d\n",n, n*9); 22: } 23: } 24: return 0; 25: }
发现if的判断过程计算步骤太多,可以采用注意计算四个数字的方法诸位对比,只要一位对比补上就不用再比较下去,这样可以减少计算次数。于是,对程序的一点改进。
1: /** 2: * @file 021fourdigitinversal.c 3: * @author Chaolong Zhang <emacsun@163.com> 4: * @date Tue May 21 18:44:31 2013 5: * 6: * @brief 设n是一个四位数,它的9倍恰好是其反序数。反序数就是将整数的数字倒过来形成的整数,比如1234的反序数是4321 7: * 8: * 9: */ 10: 11: #include <stdio.h> 12: 13: int main(int argc, char *argv[]) 14: { 15: int n; 16: for (n=1000; n <=1111; ++n) 17: { 18: if (0 == n%10 ) continue; 19: else if ( n/1000 == n*9%10 && n/100%10 == n*9/10%10 && n/10%10 == n*9/100%10 && n%10 == n*9/1000 ) 20: { 21: printf ("the inverse number of %d is %d\n",n, n*9); 22: } 23: } 24: return 0; 25: }