C++ 求水仙花数

当求解水仙花数时,除了使用幂运算的方法外,还可以采用其他方法来简化计算过程。下面我将详细解释三种不同的方法,并为每种方法提供带有注释的示例代码。

方法一:使用幂运算

这是最常见的求解水仙花数的方法,根据水仙花数的定义,计算每个位上数字的 n 次幂之和,然后与原始数字进行比较。

#include <iostream>
#include <cmath>

int main() {
    int lowerLimit = 100;
    int upperLimit = 999;

    for (int num = lowerLimit; num <= upperLimit; num++) {
        int originalNum = num;
        int sum = 0;
        int numDigits = log10(num) + 1;

        while (num != 0) {
            int digit = num % 10;
            sum += pow(digit, numDigits);
            num /= 10;
        }

        if (sum == originalNum) {
            std::cout << originalNum << " is an Armstrong number." << std::endl;
        }
    }

    return 0;
}

注:log10(num) 是一个数学函数,表示以10为底的对数运算。在C++中,log10() 函数是cmath库中的一个函数,用于计算以10为底的对数。

具体而言,log10(num) 返回一个浮点数,表示以10为底的对数运算结果。它计算的是使得10的该幂次方等于 num 的值。例如,log10(1000) 返回3,因为10的3次方等于1000。

在求解水仙花数的示例代码中,log10(num) 用于计算数字 num 的位数。通过对 num 取对数,然后加上1,我们可以确定 num 是几位数。这对于拆分数字的每个位上的数字非常有用。

请注意,使用 log10() 函数需要包含 头文件,并且参数必须是正数。在实际使用中,可能需要进行适当的错误处理,以确保输入参数满足要求。

sum += pow(digit, numDigits) 是将 digit 的 numDigits 次幂的结果加到变量 sum 上的操作。


在C++中,pow() 是cmath库中的一个函数,用于计算指定数字的指定幂次方。它接受两个参数:底数(base)和指数(exponent),并返回计算结果。

在求解水仙花数的示例代码中,我们使用 pow(digit, numDigits) 来计算每个位上数字的 numDigits 次幂。对于水仙花数,numDigits 是数字的位数,它决定了每个位上数字的幂次。

然后,我们将计算得到的结果加到变量 sum 上,以便累积每个位上数字的幂次之和。

例如,假设我们有一个三位数的水仙花数153。在每个循环迭代中,我们将数字拆分为1、5和3,并计算它们的立方和。对于1,pow(1, 3) 返回1;对于5,pow(5, 3) 返回125;对于3,pow(3, 3) 返回27。然后,我们将这些结果相加,即 sum = 1 + 125 + 27 = 153。

最后,我们将计算得到的 sum 与原始数字进行比较,以确定是否为水仙花数。

需要注意的是,pow() 函数返回的是一个浮点数,因此在将其结果赋值给整型变量之前,需要进行适当的类型转换或四舍五入等操作。

方法二:使用字符串操作

这种方法将数字转换为字符串,然后逐个字符进行幂运算和求和。这种方法可以避免使用幂运算,简化代码。

#include <iostream>
#include <string>

int main() {
    int lowerLimit = 100;
    int upperLimit = 999;

    for (int num = lowerLimit; num <= upperLimit; num++) {
        std::string numStr = std::to_string(num);
        int sum = 0;

        for (char c : numStr) {
            int digit = c - '0';
            sum += digit * digit * digit;
        }

        if (sum == num) {
            std::cout << num << " is an Armstrong number." << std::endl;
        }
    }

    return 0;
}

注:
在这段代码中,int digit = c - ‘0’; 用于将字符 c 转换为对应的数值。

在C++中,字符是以ASCII码的形式存储的,其中数字字符 ‘0’ 到 ‘9’ 的ASCII码值是连续的:‘0’ 的ASCII码是 48,‘1’ 的ASCII码是 49,以此类推。

因此,通过将字符 c 减去字符 ‘0’ 的ASCII码值,我们可以将数字字符转换为对应的整数值。例如,如果 c 是字符 ‘5’,那么 c - ‘0’ 的结果就是整数值 5。这是因为字符 ‘5’ 的ASCII码值是 53,字符 ‘0’ 的ASCII码值是 48,所以 53 - 48 等于整数值 5。

因此,int digit = c - ‘0’; 将字符 c 转换为对应的数值,并将结果存储在整型变量 digit 中,以便在后续的计算中使用。

方法三:使用数组

这种方法将数字的每个位上的数字存储在数组中,然后进行幂运算和求和。这种方法可以避免使用字符串操作,但需要额外的数组存储空间。

#include <iostream>

int main() {
    int lowerLimit = 100;
    int upperLimit = 999;

    for (int num = lowerLimit; num <= upperLimit; num++) {
        int digits[3];
        int temp = num;
        int sum = 0;

        // 将数字的每个位上的数字存储在数组中
        for (int i = 2; i >= 0; i--) {
            digits[i] = temp % 10;
            temp /= 10;
        }

        // 进行幂运算和求和
        for (int digit : digits) {
            sum += digit * digit * digit;
        }

        if (sum == num) {
            std::cout << num << " is an Armstrong number." << std::endl;
        }
    }

    return 0;
}

int num = 100;

	do
	{
		//从所有三位数中找水仙花数

		//个位
		int ones = 0;
		//十位
		int tens = 0;
		//百位
		int hundreds = 0;

		//获取数字的个位
		ones = num % 10;
		//获取数字的十位
		tens = num / 10 % 10;
		//获取数字的百位
		hundreds = num / 100;

		//如果是水仙花数,才输出
		if (ones * ones * ones + tens * tens * tens + hundreds * hundreds * hundreds == num)
		{
			cout << num << endl;
		}

		num++;

	} while (num < 1000);

上述三种方法都可以用来求解水仙花数,具体选择哪种方法取决于个人偏好和实际需求。无论使用哪种方法,都需要遍历指定范围内的数字,并进行幂运算和求和。最后,将求得的和与原始数字进行比较,以确定是否为水仙花数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周杰伦fans

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值