Bailian2685 打印水仙花数进制+宏定义
Posted 海岛Blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bailian2685 打印水仙花数进制+宏定义相关的知识,希望对你有一定的参考价值。
2685:打印水仙花数
总时间限制: 1000ms 内存限制: 65536kB
描述
打印出所有得“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字的立方和等于该数本身,例如,152是水仙花数,因为153=1×1×1+5×5×5+3×3×3。
输入
无输入。
输出
输出所有水仙花数,每行输出一个水仙花数。
样例输入
样例输出
来源
计算概论05
问题链接:Bailian2685 打印水仙花数
问题简述:(略)
问题分析:
原先的题解只是题解,不够透彻,参见参考链接。所以,这里重写题解。
这是一个进制有关的问题,涉及如何从整数中把个位、十位和百位数字取出来。能取出这些位,再进行计算和判定就可以了。
解法一:直接计算
用循环控制对三位数(100到999)的整数进行处理。对三位数,根据进制原理取出个位、十位和百位数字,求其立方和,再跟三位数做个比较。
解法二:枚举各位数字
枚举三位数的每一位,也是一种做法,就不需要进制原理的知识了,参见解题程序。
解法三:通用编程
通过宏定义实现程序的通用性,程序中使用了宏定义“#define N 3”。如果将宏定义改为“#define N 4”则可以计算出所有四位数等于其各位四次方之和的数,这些数是:
1634
8208
9474
通用编程需要考虑的多一些,程序要略微复杂。通用编程是职业程序员必备的基本编程技巧。
程序说明:(略)
参考链接:Bailian2685 打印水仙花数【入门】
题记:职业程序员往往追求通用编程。
AC的C语言程序(解法一:直接计算)如下:
/* Bailian2685 打印水仙花数 */
#include <stdio.h>
int main(void)
{
int d1, d10, d100, i;
for (i = 100; i <= 999; i++) {
d1 = i % 10;
d10 = i / 10 % 10;
d100 = i / 100;
if (i == d100 * d100 * d100 + d10 * d10 * d10 + d1 * d1 * d1)
printf("%d\\n", i);
}
return 0;
}
AC的C语言程序(解法二:枚举各位数字)如下:
/* Bailian2685 打印水仙花数 */
#include <stdio.h>
int main(void)
{
int i, j, k;
for (i = 1; i <= 9; i++)
for (j = 0; j <= 9; j++)
for (k = 0; k <= 9; k++) {
int num = i * 100 + j * 10 + k;
if (num == i * i * i + j * j * j + k * k * k)
printf("%d\\n", num);
}
return 0;
}
AC的C语言程序(解法三:通用编程)如下:
/* Bailian2685 打印水仙花数 */
#include <stdio.h>
#define N 3
int main(void)
{
int start = 1, end = 9, i, j;
for (i = 1; i < N; i++)
start *= 10, end = end * 10 + 9;
for (i = start; i <= end; i++) {
int num = i, sum = 0;
while (num) {
int d = num % 10;
num /= 10;
int p = 1;
for (j = 1; j <= N; j++)
p *= d;
sum += p;
}
if (i == sum) printf("%d\\n", i);
}
return 0;
}
以上是关于Bailian2685 打印水仙花数进制+宏定义的主要内容,如果未能解决你的问题,请参考以下文章