水仙花数算法研究及其C语言代码实现
c语言水仙花数的解题思路
c语言水仙花数的解题思路一、水仙花数的定义和特点水仙花数,又称阿姆斯特朗数,是指一个n位数,其每个位上的数字的n 次幂之和等于它本身。
例如,153是一个水仙花数,因为153 = 1^3 + 5^3 + 3^3。
水仙花数具有以下特点:1.每一位数字都不重复;2.通常情况下,水仙花数的位数较多;3.目前已知的水仙花数都是正整数。
二、C语言解题思路要找到一个n位数是否为水仙花数,可以通过遍历每一位数字,计算其n 次幂之和,然后与原数进行比较。
若相等,则为水仙花数;否则,不是。
由于位数较多,可以采用递归或循环方法进行计算。
三、算法实现步骤1.输入一个整数n,表示要查找的水仙花数的位数;2.输入一个整数m,表示要判断的数;3.初始化一个结果变量res为0;4.遍历m的每一位数字,从右到左,分别计算其n次幂之和:1) 提取当前位数字;2) 计算该位数字的n次幂;3) 将计算结果累加到res上;5.判断res与m是否相等,若相等,则输出m是水仙花数,否则输出不是。
四、代码示例与解析以下是一个简单的C语言实现:```c#include <stdio.h>int is_narcissistic_number(int m, int n) { int res = 0;while (m) {int digit = m % 10;res += pow(digit, n);m /= 10;}return res == m;}int main() {int n, m;printf("请输入位数n:");scanf("%d", &n);printf("请输入要判断的数m:");scanf("%d", &m);if (is_narcissistic_number(m, n)) {printf("%d是水仙花数。
", m);} else {printf("%d不是水仙花数。
C语言求21位水仙花数
/*(编程题)花朵数一个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);}。
c语言水仙花数作业,c语言水仙花数(c语言水仙花数的编程)
c语⾔⽔仙花数作业,c语⾔⽔仙花数(c语⾔⽔仙花数的编程)C语⾔计算出"⽔仙花"数,代码如下:运⾏结果如下:扩展资料 解题思路:这⾥提供了⼀种算法,即使⽤三个for循环确定三位数字,最外层的for循环即确定百位上的数字.“⽔仙花数”程序怎么写啊代码如下:#include int main() { printf("输出⽔仙花数:\n"); int i=100; for( ; i<1000; i++){ int num_0 = i%10; int num_1 =i/10%10; int num_2 = i/10/10%10; if.#include void main() { int a,b,c,s; s=a*100+b*10+c; for(a=1;aLZ你好~ ⾸先你要理解啥是⽔仙花数:⽔仙花数是指⼀个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本⾝。
(例如:1^3 + 5^3 + 3^3 = 153) 以上来⾃百.#include main() { int n,i,j,k; for(n=100;n把if语句块套在for循环⾥才⾏。
#include main() { int n,i,j,k; for(n=100;n<. k="n%10;" if .>最近学C语⾔ 作业⾥⾯有个写程序求⽔仙花数的 尝试得写了写 #include #.#include#include main() { int a,b,c,Y; int sum=100; while(sum<=999) { 百a=sum/100; b=sum%100/10; c=sum%10;Y=a*a*a+b*b*b+c*c*c; if(Y==sum)//判断.现写⼀个程序给我可以吗?跟⽹上其他有点差别就⾏了,不要复制粘贴的。
.#include int main(int argc, char **argv) { int i; int g ,s,b; //定义个位制,⼗位,百位上的知数 for(i=100;i<1000;i++){ //从100到1000查询⽔仙花数 g=i%10; //取出.严格的⽔仙花是三位数,并且其每位数的三次⽅的和等于它的本⾝。
C语言练习4:找出所有3位数的水仙花数
14
for (j = 0; j < 10; j++)
15
{
16
for (k = 0; k < 10; k++)
17
{
18
m = i * 100 + j * 10 + k;
19
n = i * i * i + j * j * j + k * k * k;
20
if (m == n)
21
{
22
printf("%d\n", m);
View Code
、
、
、
、
、
持之以恒的学习****程序分割线【TOP】******************************/
7 void Daffodils_num_3()
8{
9 int i, j,k;
10 int m, n;
11
12 for (i = 1; i < 10; i++)
13 {
博客园 用户登录 代码改变世界 密码登录 短信登录 忘记登录用户名 忘记密码 记住我 登录 第三方登录/注册 没有账户, 立即注册
代码如下:
C语言练习 4:找出所有 3位数的水仙花数
1 /*练习题目为:找出所有3位数的水仙花数*/
2
3 #include<stdio.H>
4 #include<stdlib.H>
//设置交互界面的尺寸
34
35 printf("***请按任意键开始***");
36 getchar();
37
38 Daffodils_num_3();
c语言水仙花数的概念 -回复
c语言水仙花数的概念-回复C语言水仙花数的概念一. 引言在C语言编程中,水仙花数是一个经典的概念。
它不仅是一个数学问题,也是学习和探索编程的一个绝佳机会。
本文将详细解释什么是水仙花数,并提供一个步骤性的指南,以帮助读者理解和实现这个概念。
二. 水仙花数的定义水仙花数,也被称为自恋数或亲花数,是指一个三位数,它的每个位上的数字的立方和等于它本身。
举例来说,153是一个水仙花数,因为1的立方加上5的立方加上3的立方等于153。
水仙花数是对自然数的一种特殊形式的探索,它既有数学的美感,也有令人着迷的编程实现之道。
三. 实现计算水仙花数的算法下面将介绍一种简单的算法来计算水仙花数:1. 定义一个循环,从100到999,以便对所有的三位数进行检查。
2. 在每次迭代中,将当前的三位数分解成百位、十位和个位上的数字。
3. 对每个数字进行立方操作,并将结果相加。
4. 比较结果和原始的三位数,如果相等,则打印该数字。
下面是一个示例程序:c#include <stdio.h>int main() {int num, digit, sum;printf("水仙花数: ");for (num = 100; num <= 999; num++) { sum = 0;int temp = num;while (temp > 0) {digit = temp 10;sum += digit * digit * digit;temp = temp / 10;}if (sum == num) {printf("d ", num);}}return 0;}四. 程序解析让我们逐步分析这个程序:1. 首先,我们声明了需要使用的变量,包括num(用来存储当前检查的数字),digit(用来存储当前位上的数字)和sum(用来存储每位数字立方和)。
2. 我们通过一个循环,从100到999,依次检查每个三位数。
水仙花数的算法
用C#编程,写出一个求水仙花数的算法!1、水仙花数是指一个n(n>=3)位数,每一位数字的n次幂的和正好等于这个数本身。
例如,153是一水仙花数,因为153=1的3次方+5的3次方+3的3次方.using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace NarcissusNumber{class Program{public static void Main(string[] args){int a;string s;do{Console.WriteLine("3----找出三位数所有的水仙花数!");Console.WriteLine("4----找出四位数所有的水仙花数!");Console.WriteLine("5----找出五位数所有的水仙花数!");Console.WriteLine("34---你选择找出三、四位数的水仙花数!");Console.WriteLine("45---你选择找出四、五位数的水仙花数!");Console.WriteLine("35---你选择找出三、四、五位数的水仙花数!");Console.WriteLine("0----退出");Console.Write("请选择操作(0,3,4,5, 34, 45, 35):");s= Console.ReadLine();a = int.Parse(s);switch (a){case0:Console.WriteLine("你选择退出!");break;case3:Console.WriteLine("你选择找出三位数的水仙花数!");Funtion(a);break;case4:Console.WriteLine("你选择找出四位数的水仙花数!");Funtion(a);break;case5:Console.WriteLine("你选择找出五位数的水仙花数!");Funtion(a);break;case34: Console.WriteLine("你选择找出三、四位数的水仙花数!");Funtion(a);break;case45: Console.WriteLine("你选择找出四、五位数的水仙花数!");Funtion(a);break;case35: Console.WriteLine("你选择找出三、四、五位数的水仙花数!");Funtion(a);break;default: Console.WriteLine("你的输入是不合理的!请重先选择!");break;}Console.WriteLine();// Console.Clear(); /*清屏*/} while (a!=0);}/*******************输出水仙花数的算法*******************************/static int Funtion(int s){int i;int j;int k;int n;int m;int l;if (s==3) /*输出100-999的水仙花数*/{for(n=100;n<999;n++){i = n / 100;j = n / 10 - i * 10;k = n % 10;if (n==Recursion(i,s) + Recursion(j,s) + Recursion(k,s))Console.WriteLine(n);}}else if (s == 4) /*输出1000-9999的水仙花数*/{for (n = 1000; n <= 9999; n++){i = n / 1000;j = n / 100 - i * 10;k = n / 10 - i * 100 - j * 10;l = n % 10;if (n == Recursion(i, s) + Recursion(j, s) + Recursion(k, s) + Recursion(l, s))Console.WriteLine(n);}}else if(s==5) /*输出10000-99999的水仙花数*/{for (n = 10000; n <= 99999; n++){i = n / 10000;j = n / 1000 - i * 10;k = n / 100 - i * 100 - j * 10;l = n / 10 - i * 1000 - j * 100 - k * 10;m = n % 10;if (n == Recursion(i, s) + Recursion(j, s) + Recursion(k, s) + Recursion(l, s) + Recursion(m, s))Console.WriteLine(n);}}else if (s ==34) /*输出100-9999的水仙花数*/{for (n = 100; n <= 9999; n++){i = n / 1000;j = n / 100 - i * 10;k = n / 10 - i * 100 - j * 10;l = n % 10;if (i != 0 && n==Recursion(i, 4) + Recursion(j, 4) + Recursion(k, 4) + Recursion(l, 4))Console.WriteLine(n);if (n== Recursion(j, 3) + Recursion(k, 3) + Recursion(l, 3))Console.WriteLine(n);}}else if(s == 45) /*输出1000-9999的水仙花水*/{for (n = 1000; n <= 99999; n++){i = n / 10000;j = n / 1000 - i * 10;k = n / 100 - i * 100 - j * 10;l = n / 10 - i * 1000 - j * 100 - k * 10;m = n % 10;if (i != 0 && n == Recursion(i, 5) + Recursion(j, 5) + Recursion(k, 5) + Recursion(l, 5) + Recursion(m, 5))Console.WriteLine(n);if (n == Recursion(j, 4) + Recursion(k, 4) + Recursion(l, 4) + Recursion(m, 4))Console.WriteLine(n);}}else/* 输出100-99999的水仙花数*/{for (n = 100; n <= 99999; n++){i = n / 10000;j = n / 1000 - i * 10;k = n / 100 - i * 100 - j * 10;l = n / 10 - i * 1000 - j * 100 - k * 10;m = n % 10;if (i != 0 && n == Recursion(i, 5) + Recursion(j, 5) + Recursion(k, 5) + Recursion(l, 5) + Recursion(m, 5))Console.WriteLine(n);else if (j != 0 && n == Recursion(j, 4) + Recursion(k, 4) + Recursion(l, 4) + Recursion(m, 4))Console.WriteLine(n);else if (n== Recursion(k, 3) + Recursion(l, 3) + Recursion(m, 3))Console.WriteLine(n);}}return0;}/*********************用递归求数n的k次方*******************************/static int Recursion(int n,int k){int m;if (k == 1) return n;else{m=n*Recursion(n,k-1);}return m;}}}。
在各种编程语言中实现求取水仙花数的方法(非高精度)
在各种编程语⾔中实现求取⽔仙花数的⽅法(⾮⾼精度)在各种编程语⾔中实现求取⽔仙花数的⽅法(⾮⾼精度)。
PHP “⽔仙花数”实现代码<?phpfor ($i=100;$i<1000;$i++) {$m = floor($i/100); //分解出百位$n = floor($i/10)%10;//分解出⼗位$k = floor($i%10);//分解出个位if ($i == ($m*$m*$m+$n*$n*$n+$k*$k*$k)) {echo $i."<br/>";}}>PHP 所有位数理论输出/** * ⽔仙花数为不⼩于3位的数字,每位数字的N次幂的和等于该数字.N为该数字的位数* @name daffodilsNum ⽔仙花数* @param $places ⽔仙花位数 >=3*/function daffodilsNum($places=3){// (0); //设置超时为不限制,如果提⽰30秒超时,可以开启本控制//$begin= (); // 开始时间//定义位数if(!defined('PLACES')) define('PLACES',is_numeric($places)?$places:3);if(PLACES>=3){$min=pow(10,PLACES-1); //选数范围起始位置$max=pow(10,PLACES); //选数范围结束位置//开始选数for($i=$min,$out='';$i<$max;$i++){$sum=0; //当前选数下各个幂值的和$arr= ($i); //以字符串⽅式分割选数for($j=0;$j<PLACES;$j++){//对每个数字作幂操作并累加$sum+=pow($arr[$j],PLACES);if($sum>$i){//如果当前累加已⼤于选数,则跳出循环break;}}if($sum==$i){//如果符合定义,将该数字添加到输出队列$out.=$i.'<br/>';}}//输出队列echo $out;//echo "<br/>".(microtime()-$begin); //输出耗时,当脚本开始时间开启时有效}else{//$this->error('错误的位数'); //提⽰错误的位数}}语⾔的"⽔仙花数"实现代码#include <stdio.h>int main(){int i,d1,hub,transit;for(i=100;i<=9999;++i){for(hub=0 ,transit=i,d1=123; transit!=0;){d1=(transit%10)*(transit%10)*(transit%10);*/hub=hub+d1;transit=transit/10;}if(hub==i) printf("⽔仙花数%d\n",i);}return 0;}PASCAL 实现代码program shuixianhuashu;vara,b,c:integer;beginfor a:=1 to 9 dofor b:=0 to 9 dofor c:=0 to 9 doif a*a*a+b*b*b+c*c*c=100*a+10*b+c then writeln(100*a+10*b+c); end.或:program sxh;var a,b,c,d:integer;beginfor a:=100 to 999 do beginb:=a mod 10;c:=a mod 100 div 10;d:=a div 100;if b*b*b+c*c*c+d*d*d=a then writeln(a);end;end.或program abcd;vara,b,c,i,t:integer;begini:=100;repeata:=trunc(i/100);b:=trunc(i/10)-a*10;c:=i-trunc(i/10)*10;t:=a*a*a+b*b*b+c*c*c;if i=tthen writeln(i,'=',a,'^3+',b,'^3+',c,'^3');i:=i+1until i>999end.Visual Basic 的"⽔仙花数"实现代码Private Sub Command2_Click()Dim i As Integer, a As Integer, b As Integer, c As IntegerFor i = 100 To 999 Step 1a = i \ 100b = (i - 100 * a) \ 10c = i - 100 * a - 10 * bIf a ^ 3 + b ^ 3 + c ^ 3 = i Then Print iNext iEnd SubFORTRAN 的"⽔仙花数"实现代码WRITE(*,30)DO 10 K=100,999IA=K/100IB=MOD(K,100)/10WRITE(*,20)K, IA,IB,IC10 CONTINUE20 FORMAT(5X,4I4)30 FORMAT(5X,18HN=I**3+J**3+K**3) STOPENDC++ 编译器上的⽔仙花数实现代码#include<iostream>using namespace std;int main(){int a,q,w,e;for(a=100;a<1000;++a){q=a/100;w=(a-q*100)/10;e=(a-q*100-w*10);if(a==q*q*q+w*w*w+e*e*e)cout<<a<<"是⽔仙花数"<<endl;};return 0;}python 中实现的代码for i in range(1,10):for j in range(0,10):for k in range(0,10):if i*100+j*10+k==i*i*i+j*j*j+k*k*k:print i*100+j*10+kJava 中实现的代码public class NumberOfDaffodils {public static void main(String[] args) {List<Long> numbers = new ArrayList<Long>(); for(long i = 100; i < Long.MAX_VALUE ; i++){ if(match(i)){numbers.add(i);}}System.out.println(numbers);}private static boolean match(long in) {//统计位数int count = (in+"").length();//记录每位数字long temp = 0;//辗转取余的保存数long num = in;//求和数long sum = 0;for(int i = count ; i > 0 ; i--){temp = num/(long)Math.pow(10,i-1);num = num%(long)Math.pow(10,i-1);sum+=Math.pow(temp,count);}return in == sum;}}C# ASP.N 中的实现代码for (int i = 100; i < 1000; i++){int bai = 0;int shi = 0;bai = i / 100;baiyushu = i % 100;shi = baiyushu / 10;ge = baiyushu % 10;if (i == bai * bai * bai + shi * shi * shi + ge * ge * ge){Console.WriteLine("⽔仙花数:" + i + "<br>");}}补充C#⽔仙花数实现代码(不定位数)/// <summary>/// 判断⼀个数是否是⽔仙花数/// </summary>/// <param name="num">要判断的数</param>/// <returns>判断结果:true-是,false-否</returns>bool isWaterFlower(int num){if (num <= 0){return false;}int temp = num;//将要判断的数值各位上的数字拆开放在集合中ArrayList list = new ArrayList();while (temp > 0){list.Add(temp % 10);temp /= 10;}//判断各位上的数字位数次⽅之后是否等于要判断是数,是的话则为⽔仙花数int sum = 0;foreach (int i in list){int mul = 1;for (int j = 0; j < list.Count; j++){mul *= i;}sum += mul;}return sum == num;}javascript +html 实现可变位数的运算<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><title>⽆标题⽂档</title><script type="text/javascript">function fun(){//取得参量位数var valnum=parseInt(document.frm.input.value);//求得符合参量位数的最⼤值和最⼩值var highnum=Math.pow(10,valnum)-1;var lownum=Math.pow(10,valnum-1);//输出队列的组成部分var output="共有个数:",res_str="";//a为i分解为的下脚值,num为符合规则的⽔仙花的个数var a=0,num=0;//遍历所有符合参量位数的数for(i=lownum;i<=highnum;i++){//res为⽔仙花数规则值,即n位的数的每位数的n次幂的和,预置为0var res=0;//分解出当前i的每位数并存如//求得⽔仙花数值res=Math.pow(parseInt(new_i[a]),valnum)+res;}//判断符合⽔仙花数的个数,如符合则将⽔仙花数并⼊输出队列if(res==i){num++;res_str=res_str+"<br>"+res;}}//输出队列if(valnum<3){output="你输⼊了⽆效位数!";}else{output=output+num+res_str;}//输出document.getElementById("divnum").innerHTML=output;}</script></head><body><form name="frm"><label>请输⼊⽔仙花的位数(N>=3):</label><input type="text" name="input" value=""> <input value="运算" type="button" onclick="fun()" /></form><div id="divnum" style=" position:absolute;left:100px;width:200px;top:100px;"></div> </body></html>asp 中实现的代码<%dim a,b,c,d,m,n,zi=1for i=100 to 999a=mid(i,1,1)b=mid(i,2,1)c=mid(i,3,1)d=a*a*am=b*b*bn=c*c*cz=d+m+nif z=i thenresponse.write z & "<br>"end ifnext%>Visual FoxPro ⽤表单实现法(只计3位)⽅法⼀,clearfor a=1 to 9for b=0 to 9for c=0 to 9x=a*100+b*10+cif x=a^3+b^3+c^3xendifendforendforendfor⽅法⼆,(1)创建 Form1并添加 Text1与 Command1(2)修改Command1的Caption属性为“计算并显⽰”(3)为Form1添加⽅法sxh(4)修改⽅法sxh代码如下para xx1=int(x%10)x2=int(x/10)%10return .t.elsereturn .f.endif(5)为Command1的编写如下的事件代码:thisform.currentx=thisform.width/2thisform.currenty=thisform.height/2thisform.print("⽔仙花数是:")for m=100 to 999thisform.text1.value=msure=thisform.sxh(m)if sure=.t.thisform.print(str(m,4)+space(3))inkey(0.5)endiffor 延迟=1 to 20000yiru=2008610029endforendforthis.enabled=.f.QBASIC⽔仙花数1—999999之间CLSFOR i = 1 TO 999999e$ = STR$(i)a$ = MID(e$, 1, 1)b$ = MID(e$, 2, 1)c$ = MID(e$, 3, 1)d$ = MID(e$, 4, 1)a = VAL(a$) ANDb = VAL(b$) ANDc = VAL(c$) ANDd = VAL(d$) IF i = a ^ 4 + b ^ 4 + c ^ 4 + d ^ 4 THEN PRINT i;NEXT iENDPB 实现的⽅法(只计3位数)int s,a,b,cfor s=100 to 999a=integer(s/100)b=integer((s - a*100)/10)c=s - integer(s/10)*10if s=a^3+b^3+c^3 thenmessagebox("",s)end ifnextActionScript实现的⽅法(只计3位数)var n:int;var m:int;for (var i:int=1; i<=9; i++) {for (var j:int=1; i<=9; j++) {for (var k:int=1; i<=9; k++) {m=i*100+j*10+k;if (m==i*i*i+j*j*j+k*k*k) {n++;trace(m);}}}}Delphi实现的⽅法(100-999)var a,b,c,d:integer;beginfor a:=100 to 999 doc:=a div 10 mod 10;d:=a mod 10;if b*b*b+c*c*c+d*d*d=a then memo1.Lines.Add(inttostr(a)) endend;MATLAB中实现的⽅法(100-999)for m=100:999m1=fix(m/100);m2=rem(fix(m/10),10);m3=rem(m,10);if m==m1^3+m2^3+m3^3disp(m)endend或者:Mathematica实现⽅法(可现不定位数解)n=Input["请输⼊⼤于2的⾃然数n:"];For[i=10^(n-1),i<10^n-1,i++,If[Total[IntegerDigits^IntegerLength]==i,Print]]添加⼀种C++的算法#include<iostream>#include<cmath>using namespace std;void main(){int a,b,c,e,f,g;double d;b=1;f=0;a=100;e=0;c=g=a;A:do{a/=10;b++;}while(a>10);do{d=g%10;g/=10;e+=pow(d,b);f++;}while(f!=b+1);if(e==c){cout<<c<<"\n";c++;a=g=c;b=1;f=0;e=0;goto A;}else{c++;a=g=c;b=1;f=0;e=0;goto A;}}BASH 脚本实现计算100-999之内数dofor (( b=0; b<10; b++ ))dofor (( c=0; c<10; c++ ))donumber1=$((a*100+b*10+c))number2=$((a**3+b**3+c**3))if [ $number1 -eq $number2 ]; thenecho "Found number $number1"fidonedonedone易语⾔代码求指定范围内⽔仙花数.版本 2.⼦程序取出⽔仙花数, 整数型, , 返回范围内⽔仙花数个数,如果范围过⼤将会⼗分耗时.参数起始数字, 整数型, , 从此数开始判断是否为⽔仙花数.参数结束数字, 整数型, , 此数必须⼤于起始数字.参数保存得到⽔仙花数的数组, 整数型, 可空数组.局部变量数字数组, ⽂本型, , "0".局部变量⽔仙花数, 整数型, , "0".局部变量总和, 整数型.局部变量计次, 整数型.局部变量计次2, 整数型.如果真 (起始数字 > 结束数字)清除数组 (保存得到⽔仙花数的数组)返回 (0).如果真结束.变量循环⾸ (起始数字, 结束数字, 1, 计次).计次循环⾸ (取⽂本长度 (到⽂本 (计次)), 计次2)加⼊成员 (数字数组, 取⽂本中间 (到⽂本 (计次), 计次2, 1))处理事件 ().计次循环尾 ().计次循环⾸ (取数组成员数 (数字数组), 计次2)总和 = 总和 + 求次⽅ (到数值 (数字数组 [计次2]), 取⽂本长度 (到⽂本 (计次)))处理事件 ().计次循环尾 ().如果真 (总和 = 计次)加⼊成员 (⽔仙花数, 计次).如果真结束处理事件 ().变量循环尾 ()保存得到⽔仙花数的数组 = ⽔仙花数返回 (取数组成员数 (⽔仙花数))vb代码判断⽔仙花数Dim a() As Integern = InputBox("请输⼊⼀个n位正整数" & Chr(10) & "n⼤于等于3", "⽔仙花数", 153) Dim i As Integerm = Len(n)ReDim a(1 To m) As IntegerFor i = 1 To ma(i) = Val(Mid(n, i, 1))Next iFor i = 1 To ms = a(i) ^ m + sNext iIf s = Val(n) ThenMsgBox "是⽔仙花数"ElseMsgBox "不是⽔仙花数"End If再加⼀种C语⾔⽅法:#include <math.h>int main(){unsigned long fr,to,n,m,k,sum;int nLog,numlen,brPoint=1;//输⼊100~约4000000000(unsigned long)间的范围printf("Input Number Range ('from' 'to'):"); scanf("%lu %lu",&fr,&to);for(n=fr;n<=to;n++){//算出n有多少位nLog = log10(n);numlen = floor(nLog)+1;//数n 的各位数字的位数次幂的和m=n;sum=0;while(m>0){k=m%10;sum+=pow(k,numlen);m=m/10;}//若是⽔仙花数,输出。
c语言水仙花数是指一个n位正整数(n≥3),它的每个位上的数字的n次幂之和等于它本身
您好!
C语言输出水仙花数的具体分析和实现流程如下:
1、水仙花数的含义
“水仙花数”是一个三位数其各位数字的立方和等于该数本身。
例如:3^3 + 7^3+ 0^3 = 370
2、算法分析
把给出的某个三位数的个位、十位、百位分别拆分,并求其立方和(设为sum),若sum与给出的三位数相等,则为“水仙花数”。
3、算法设计
“水仙花数”是一个三位数,可以确定该数的取值范围是100〜999。
对应的循环条件如下:
for (n=10; n<1000; n++) {}
将n整除以100,得出n在百位上的数字h。
将(n-i*100)整除以10, 得出n在十位上的数字t。
将n对10取余,得出n在个位上的数字a。
求得h,t,a 三个数字的立方和是否与n相等,如果相等则证明该数为水仙花数。
4、代码实现
#include <stdio.h>
int main() {
int h, t, a, n;
printf("result is:");
for ( n=100; n<1000; n++ ) { /*整数的取值范围*/
h = n / 100;
t = (n-h*100) / 10;
a = n % 10;
if (n == h*h*h + t*t*t + a*a*a) /*各位上的立方和是否与原数n相等*/ printf("%d ", n);}
printf("\n");
return 0;}
——内容选自网络,仅供参考。
c语言水仙花数的解题思路
c语言水仙花数的解题思路
摘要:
I.引言
- 介绍水仙花数的概念
- 说明用C 语言解决水仙花数的意义
II.水仙花数的性质
- 定义水仙花数
- 分析水仙花数的性质
- 总结水仙花数的特征
III.C 语言解决水仙花数的思路
- 算法一:暴力枚举法
- 算法二:数学归纳法
- 算法三:动态规划法
- 比较三种算法的优劣
IV.C 语言实现
- 实现算法一
- 实现算法二
- 实现算法三
- 总结实现过程
V.结论
- 总结C 语言解决水仙花数的方法
- 展望水仙花数问题的未来研究方向
正文:
I.引言
水仙花数,是指一个三位数,其各位数字的立方和等于该数本身。
C语言 水仙花数(循环)
2 100 120
300 380
输出样例
no 370 371
答案:LDD #include <stdio.h> int main() {
int x,m,n,i,j,a1,a2,a3,b,sum; scanf("%d",&x); for(i=1;i<=x;i++) {
b=0; scanf("%d%d",&m,&n); for(j=m;j<=n;j++) {
a1=j/100; a2=j/10%10; a3=j%10; sum=a1*a1*a1+a2*a2*a2+a3*a3*a3; if(j==sum) {printf("%d ",j);
b++;} } if(b==0)
printf("no"); printf("\n"); }
return 0; }
输入
输入数据有多组,每组占一行,包括两个整数 m 和 n(100<=m<=n<=999)。
输出
对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙 花数必须大于等于 m,并且小于等于 n,如果有多个,则要求从小到大排列在一行内 输出,每个数后有空格; 如果给定的范围内不存在水仙花数,则输出 no; 每个测试实例的输出占一行。
084
内存限制: 32768 K 字节
总提次数: 1273 次
成功提交次数: 633 次
判题规则: 严格比较
问题描述
春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这 样定义的: “水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如: 153=1^3+5^3+3^3。 现在要求输出所有在 m 和 n 范围内的水仙花数。
C++语法的水仙花数
//1.先打印所有三位数字 int num = 100; dБайду номын сангаас {
//2.所有三位数字中找到水仙花数 int a = 0; //个位 int b = 0; //十位 int c = 0; //百位 a = num % 10; //获取个位数 b = num / 10 % 10; //获取数字的十位 c = num / 100; //获取数字的百位 if (a*a*a + b * b*b + c * c*c == num) //如果是水仙花数,才打印 {
水仙花数是指一个3位数它的每个位上的数字的3次幂之和等于它本身
C++语 法 的 水 仙 花 数
练习案例:水仙花数
案例描述:水仙花数是 指一个3位数,它的每个位上的数字 的3次幂之和等于它本身 例如:1^3+5^3+3^3=153 请利用do.....while语句,求出所有3位数中的水仙花数。 代码示例:
cout << num << endl; }
num++; } while (num < 1000); return 0; }
c语言水仙花数的解题思路
c语言水仙花数的解题思路摘要:I.引言- 介绍水仙花数的概念- 说明解题思路的背景和意义II.水仙花数的定义和性质- 定义水仙花数- 阐述水仙花数的性质III.解题思路- 分析水仙花数的组成- 设计计算方案- 编写C 语言程序实现计算IV.程序实现- 详细说明程序的实现过程- 给出完整的C 语言代码V.总结- 总结解题思路和程序实现- 提出优化方案和展望正文:I.引言水仙花数,也被称为阿姆斯特朗数,是指一个三位数,其各位数字的立方和等于该数本身。
例如,153 是一个水仙花数,因为1^3 + 5^3 + 3^3 = 153。
水仙花数是一种特殊的三位数,具有很高的数学价值和趣味性。
在本文中,我们将介绍如何使用C 语言来求解水仙花数的问题。
II.水仙花数的定义和性质水仙花数是一种特殊的三位数,其各位数字的立方和等于该数本身。
例如,153 是一个水仙花数,因为1^3 + 5^3 + 3^3 = 153。
根据这个定义,我们可以知道,水仙花数的每一位数字都是不同的。
此外,由于0 的立方等于0,所以水仙花数的百位数字不能为0。
根据这些性质,我们可以进一步分析水仙花数的组成。
III.解题思路要解决水仙花数的问题,我们需要设计一个计算方案。
首先,我们需要遍历所有可能的三位数,然后计算每个数的各位数字的立方和。
如果各位数字的立方和等于该数本身,那么这个数就是一个水仙花数。
为了提高计算效率,我们可以先判断每个数的百位数字是否为0,如果为0,则可以直接跳过。
此外,我们还可以使用C 语言的特性,如循环和条件语句,来简化程序的实现。
IV.程序实现下面是使用C 语言实现求解水仙花数的程序:```c#include <stdio.h>int main() {int m, n, i, sum;scanf("%d %d", &m, &n);for (i = m; i <= n; i++) {if (i / 100 == 0) {continue;}sum = i * i * i + i / 10 * i / 10 * i / 10 + i % 10 * i % 10 * i % 10;if (sum == i) {printf("%d", i);}}return 0;}```程序首先从用户输入中读取两个整数m 和n,表示需要查找的范围。
水仙花数实验报告
一、实验目的1. 了解水仙花数的概念及其特性。
2. 掌握C语言编程解决实际问题的方法。
3. 提高逻辑思维和编程能力。
二、实验原理水仙花数(Narcissistic number)又称为自恋数、自幂数、阿姆斯壮数(Armstrong number),它是指一个n位数,其各位数字的n次方和等于该数本身。
例如:153是一个三位数,其各位数字的立方和等于153,即1^3 + 5^3 + 3^3 = 153。
三、实验内容1. 编写C语言程序,找出1000以内的所有水仙花数。
2. 分析程序运行过程,总结水仙花数的规律。
四、实验步骤1. 创建一个新的C语言项目,命名为“水仙花数探究”。
2. 在项目中创建一个名为“main.c”的源文件。
3. 在“main.c”文件中编写以下代码:```c#include <stdio.h>#include <math.h>int main() {int num, hun, ten, ge, sum;for (num = 100; num < 1000; num++) {hun = num / 100; // 百位数ten = (num % 100) / 10; // 十位数ge = num % 10; // 个位数if (pow(hun, 3) + pow(ten, 3) + pow(ge, 3) == num) {printf("%d\n", num);}}return 0;}```4. 编译并运行程序,观察输出结果。
五、实验结果与分析1. 运行程序后,输出以下水仙花数:1533703714072. 分析程序运行过程,总结水仙花数的规律:(1)水仙花数一定是一个三位数。
(2)对于任意一个三位数,可以通过拆分百位、十位和个位数字,计算其各位数字的立方和,然后判断是否等于原数。
(3)在1000以内的所有水仙花数中,个位数字只能是0、1、5、6、7、8、9。
c语言水仙花数的概念 -回复
c语言水仙花数的概念-回复C语言水仙花数的概念导语:数学中有许多有趣的现象和规律,其中之一就是水仙花数。
水仙花数是指一个n位正整数(n≥3),它的每个位上的数字的n次幂之和等于它本身。
1. 水仙花数的定义水仙花数,又称为阿姆斯特朗数,是指一个n位正整数(n≥3),它的每个位上的数字的n次幂之和等于它本身。
例如,153就是一个水仙花数,因为1^3 + 5^3 + 3^3 = 153。
水仙花数的概念最早可以追溯到20世纪初的一位名叫D. R. Kaprekar的数学家提出。
2. 水仙花数的特性根据水仙花数的定义,我们可以发现它有一些特性。
首先,水仙花数一定是一个正整数。
其次,水仙花数的位数n大于等于3,即至少有三位数字。
最后,水仙花数的每一位数字的n次幂之和等于它本身。
这些特性是判断一个数是否为水仙花数的基础。
3. 水仙花数的解法要找到水仙花数,我们需要遍历所有的n位数字,然后判断每个数字是否符合水仙花数的定义。
在C语言中,我们可以使用循环结构和条件语句来实现这个过程。
首先,我们可以使用两个嵌套的for循环生成所有可能的n位数字。
外层循环控制千位数字的取值范围,内层循环控制百位和十位数字的取值范围。
例如,如果我们要找的是3位数字,那么我们可以使用如下的代码:int i, j, k;for (i = 1; i <= 9; i++) {for (j = 0; j <= 9; j++) {for (k = 0; k <= 9; k++) {判断是否为水仙花数}}}在内层循环中,我们可以使用条件语句来判断每个数字是否符合水仙花数的定义。
我们可以用一个临时变量temp来保存每一位数字的n次幂之和,然后与当前数字比较。
如果相等,则说明该数是水仙花数。
int temp = pow(i, 3) + pow(j, 3) + pow(k, 3);if (temp == 100 * i + 10 * j + k) {打印水仙花数}4. 优化水仙花数的解法上述的解法虽然能够找到所有的水仙花数,但在计算时可能会浪费一些时间。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2615
2717
2819
2921
3024
3126
3229
3332
---------
3434
3535
3636
3737
3838
3939
---------
*/
//int count_digit[10]={0}; //count_digit[10]用来得到0-9数字出现的个数
int p[10][N]={0};//p数组用来计算出0-9的N次方。
{
count_mul_power[i][j]=p[1][j]*i[i];
}
*/
count_mul_power[1][j]=p[1][j]*count_digit1;
count_mul_power[2][j]=p[2][j]*count_digit2;
count_mul_power[3][j]=p[3][j]*count_digit3;
对满足条件[*]的一个特定的十元组(k 0 ,k 1 ,...,k 9 )*,即可确定唯一的一个Nar(n).
[定理]
0. MIN(n)<Nar(n)<MAX(n)
1. n>60,Nar(n)不存在.
2.对满足条件[*]的一个特定的十元组(k 0 ,k 1 ,...,k 9 )*,确定唯一的一个Nar(n).
timeinfo->tm_min,
timeinfo->tm_sec);
/*
打印tm,tm_year从1900年计算,所以要加1900,
月tm_mon,从0计算,所以要加1 */
}
/**
对不定方程的一组解进行判断:是否为水仙花数
narcissus_check(count_digit0,count_digit1,count_digit2,count_digit3,count_digit4,count_digit5,count_digit6,count_digit7,count_digit8,count_digit9);
东海陈光剑剑魔书仙读书录
2013.4.28 @ iSoftStone
[参数说明]
N(n):n位十进制正整数N(n)
MAX(n):n位十进制正整数最大值10 n -1
MIN(n):n位十进制正整数最大值10 n-1
Nar(n):n位十进制正整数中的水仙花数
b n-1,b n-2,...,b 1,b 0:N(n)各位十进制数位上的数字,显然b n-1>0.
count_digit7--数字7出现的次数
count_digit8--数字8出现的次数
count_digit9--数字9出现的次数
*/
void narcissus_check(int count_digit0,int count_digit1,int count_digit2,int count_digit3,int count_digit4,int count_digit5,int count_digit6,int count_digit7,int count_digit8,int count_digit9) //检测数字是不是水仙花数
count_mul_power[4][j]=p[4][j]*count_digit4;
count_mul_power[5][j]=p[5][j]*count_digit5;
count_mul_power[6][j]=p[6][j]*count_digit6;
count_mul_power[7][j]=p[7][j]*count_digit7;
case 9:j9++;break;
}
}
/*如果一个数字,和里0-9出现的次数与这个数字里0-9出现的次数相同,那么和就应该是水仙花数(第一位数字不能为0)*/
if((count_digit0==j0)&&(count_digit1==j1)&&(count_digit2==j2)&&(count_digit3==j3)&&(count_digit4==j4)&&(count_digit5==j5)&&(count_digit6==j6)&&(count_digit7==j7)&&(count_digit8==j8)&&(count_digit9==j9)&&(sum_power[0]!=0)) //第一位数字非零!
时间类型(time.h定义)
struct tm --时间结构,time.h定义如下:
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
*/
k 0 *0^n + k 1 *1^n + ...+ k 9 * 9^n =T(n)
2.1判断T(n)是否满足定理[0],if YES ,goto 2.2; else Next S(j+1);
2.2判断T(n)中各位数字上的0,1,2,3,...,9的个数是否恰好等于Sj=(k 0 ,k 1 ,...,k 9 ).
struct tm* timeinfo;
time( &my_time );//获取时间,以秒计,从1970年1月一日起算,存于my_time
timeinfo = localtime( &my_time );//转为当地时间,tm时间结构
//printf ( "\007The current date is: %s", asctime (timeinfo) );
/**
水仙花数算法研究及其C语言代码实现
'BnBn-1...B1'=X(N)= sum{ digit = 0..9, count_digit[digit] * power(digit, N)}
@author东海陈光剑剑魔书仙读书录
水仙花数的相关数学证明及其算法&源程序实现
The Computer Solution Of Narcissistic Number & Mathematical Proofs
3.不定方程k 0 + k 1 +...+ k 9 = n非负整数解十元组Sj的个数为C{10+n-1,10-1}=C{9+n,9}= (9+n)!/[(9!)(n!)]组.
[算法描述]
Step1.求解不定方程k 0 + k 1 +...+ k 9 = n所有的非负整数解S集.
Step2.对每个解Sj计算
int count_mul_power[10][N]={0}; //count_mul_power用来计算数字出现次数乘以它的N次方
//int count=0; //计算得到几个水仙花数了,得到2个以后就结束程序
void init_power() //这个函数用来获得0-9的N次方,存在p数组里
{
int i,j,k;
count_mul_power[i][j] %=10; /// ????
}
for(i=0;i<10;i++) //
for(j=N-1;j>=0;j--)
sum_power[j]+=count_mul_power[i][j]; //求得水仙花数的右边表达式的值sum_power[N]
//此时数组sum_power[N]记录的是1-N位自然数的水仙花右边表达式的值
for(i=N-1;i>0;i--) //剥离数字各个数位(第N位-第1位)上的数字
{
sum_power[i-1]+=sum_power[i]/10; //取第N-1位----第1位上的数字
sum_power[i] %=10; //取得右边表达式算出来的值的:第1到N位上的数字,存储在数组sum_power[N]中
for(i=0;i<10;i++)
p[i][N-1]=i; //矩阵每行全部初始化为(0,1,2,3,4,5,6,7,8,9)
for(k=2;k<10;k++)
{
for(i=1;i<N;i++)
{
for(j=N-1;j>=0;j--)
{
p[k][j]*=k; //计算k=0-9的N次方p[i][N]=i^N
}Байду номын сангаас
int j1=0,j2=0,j3=0,j4=0,j5=0,j6=0,j7=0,j8=0,j9=0,j0=0;
for(i=N-1;i>=0;i--) //对N位数各个数位进行循环:计数统计(即sum(count_count_digit[i]*i^N),i=0-9 )里面每个数字出现的次数
{
switch(sum_power[i]) //
{
int i,j;
int sum_power[N]={0};//对应N位大数X(N)上第1位到第N位上的数字
//把数字0-9出现次数乘以它的N次方,存在count_mul_power[10][N]数组中
//数字i: i^N乘以数字i出现的次数
for(j=0;j<N;j++)
{
/*for(i=1;i<=9;i++)
k 0 ,k 1 ,...,k 9 : N(n)中数字0,1,2,...,9分别总计出现的次数.