水仙花数的十种解决方案

以下是完整的优快云格式文章:

水仙花数的十种解决方案

什么是水仙花数?

水仙花数(Narcissistic number),也称为自恋数、自幂数或阿姆斯特朗数,是指一个n位数(n≥3),其各个位上的数字的n次幂之和等于该数本身。例如:153是一个三位数的水仙花数,因为 (1^3 + 5^3 + 3^3 = 153)。

接下来,我们将展示如何通过不同的编程技巧来查找水仙花数。

1. 基本循环法

直接通过循环检查每个数字是否为水仙花数。

#include <stdio.h>
#include <math.h>

int main() {
    for (int num = 100; num < 1000; num++) {
        int sum = 0, temp = num;
        while (temp) {
            int digit = temp % 10;
            sum += pow(digit, 3);
            temp /= 10;
        }
        if (sum == num) printf("%d ", num);
    }
    return 0;
}
2. 函数封装将计算部分封装到函数中,提高代码复用性。#include <stdio.h>
#include <math.h>

int isNarcissistic(int num) {
    int sum = 0, temp = num;
    while (temp) {
        int digit = temp % 10;
        sum += pow(digit, 3);
        temp /= 10;
    }
    return sum == num;
}

int main() {
    for (int num = 100; num < 1000; num++) 
        if (isNarcissistic(num)) printf("%d ", num);
    return 0;
}
3. 数字字符串处理将数字转换为字符串处理,利用ASCII值计算。#include <stdio.h>
#include <math.h>
#include <string.h>

int main() {
    char strNum[4];
    for (int num = 100; num < 1000; num++) {
        sprintf(strNum, "%d", num);
        int sum = pow(strNum[0] - '0', 3) + pow(strNum[1] - '0', 3) + pow(strNum[2] - '0', 3);
        if (sum == num) printf("%d ", num);
    }
    return 0;
}
4. 使用数组存储每位数字先将每一位数字存入数组再进行计算。#include <stdio.h>
#include <math.h>

int main() {
    int digits[3];
    for (int num = 100; num < 1000; num++) {
        digits[0] = num / 100; 
        digits[1] = (num / 10) % 10; 
        digits[2] = num % 10;
        int sum = pow(digits[0], 3) + pow(digits[1], 3) + pow(digits[2], 3);
        if (sum == num) printf("%d ", num);
    }
    return 0;
}
5. 利用数学方法减少重复计算提前计算0-9的立方,避免重复计算。#include <stdio.h>

int main() {
    int cube[10] = {0, 1, 8, 27, 64, 125, 216, 343, 512, 729};
    for (int num = 100; num < 1000; num++) {
        int sum = cube[num / 100] + cube[(num / 10) % 10] + cube[num % 10];
        if (sum == num) printf("%d ", num);
    }
    return 0;
}
6. 递归实现使用递归来代替循环。#include <stdio.h>
#include <math.h>

int recursiveSum(int num, int n) {
    if (num == 0) return 0;
    return pow(num % 10, n) + recursiveSum(num / 10, n);
}

int main() {
    for (int num = 100; num < 1000; num++)
        if (recursiveSum(num, 3) == num) printf("%d ", num);
    return 0;
}
7. 查表法预先计算并保存所有可能的水仙花数,在查询时直接返回结果。#include <stdio.h>

int main() {
    int narcissisticNumbers[] = {153, 370, 371, 407}; // 已知的三位水仙花数
    int size = sizeof(narcissisticNumbers) / sizeof(narcissisticNumbers[0]);
    
    for (int i = 0; i < size; i++) {
        printf("%d ", narcissisticNumbers[i]);
    }
    return 0;
}
8. 面向对象(结构体模拟类)C语言中可以使用结构体来模拟面向对象的方法。#include <stdio.h>
#include <math.h>

typedef struct {
    int value;
    int (*calculate)(int);
} Narcissistic;

int calculate(int num) {
    int sum = 0, temp = num;
    while (temp) {
        int digit = temp % 10;
        sum += pow(digit, 3);
        temp /= 10;
    }
    return sum;
}

int main() {
    Narcissistic narcissistic = {153, calculate};
    if (narcissistic.calculate(narcissistic.value) == narcissistic.value) printf("是水仙花数\n");
    return 0;
}
9. 动态规划对于更大范围内的水仙花数查找,可以考虑动态规划方法优化。这里提供一个简单的思路示例:#include <stdio.h>
#include <math.h>

#define MAX 10000

int dp[MAX];

void preprocess() {
    for (int i = 0; i < 10; i++) {
        dp[i] = pow(i, 3);
    }
}

int main() {
    preprocess();
    for (int num = 100; num < 1000; num++) {
        int sum = dp[num / 100] + dp[(num / 10) % 10] + dp[num % 10];
        if (sum == num) printf("%d ", num);
    }
    return 0;
}
10. 多线程并行处理虽然在简单的水仙花数问题中不常见,但对于更大规模的问题,可以使用多线程技术来加速计算。以下是一个简单的伪代码示例:#include <pthread.h>
#include <stdio.h>
#include <math.h>

#define THREAD_COUNT 4

void* findNarcissistic(void* arg) {
    int start = *(int*)arg;
    int end = start + 250;
    for (int num = start; num < end; num++) {
        int sum = 0, temp = num;
        while (temp) {
            int digit = temp % 10;
            sum += pow(digit, 3);
            temp /= 10;
        }
        if (sum == num) printf("%d ", num);
    }
    pthread_exit(NULL);
}

int main() {
    pthread_t threads[THREAD_COUNT];
    int starts[THREAD_COUNT] = {100, 350, 600, 850};

    for (int i = 0; i < THREAD_COUNT; i++) {
        pthread_create(&threads[i], NULL, findNarcissistic, (void*)&starts[i]);
    }

    for (int i = 0; i < THREAD_COUNT; i++) {
        pthread_join(threads[i], NULL);
    }

    return 0;
}
希望这些示例能帮助你更好地理解水仙花数及其在编程中的应用。如果你有任何问题或建议,请在评论区留言!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值