首页 > 其他分享 >C语言——练习:水仙花数、n次幂值的计算

C语言——练习:水仙花数、n次幂值的计算

时间:2024-07-13 09:56:23浏览次数:16  
标签:digit power int C语言 base 幂值 data 水仙花

1.输入一个数判断是否是水仙花数,并输出100—999之间所有的水仙花数

水仙花数(Narcissistic number),也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。以下是关于水仙花数的详细解释:

(1)定义
  • 水仙花数是一个N位正整数(N≥3),其每个位上的数字的N次幂之和等于该数本身。
  • 例如,153是一个三位数的水仙花数,因为1^3 + 5^3 + 3^3 = 153。
(2)特性
  • 水仙花数是自幂数的一种特殊情况,即一个数的每个位上的数字的幂之和等于它本身。
  • 随着位数的增加,符合条件的水仙花数数量会减少。例如,十进制自然数中所有的水仙花数共有88个,但其中只有4个是三位数(153、370、371、407)。
  • 水仙花数的位数N不能大于9,因为一个正整数的每个位上的数字的N次幂之和最大为9的9次幂,即387420489,而9位数的最大值为999999999,已经超过了9的9次幂。
(3)求解方法
  • 可以通过编程遍历指定范围内的所有数,对每个数进行分解,并计算其每个位上的数字的N次幂之和,然后判断该和是否等于原数本身。
  • 在C语言中,可以通过编写函数来判断一个数是否为水仙花数,并遍历100到999之间的所有数来找出所有的三位水仙花数。
(4)代码实现
#include<stdio.h>

int narcissisYesOrNot(int data)
{
	int origion_number = data;
	int digit_number = 0;
	int digit_value;
	int digit_power = 1;
	int result = 0;
	
	while(data != 0){  	//判断输入数据的位数,存储在digit
		data /= 10;
		digit_number++;     
	}

	
	data = origion_number;  //经过位数判断,data值已经改变,将data原始值重新赋给data
	
	while(data != 0 ){
		digit_value = data%10;

		digit_power = 1;                          //digit_power值由于上一轮循环有初值,在进入下一次循环之前需要重新赋1
		for(int j=1;j <= digit_number;j++){       //循环计算对应位数的幂值
			digit_power *=  digit_value;
		}

		result += digit_power;                  //累加每一位对应的幂值

		data /= 10;                         //去掉末位数,以求下一位值

	}
	return (result == origion_number);
}

int main()
{
	int i;
	int data;
	
	printf("请输入一个数:\n");
	scanf("%d",&data);
	
	if(narcissisYesOrNot(data)){
		printf("你输入的数%d是水仙花数\n",data);
	}else{
		printf("你输入的数%d不是水仙花数\n",data);
	}
	
	for(i=100;i<=999;i++){
		if(narcissisYesOrNot(i)){
		printf("在100—999中%d是水仙花数\n",i);
		}
	}
	
	return 0;
}

输出将是:

请输入一个数:
370
你输入的数370是水仙花数
在100—999中153是水仙花数
在100—999中370是水仙花数
在100—999中371是水仙花数
在100—999中407是水仙花数

2.C语言中n次幂值的计算

在水仙花数的计算中,涉及到了数值N次幂的计算,上述代码使用的是最直接的循环,在这里我想总结一下。

(1)使用循环

最直接的方法是使用循环来累乘。这种方法简单易懂,但效率不是最高的,特别是对于大数。

#include <stdio.h>  
  
long long power(int base, int n)
{  
    long long result = 1;  
    while (n > 0) {  
        if (n % 2 == 1) {  
            result *= base;  
        }  
        base *= base;  
        n /= 2;  
    }  
    return result;  
}  
  
int main() 
{  
    int base = 2, n = 10;  
    printf("%d to the power of %d is %lld\n", base, n, power(base, n));  
    return 0;  
}

注意,上面的power函数实现了一个优化版本的幂运算,它基于二进制快速幂算法(也被称为平方乘算法)。这种方法将幂运算的时间复杂度降低到对数级别。

(2)使用math.h库

如果你的环境中支持标准C库,那么你可以使用<math.h>库中的pow函数来计算幂。这个方法很方便,但需要注意pow函数的参数和返回值都是double类型,所以如果你需要处理大整数或者需要精确的小数结果,这可能是个好选择。

#include <stdio.h>  
#include <math.h>  
  
int main() {  
    double base = 2.0, n = 10.0;  
    double result = pow(base, n);  
    printf("%.0f to the power of %.0f is %.0f\n", base, n, result);  
    return 0;  
}

注意,如果basen都是整数,但你想要整数结果,你可能需要将结果转换为整数类型,并考虑四舍五入或截断。

(3)使用库函数(针对大整数)

对于非常大的整数,标准C库可能不够用。在这种情况下,你可能需要使用专门的大数库,如GMP(GNU Multiple Precision Arithmetic Library)。这些库提供了用于处理大整数的函数,包括幂运算。

总结

对于大多数应用,如果你需要处理的是整数幂且数值不是特别大,使用循环(特别是快速幂算法)是一个很好的选择。如果你需要处理浮点数或者需要更复杂的数学运算,使用<math.h>库中的pow函数可能更方便。对于非常大的整数,考虑使用专门的大数库。

标签:digit,power,int,C语言,base,幂值,data,水仙花
From: https://blog.csdn.net/weixin_45720999/article/details/140385556

相关文章

  • 在VSCODE中创建C语言环境,编译、运行、调试。
    1、安装MinGWMinGW-w64-for32and64bitWindowsdownload|SourceForge.net下载下来是一个压缩包对压缩包解压得到文件夹mingw64将文件夹mingw64剪切到C:\ProgramFiles目录下配置环境变量点击系统变量里面的Path将C:\ProgramFiles\mingw64\bin目录添加......
  • 【C语言】字符串与相关操作函数
    字符串思路分析在注释文章目录字符串一、字符串的定义1.使用sizeof()计算他们的长度二、sizeof和strlen的区别1.sizeof操作符2.strlen函数三、动态开辟字符串1.malloc函数2.realloc函数3.free函数4.memset函数四、几种字符串常用的API1.strncpy函数2.asse......
  • C语言-分支与循环(1)
    目录1、if语句1.1if1.2else1.3分支中包含多条语句1.4嵌套if1.5悬空else问题(多个if和一个else对应关系)2、switch语句2.1switch语句中的break2.2switch语句中的default2.3switch语句中的case和default的顺序问题3、关系操作符4、条件操作符4.1什么是条件......
  • 实现猜数字游戏(C语言)
    简单版本#include<stdio.h>#include<stdlib.h>#include<time.h>#include<Windows.h>#include<string.h>voidmenu(){ chararr[]="************************"; chararr1[]="--Welcometomygame!!--"; int......
  • 学习C语言第一天
    今天看了B站上的几节课,总结了以下几个要点:1.githud,码云两个网站实现代码托管,坚持上传代码。2.CSDN坚持写博客,善于总结包括xmind。3.不做伸手党,要学会自己解决问题。4.操作系统,计算机网络+网络编程,比较难,上课要认真,还需要看书补偿。5.数据结构要听懂。6.介绍了课程安排。7.了解......
  • c语言的简易教法—— 函数递归
    文章目录一、什么是递归?1.1递归的思想1.2递归的限制条件二、递归案例2.1案例1:求n的阶层2.1.1分析2.1.2递归函数(Fact)的代码实现2.1.3测试:main函数实现2.1.4运行结果和画图推演2.1.5扩展:迭代方法求解n的阶乘2.2案例2:顺序打印⼀个整数的每⼀位2.2.1分析2.2.2打印数(p......
  • 十天速通C语言基础(day01)
    目录一、前言二、大纲三、Linux命令快捷键新建查看切换 复制移动 删除 打开终端四、vi编辑器1、vi编辑器的使用2.vi模式切换命令3.vi拷贝与粘贴命令 4.vi保存和退出命令5.vi光标命令6.vi的查找命令7.vi替换命令8.vi复制和剪切命令一、前言    ......
  • C语言函数详解
    文章目录函数的概念库函数库函数的使⽤⽅法⾃定义函数形参和实参基本的传参类型嵌套调⽤链式访问多个⽂件函数的概念数学中我们其实就⻅过函数的概念,⽐如:⼀次函数y=kx+b,k和b都是常数,给⼀个任意的x,就得到⼀个y值。其实在C语⾔也引⼊函数(function)的概念,有些翻译为......
  • 嵌入式C语言概述
    什么是嵌入式系统?嵌入式系统是指一个集成了软件和硬件的专用计算机系统,通常用于执行特定的任务。与通用计算机系统不同,嵌入式系统具有以下特点:专用性:嵌入式系统通常执行单一或特定的任务。资源有限:嵌入式系统的硬件资源(如处理器速度、内存容量)通常有限。实时性:许多嵌入式系统......
  • JAVA——水仙花数问题
    2024/07/121.问题2.错误解法3.错误分析4.正确解法5.其他:关于Java中幂函数的用法6.参考1.问题2.错误解法importjava.util.Scanner;publicclassMain{ publicstaticvoidmain(String[]args){ Scannerscanner=newScanner(System.in); intA=nextInt();......