• C++ 求水仙花数


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

    方法一:使用幂运算

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

    #include 
    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    注: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 
    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    注:
    在这段代码中,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 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

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

  • 相关阅读:
    找斑点(blob)的最小旋转矩形(一)
    java虚拟机堆空间
    无锡地铁4号线一期工程天河停车场项目中智能照明监控系统的应用
    微信小程序开发之后台数据交互及wxs应用
    leetcode_2698求一个整数的惩罚数
    抖音怎么录屏?这个方法,亲测好用
    java计算机毕业设计特色农产品供需销售系统源程序+mysql+系统+lw文档+远程调试
    Go基础语法:概述
    【GlobalMapper精品教程】003:GlobalMapper影像裁剪、批量影像分幅案例详解
    软件评测师之总线
  • 原文地址:https://blog.csdn.net/ultramand/article/details/133839514