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 打印水仙花数进制+宏定义的主要内容,如果未能解决你的问题,请参考以下文章

Java-水仙花数

输出所有“水仙花数”高手请进

编写自定义函数,求水仙花数,并输出

Bailian2701 Bailian3864 与7无关的数进制(POJ NOI0105-39)

Bailian2973 Skew数进制

水仙花数讲解