第21课计算水仙花数
- 格式:ppt
- 大小:206.00 KB
- 文档页数:36
C语言水仙花数的解题思路1. 什么是水仙花数?水仙花数(Narcissistic number),也被称为自恋数、自幂数或阿姆斯特朗数,是指一个 n 位正整数,它的每个位上的数字的 n 次幂之和等于它本身。
例如,3位水仙花数有153、370、371和407。
2. 解题思路为了判断一个数字是否为水仙花数,我们可以按照以下步骤进行:1.获取输入的正整数。
2.判断该数字是几位数,可以通过循环除以10并计算商的次数来确定。
3.根据位数,计算每一位上的数字的 n 次幂之和。
4.将计算结果与原数字进行比较,如果相等则说明是水仙花数,否则不是。
下面将详细介绍如何实现这个思路。
2.1 获取输入的正整数在 C 语言中,我们可以使用scanf函数来获取用户输入。
首先需要声明一个变量来存储用户输入的正整数,并使用scanf函数将用户输入存储到该变量中。
#include <stdio.h>int main() {int number;printf("请输入一个正整数:");scanf("%d", &number);// 后续代码...return 0;}2.2 判断数字的位数为了计算每一位上的数字的 n 次幂之和,我们需要知道该数字的位数。
可以使用一个循环除以10并计算商的次数来确定。
int countDigits(int number) {int count = 0;while (number != 0) {number /= 10;count++;}return count;}2.3 计算每一位上的数字的 n 次幂之和根据位数,我们可以使用循环从个位开始逐个取出每一位上的数字,并计算其 n 次幂之和。
int isNarcissisticNumber(int number, int power) {int sum = 0;int temp = number;while (temp != 0) {int digit = temp % 10; // 取出最低位上的数字sum += pow(digit, power); // 计算该数字的 n 次幂并累加到总和中temp /= 10; // 去掉最低位上的数字}return sum == number; // 返回计算结果与原数字是否相等}2.4 判断是否为水仙花数最后,我们可以将获取到的正整数和对应的次幂传入isNarcissisticNumber函数中进行判断。
/*(编程题)花朵数一个N位的十进制正整数,如果它的每个位上的数字的N次方的和等于这个数本身,则称其为花朵数。
例如:当N=3时,153就满足条件,因为1^3 + 5^3 + 3^3 = 153,这样的数字也被称为水仙花数(其中,“^”表示乘方,5^3表示5的3次方,也就是立方)。
当N=4时,1634满足条件,因为1^4 + 6^4 + 3^4 + 4^4 = 1634。
当N=5时,92727满足条件。
实际上,对N的每个取值,可能有多个数字满足条件。
程序的任务是:求N=21时,所有满足条件的花朵数。
注意:这个整数有21位,它的各个位数字的21次方之和正好等于这个数本身。
如果满足条件的数字不只有一个,请从小到大输出所有符合条件的数字,每个数字占一行。
因为这个数字很大,请注意解法时间上的可行性。
要求程序在3分钟内运行完毕。
*//*本程序比较容易理解。
执行时间40秒左右(P6100处理器,2G内存,WIN7系统)。
思路:任何一个水仙花数,比如153=1^3+5^3+3^3,里面包括1个1,1个5,1个3。
如果是513,315,351这样的数字……,虽然这几个不是水仙花数,但这几个数字中1,3,5出现的次数和水仙花数是一样的……那么513,315,351这些数字,每位上数字的和应该就是水仙花数。
如果是从1000……-9999……的枚举法,我想问题肯定大了。
而如果采用上面的方法,这样的话,采用对数字出现次数进行枚举会让程序加快很多。
*/#include <stdio.h>#include <time.h>int num_time[10]={0}; //num_time[10]用来得到0-9数字出现的个数int sum[10][21]={(0,0)},sumc[10][21]={(0,0)}; //sum数组用来计算出0-9的21次方。
sumc用来计算数字出现次数*它的21次方int count=0; //计算得到几个水仙花数了,得到2个以后就结束程序void initProgramm() //这个函数用来获得0-9的21次方,存在sum数组里{int i,j,k;for(i=0;i<10;i++)sum[i][20]=i;for(k=2;k<10;k++){for(i=1;i<21;i++){for(j=20;j>=0;j--){sum[k][j]*=k;}for(j=20;j>0;j--){sum[k][j-1]+=sum[k][j]/10;sum[k][j]%=10;}}}}void check(int i0,int i1,int i2,int i3,int i4,int i5,int i6,int i7,int i8,int i9) //检测数字是不是水仙花数{int i,j;int getAdd[21]={0};for(j=0;j<21;j++) //把数字出现次数*它的21次方{sumc[1][j]=sum[1][j]*i1;sumc[2][j]=sum[2][j]*i2;sumc[3][j]=sum[3][j]*i3;sumc[4][j]=sum[4][j]*i4;sumc[5][j]=sum[5][j]*i5;sumc[6][j]=sum[6][j]*i6;sumc[7][j]=sum[7][j]*i7;sumc[8][j]=sum[8][j]*i8;sumc[9][j]=sum[9][j]*i9;}for(i=0;i<10;i++) //进位for(j=20;j>0;j--){sumc[i][j-1]+=sumc[i][j]/10;sumc[i][j]%=10;}for(i=0;i<10;i++) //得到一个数每位的21次方的和,就是把sumc叠加起来for(j=20;j>=0;j--)getAdd[j]+=sumc[i][j];for(i=20;i>0;i--) //进位{getAdd[i-1]+=getAdd[i]/10;getAdd[i]%=10;}int j1=0,j2=0,j3=0,j4=0,j5=0,j6=0,j7=0,j8=0,j9=0,j0=0;for(i=20;i>=0;i--) //用来判断和里面每个数字出现的次数{switch(getAdd[i]){case 0:j0++;break;case 1:j1++;break;case 2:j2++;break;case 3:j3++;break;case 4:j4++;break;case 5:j5++;break;case 6:j6++;break;case 7:j7++;break;case 8:j8++;break;case 9:j9++;break;}}/*如果一个数字,和里0-9出现的次数与这个数字里0-9出现的次数相同,那么和就应该是水仙花数(第一位数字不能为0)*/if((i0==j0)&&(i1==j1)&&(i2==j2)&&(i3==j3)&&(i4==j4)&&(i5==j5)&&(i6==j6)&&(i7==j7)&&(i8==j8)&&(i9==j9)&&(getAdd[0]!=0)){printf("\n");count++;for(i=0;i<21;i++)printf("%d",getAdd[i]);printf("\n");}}void main(){int t,t1,t2;initProgramm();t1=time(NULL);int i0,i1,i2,i3,i4,i5,i6,i7,i8,i9;for(i9=0;i9<10;i9++){for(i0=1;i0<22;i0++){if(count==2) //出现2个水仙花数以后breakbreak;if(i9+i0==21) //几个数字的出现次数和为21以后就break,因为后面的数字出现次数和一定大于21,就超过了21位{ check(i0,0,0,0,0,0,0,0,0,i9);break;}for(i2=0;i2<22;i2++){if(count==2)break;if(i9+i0+i2==21){ check(i0,0,i2,0,0,0,0,0,0,i9);break;}for(i3=0;i3<22;i3++){if(count==2)break;if(i9+i0+i2+i3==21){ check(i0,0,i2,i3,0,0,0,0,0,i9);break;}for(i4=0;i4<22;i4++){if(count==2)break;if(i9+i0+i2+i3+i4==21){ check(i0,0,i2,i3,i4,0,0,0,0,i9);break;}for(i5=0;i5<22;i5++){if(count==2)break;if(i9+i0+i2+i3+i4+i5==21){ check(i0,0,i2,i3,i4,i5,0,0,0,i9);break;}for(i6=0;i6<22;i6++){if(count==2)break;if(i9+i0+i2+i3+i4+i5+i6==21){ check(i0,0,i2,i3,i4,i5,i6,0,0,i9);break;}for(i7=0;i7<22;i7++){if(count==2)break;if(i9+i0+i2+i3+i4+i5+i6+i7==21){ check(i0,0,i2,i3,i4,i5,i6,i7,0,i9);break;}for(i8=0;i8<22;i8++){if(count==2)break;if(i9+i0+i2+i3+i4+i5+i6+i7+i8==21){ check(i0,0,i2,i3,i4,i5,i6,i7,i8,i9);break;}for(i1=0;i1<22;i1++){if(count==2)break;if(i9+i0+i2+i3+i4+i5+i6+i7+i8+i1==21){check(i0,i1,i2,i3,i4,i5,i6,i7,i8,i9);break;}}}}}}}}}}}t2=time(NULL);t=t2-t1;printf("\n%d s\n",t);}。
Matlab 基础知识1.目的:-熟悉MATLAB 的具体操作与操作键。
-掌握MATLAB 中的常用函数与变量、表达式的定义方法。
-熟悉MATLAB 常用的工作方式M 文件的编程工作方式- 掌握MATLAB 语言中的程序结构。
2.任务(1) 建立一个M 文件,求所有的水仙花数。
所谓的水仙花数是指一个三位数,其各位数字的立方和等于该数本身。
例如153是一个水仙花数,因为153=13+53+33 。
(2) 用subplot 分别在不同的坐标系下画出下列四条曲线,为每幅图形加上标题:概率曲线2x y e -=四叶玫瑰曲线sin 2ρθ= 叶形线3233131t x t t y t ⎧=⎪⎪+⎨⎪=⎪+⎩正弦曲线sin y x =(1)运用subplot 函数可以将多个图画到一个平面上,subplot (m,n,p ),其中,m 表示是图排成m 行,n 表示图排成n 列,也就是整个figure 中有n 个图是排成一行的,一共m 行。
function sifutux=-5:0.01:5;y1=exp(-(x.^2));j=0:0.01:2*3.14;%概率曲线p=sin(2*j);%四叶玫瑰线t=0:0.01:100;x2=3*t./(1+t.^3)y2=3*t.^2./(1+t.^3)%叶形线a=-2*3.14:0.01:2*3.14;y3=sin(a);%正弦曲线subplot(2, 2 ,1);plot(x,y1);subplot(2, 2 ,2)polar(j,p);subplot(2, 2 ,3)plot(x2,y2);subplot(2, 2, 4)plot(a,y3);问题分析:首先要先设一个三位数s,然后提取它的百位数a,十位数b,个位数c,然后根据条件s=a^3+b^3+c^3,求出s。
function shuifor s=100:999;%定义s为三位数a=fix(s/100);%提取百位数b=fix(s/10-10*a);%提取十位数c=s-100*a-10*b;%提取个位数if s==a.^3+b.^3+c.^3% s=a^3+b^3+c^3disp(s)%显示出sendend然后运行的出水仙花数位:1533703714073.实验过程(1).利用公式21171513114++-+-= π计算π的值。
⼆⼗⼀:拓展⽔仙花问题 : 拓展⽔仙花题⽬描述有⼀种数字叫:⽔仙花数。
⽐如:153是⼀个⾮常特殊的数,它等于它的每位数字的⽴⽅和,即153=1*1*1+5*5*5+3*3*3。
现在,有⼀种拓展的⽔仙花数。
不仅仅是每位数每位数字的3次⽅和了,如果这个数字总共有N位的话,则是“每位数字的N次⽅和”。
eg:54748=5*5*5*5*5+4*4*4*4*4+7*7*7*7*7+8*8*8*8*8+4*4*4*4*4现在要给你⼀个数X。
需要你给出在所有X位数中,存在的拓展⽔仙花数分别是什么。
从⼩到⼤输出。
输⼊⼀个数字X表⽰位数(x<=6)。
输出X位数中哪些是拓展⽔仙花数。
从⼩到⼤,每⾏⼀个样例输⼊4样例输出163482089474⽅法⼀:1 #include<stdio.h>2#define fr(i,n,m) for(i=n;i<m;i++)3int fun(int n,int m){4int sum=1;5for(int j=0;j<n;j++){6 sum*=m;7 }8return sum;9 }10int main(){11int n,a,b,i;12int k,sum,p;13 scanf("%d",&n);14switch(n){15case1:a=1,b=10;break;16case2:a=10,b=100;break;17case3:a=100,b=1000;break;18case4:a=1000,b=10000;break;19case5:a=10000,b=100000;break;20case6:a=100000,b=1000000;break;21 }22 fr(i,a,b){23 k=a;24 p=i;25 sum=0;26while(k){27 sum+=fun(n,p/k);28 p=p%k;29 k=k/10;30 }31if(sum==i){32 printf("%d\n",i);33 }34 }3536 }⽅法⼆:1 #include<stdio.h>2 #include<math.h>3int fun(int n,int m){4int sum=1;5for(int j=0;j<n;j++){6 sum*=m;7 }8return sum;9 }10int main(){11int a,b,n,sum,p;12 scanf("%d",&n);13for(int i=pow(10,n-1);i<pow(10,n);i++){14 a=pow(10,n-1);15 p=i;16 sum=0;17while(a){18 sum+=fun(n,p/a);19 p=p%a;20 a=a/10;21 }22if(sum==i){23 printf("%d\n",i);24 }25 }2627 }。
用计算器探索有趣的水仙花数不久前在做“有理数的乘方”练习时,我发现了一道十分有趣的题目:“任意写一个大于100的能被3整除的三位整数,求这个数每一个数位上的数字的立方和。
将所得的和重复上述操作,这样一直继续下去,你发现了什么规律?再任取一个符合条件的整数试一试,验证你的发现!”我顿时眼前一亮,我倒要看看有什么规律,有什么发现!按题目的要求,首先选择一个能被3整出的整数------105÷3=35,3³+5³=152,1³+5³+2³=134,1³+3³+4³=92,9³+2³=737……以此类推,最后我算到某一个数的结果时,规律出现了:35,152,134,92,737,713,371,371,371……到了371这个数时,之后的数就再也没变过,如循环小数一般。
这或许就是规律吧!真是太有意思了!类似371这样的数到底有多少呢?为一探究竟,我就上网去找资料。
结果让我大开眼界。
原来这就是传说中的“水仙花数”,又称阿姆斯特朗数,是指一个n 位数( n≥3 ),它的每个位上的数字的n 次幂之和等于它本身。
三位的水仙花数共有4个:153,370,371,407。
知道了答案,我反而有点不甘心了:怎么只有4个?再试一下!于是我又用138这个数,来验证是否如此。
138÷3=46,4³+6³=280,2³+8³+0³=520,5³+2³+0³=133,1³+3³+3³=55,5³+5³=250……这次所计算出的结果使我感到更意外,这又是一种循环方式:46,280,520,133,55,250,133,55,250……我的兴趣又浓了许多。
我大胆的猜想:我题目中的“大于100”改为“小于100”;“被3整除”改为“被2整除”;“立方和”改为“平方和”。
水仙花数有哪些水仙花数是指一个三位数,其个位、十位和百位数字的立方和等于该数本身的数。
水仙花数是一个非常有趣的数学现象,因为它们既具有一定的规律性,又具有一定的特殊性。
下面我们将详细介绍水仙花数的定义、特征以及一些实例。
首先,我们来定义水仙花数。
一个三位数可以表示为abc,其中a、b和c分别代表百位、十位和个位上的数字。
如果abc满足以下条件:a³ + b³ + c³ = abc,则abc就是一个水仙花数。
那么水仙花数有哪些呢?根据上述定义,我们可以通过枚举法找到所有的水仙花数。
首先,百位数字a的范围是1到9,因为0不满足三位数的条件。
然后,十位和个位数字b和c的范围都是0到9。
所以我们需要遍历所有的三位数,将满足条件的数列出来。
经过计算,我们找到了如下所有的水仙花数:153、370、371、407。
这四个数都满足a³ + b³ + c³ = abc的条件。
接下来,我们来研究水仙花数的特征。
首先,水仙花数是一个三位数,所以它是一个有限集合。
其次,水仙花数具有一定的规律性,即满足a³ + b³ + c³ = abc。
这个规律可以用来判断一个三位数是否为水仙花数。
对于每一个三位数abc,我们可以按照上述规则计算其立方和。
然后将计算结果与abc进行比较,如果二者相等,则该数为水仙花数;如果不相等,则不是水仙花数。
通过观察水仙花数的特征,我们可以发现一些有趣的现象。
首先,水仙花数是对称的,即百位数字与个位数字相同。
其次,水仙花数是非常罕见的,只有四个三位数满足条件。
这也反映了水仙花数的特殊性。
水仙花数的发现和研究对于我们理解数学规律、培养数学思维都具有积极的意义。
通过研究水仙花数,我们可以锻炼我们的观察力和逻辑思维能力。
此外,水仙花数还是一种数学趣味活动,可以增加我们学习数学的兴趣。
总结一下,水仙花数是指一个三位数,其个位、十位和百位数字的立方和等于该数本身的数。
水仙花数方程解法
水仙花数是指一个三位数,它的每个位上的数字的立方和等于它本身。
例如,153是一个水仙花数,因为1的立方加5的立方加3的立方等于153。
为了解决水仙花数问题,我们可以使用方程式解决。
设所求数为n,则其个、十、百位数字分别为n1、n2、n3,则有:
n = n1^3 + n2^3 + n3^3
根据该方程,我们可以通过枚举每个三位数的每个位上的数字,计算并判断是否为水仙花数。
当然,这种方法比较费时费力。
我们也可以采用循环来解决这个问题。
首先,我们可以使用三个循环来枚举每个三位数的每个位上的数字,然后计算并判断是否为水仙花数。
具体做法如下:
for i in range(1, 10):
for j in range(0, 10):
for k in range(0, 10):
n = i * 100 + j * 10 + k
if n == i**3 + j**3 + k**3:
print(n)
该代码通过三个循环枚举每个三位数的每个位上的数字,计算并判断是否为水仙花数,若是则输出该数。
通过这种方式,我们可以快速地找到所有的水仙花数。
除了这种方法外,我们还可以使用其他途径来解决这个问题,例
如使用递归或数论方法等。
无论采用何种方法,解决水仙花数问题的本质都在于寻找这样一种规律或方法,以便从大量的数据中快速、准确地找到需要的结果。
水仙花数水仙花什么是水仙花数春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:水仙花数是指一个 n 位数( n≥3 ),它的每个位上的数字的n 次幂之和等于它本身。
(例如:1^3 + 5^3 + 3^3 = 153)常见水仙花数三位的水仙花数共有4个:153,370,371,407;四位的水仙花数共有3个:1634,8208,9474;五位的水仙花数共有3个:54748,92727,93084;六位的水仙花数只有1个:548834;七位的水仙花数共有4个:1741725,4210818,9800817,9926315;八位的水仙花数共有3个:24678050,24678051,88593477…………使用高精度计算,可以得到超过INT类型上限的水仙花数:5: 930845: 927275: 547486: 5488347: 98008177: 42108187: 17417257: 99263158: 246780508: 246780518: 885934779: 1465112089: 9129851539: 4723359759: 53449483610: 467930777411: 3216404965011: 4002839422511: 4267829060311: 4938855060611: 3216404965111: 9420459191411: 4470863567911: 8269391657814: 2811644033596716: 433828176939137016: 433828176939137117: 3587569906225003517: 2189714258761207519: 328958298444318703219: 492927388592808882619: 449812879116462486920: 6310542598859969391621: 44917739914603869730721: 12846864304373139125223: 2790786500997705256781423: 3545259010403169193594323: 2787969489305407447140523: 2188769684112291628885824: 17408800593806529302372224: 188451485447897896036875(为环保起见,24位以上的水仙花数略)理论上,最大的水仙花数不超过34位。
c语言水仙花数的解题思路摘要:1.水仙花数的定义和特点2.C语言解题思路3.代码实现与解析正文:水仙花数,又称阿姆斯特朗数,是一个三位数,其每个数字的立方和等于该数本身。
例如,153是一个水仙花数,因为1^3 + 5^3 + 3^3 = 153。
在这个文章中,我们将探讨如何使用C语言来寻找水仙花数。
C语言解题思路:1.首先,我们需要编写一个函数来检测一个数是否为水仙花数。
这个函数可以通过遍历每个数字的立方和来判断。
2.然后,编写一个循环来遍历从1到999的所有整数,检查每个整数是否为水仙花数。
3.一旦找到水仙花数,输出结果并结束程序。
以下是C语言代码实现:```c#include <stdio.h>int power(int a, int b) {int result = 0;for (int i = 0; i < b; i++) {result += a * a * a;}return result;}int isNarcissisticNumber(int num) {int originalNum = num;int sum = 0;while (num > 0) {int digit = num % 10;sum += power(digit, 3);num /= 10;}return sum == originalNum;}int main() {int count = 0;for (int i = 1; i <= 999; i++) {if (isNarcissisticNumber(i)) {printf("Found a narcissistic number: %d ", i);count++;}}printf("Total narcissistic numbers found: %d", count);return 0;}```代码解析:1.我们定义了一个`power()`函数,用于计算一个数的立方。
1、水仙花数2、还贷问题3、调和级数4 、e的计算5、开普勒定律一、课程设计工作日自 2011年 12 月 26 日至 2011 年 12 月 30 日二、同组学生:无三、课程设计任务要求(包括课题来源、类型、目的和意义、基本要求、完成时间、主要参考资料等):题目:水仙花数若一个三位自然数的各位数字的立方和等于该数本身,则称该自然数为水仙花数,例如,153 = 13+ 53+ 33,所以153 就是一个水仙花数,编程计算出所有的水仙花数。
所用代码:for m=100:999m1=fix(m/100);%求m的百位数字m2=rem(fix(m/10),10);%求m的十位数字m3=rem(m,10);%求m的个位数字if m==m1*m1*m1+m2*m2*m2+m3*m3*m3disp(m)endend运行结果:run('D:\MA TLAB7\work\Untitled.m')15337037140711、一位使用工商银行国际信用卡的张姓用户, 2004年12月用工商银行的信用卡, 刷卡消费39771.52元,由于记错了还款额,他在还款日期(2005年1月25日) 到期之前, 分多次共计还款39771.28元, 少还了0.24元(事后才发现). 但就是这区区0.24元, 工商银行在他1月份的账单里记账两笔共计853元的利息. 张先生从网上查到账单后, 立即致电工商银行95588, 得到的答复是最新的国际信用卡章程已将原来只对逾期没有还的欠款部分收取利息改为对消费款全部从消费发生日起收取每日万分之五的利息.请问: 工商银行按多少天来收的利息?00(1)(1)nn n nA A r A A r =+=+1/001ln[/]ln[1]nn n A r A A A n r ⎛⎫=- ⎪⎝⎭=+n=fzero((1+0.0005)^n-40624.52/39771.52,43) ams= 42.46A1 调和级数 已知调和级数 +++++n131211是发散的。