七种方法求水仙花数
- 格式:doc
- 大小:533.50 KB
- 文档页数:24
/*(编程题)花朵数一个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);}。
1、功能描述求100到任意一个数之间的所有水仙花数。
水仙花数是指一个n 位数( n≥3 ),它的每个位上的数字的n 次幂之和等于它本身。
2、解决方法①、先确定这个数。
②、确定这个数的位数。
③、分成的每个数的n次幂之和与该书比较,若相等就为水仙花数。
若不相等,则选取下一个数进行上述算法。
3、串行算法public int sum(){for(int fanlei_i=fanlei_start;fanlei_i<=fanlei_end;fanlei_i++){if(isdaf(fanlei_i)==1){System.out.println("水仙花数:"+fanlei_i);fanlei_sum=fanlei_sum+1;}}return fanlei_sum;}public int getSum(){return fanlei_sum;}//求水仙花数的方法public int isdaf(int fanlei_n){fanlei_d=new int[20];int fanlei_i,fanlei_t,fanlei_c=0,fanlei_s=0;fanlei_t = fanlei_n;while(fanlei_t>0){fanlei_d[fanlei_c] = fanlei_t % 10;fanlei_t = fanlei_t / 10;fanlei_c++;}for(fanlei_i=0;fanlei_i<fanlei_c;fanlei_i++)fanlei_s += Math.pow(fanlei_d[fanlei_i],fanlei_c);if(fanlei_s == fanlei_n)return 1;elsereturn 0;}4、并行算法public void run(){for(int fanlei_i=fanlei_start;fanlei_i<=fanlei_end;fanlei_i+=2){if(isdaf(fanlei_i)==1){System.out.println("水仙花数:"+fanlei_i);fanlei_sum=fanlei_sum+1;}}}public int isdaf(int fanlei_n){fanlei_d=new int[20];int fanlei_i,fanlei_t,fanlei_c=0,fanlei_s=0;fanlei_t = fanlei_n;while(fanlei_t>0){fanlei_d[fanlei_c] = fanlei_t % 10;fanlei_t = fanlei_t / 10;fanlei_c++;}for(fanlei_i=0;fanlei_i<fanlei_c;fanlei_i++)fanlei_s += Math.pow(fanlei_d[fanlei_i],fanlei_c);if(fanlei_s == fanlei_n)return 1;elsereturn 0;}5、代码及注释public class And extends Thread{private int fanlei_start;private int fanlei_end;private int fanlei_sum=0;private int fanlei_d[];public And(int fanlei_start,int fanlei_end){super();this.fanlei_start=fanlei_start;this.fanlei_end=fanlei_end;}public void run(){for(int fanlei_i=fanlei_start;fanlei_i<=fanlei_end;fanlei_i+=2){if(isdaf(fanlei_i)==1){System.out.println("水仙花数:"+fanlei_i);fanlei_sum=fanlei_sum+1;}}}public int sum(){for(int fanlei_i=fanlei_start;fanlei_i<=fanlei_end;fanlei_i++){if(isdaf(fanlei_i)==1){System.out.println("水仙花数:"+fanlei_i);fanlei_sum=fanlei_sum+1;}}return fanlei_sum;}public int getSum(){return fanlei_sum;}//求水仙花数的方法public int isdaf(int fanlei_n){fanlei_d=new int[20];int fanlei_i,fanlei_t,fanlei_c=0,fanlei_s=0;fanlei_t = fanlei_n;while(fanlei_t>0){fanlei_d[fanlei_c] = fanlei_t % 10;fanlei_t = fanlei_t / 10;fanlei_c++;}for(fanlei_i=0;fanlei_i<fanlei_c;fanlei_i++)fanlei_s += Math.pow(fanlei_d[fanlei_i],fanlei_c);if(fanlei_s == fanlei_n)return 1;elsereturn 0;}public static void main(String[] args) throws InterruptedException{And thread1=new And(100,1000000);And thread2=new And(101,1000000);long startTime=System.currentTimeMillis();thread1.start();thread2.start();thread1.join();thread2.join();long endTime=System.currentTimeMillis();System.out.println("并行水仙花总数="+(thread1.getSum()+thread2.getSum()));System.out.println("并行时间="+(endTime-startTime));System.out.println("************100W**************");startTime=System.currentTimeMillis();And serial=new And(100,1000000);int fanlei_sum=serial.sum();endTime=System.currentTimeMillis();System.out.println("串行水仙花总数="+fanlei_sum);System.out.println("串行时间="+(endTime-startTime));}}6、执行结果7、加速比分析加速比为:934/541=1.726432。
c语言函数求水仙花数-回复如何用C语言编写一个函数来求解水仙花数。
什么是水仙花数?水仙花数是指一个三位数,其各位数字的立方和等于该数本身。
例如,153是一个水仙花数,因为1的立方加上5的立方加上3的立方等于153。
在C语言中,我们可以通过编写一个函数来判断一个数字是否为水仙花数。
下面是具体的实现步骤:步骤一:创建函数首先,我们需要创建一个名为isArmstrongNumber()的函数,用来判断一个数字是否为水仙花数。
函数的返回类型为int,参数为待判断的数字。
函数的代码如下:int isArmstrongNumber(int num){TODO: 判断数字是否为水仙花数}步骤二:提取各位数字在函数中,我们需要将参数num拆分为其各位数字,并计算其立方和。
为了提取一个三位数的各位数字,我们可以使用取模和整除操作。
具体的代码如下:int isArmstrongNumber(int num){int originalNum, remainder, result = 0;originalNum = num;while (originalNum != 0){remainder = originalNum 10;result += remainder * remainder * remainder;originalNum /= 10;}TODO: 判断数字是否为水仙花数}在上述代码中,originalNum变量用于保存待判断数字的原始值。
remainder变量用于保存每个位数上的数字。
result变量用于计算各位数字的立方和。
步骤三:判断是否为水仙花数在提取完各位数字并计算立方和后,我们需要比较该立方和与原始数值是否相等。
如果相等,则表示该数字为水仙花数。
在isArmstrongNumber()函数中,我们可以添加一个if语句来进行判断。
具体的代码如下:int isArmstrongNumber(int num){int originalNum, remainder, result = 0;originalNum = num;while (originalNum != 0){remainder = originalNum 10;result += remainder * remainder * remainder;originalNum /= 10;}if (result == num){return 1; 是水仙花数}else{return 0; 不是水仙花数}}在上述代码中,我们使用if语句判断result和num是否相等。
E-mail文化传播网水仙花数水仙花数外文名narcissistic number。
指的是:在自然数中,如果一个三位数等于其自身各个数字的立方和,那么这个三位数就称为“水仙花数”。
后来,水仙花数又发展称为阿姆斯特朗数,是指一个 n 位数( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。
所以就有四位水仙花数、五位水仙花数、六位水仙花数。
等等。
实际上这只是自幂数的一种数。
严格来说三位数的3次幂数才是水仙花数。
(例如:1³+ 5³+ 3³ = 153)在数论中,水仙花数,也被称为超完全数字不变数、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong nmber),用来描述一个N位非负整数,其各个位数字的N次方和等于该数本身。
若将条件放宽,一个N位数,其各个数之M次方和等于该数,(M和N不一定相等)这样的数称为完全数字不变量(perfect digital invariant),水仙花数一定是完全数字不变量,但完全数字不变量不一定是水仙花数。
阿姆斯特朗数只是自幂数的一种,严格来说三位数的3次幂数才成为水仙花数。
其他位数的自幂数名字一位自幂数:独身数两位自幂数:没有三位自幂数:水仙花数四位自幂数:四叶玫瑰数五位自幂数:五角星数六位自幂数:六合数七位自幂数:北斗七星数八位自幂数:八仙数九位自幂数:九九重阳数十位自幂数:十全十美数常见的阿姆斯特朗数。
三位的水仙花数共有4个:153,370,371,407;四位的水仙花数共有3个:1634,8208,9474;五位的水仙花数共有3个:54748,92727,93084;六位的水仙花数只有1个:548834;七位的水仙花数共有4个:1741725,4210818,9800817,9926315;八位的水仙花数共有3个:24678050,24678051到目前为止,已知的自然数中,只有四个水仙花数,它们分别是: 153、370、371、407153=1³+5³+3³370=3³+7³+0³371+3³+7³+1³407=4³+0³+7³完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。
水仙花数是指一个n位正整数(n≥3),它的每个位上的数字的n 次幂之和等于它本身。
例水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。
例如:153=13+53+33。
本题要求编写程序,计算所有N位水仙花数。
输入格式:输入在一行中给出一个正整数N(3≤N≤7)。
输出格式:按递增顺序输出所有N位水仙花数,每个数字占一行。
输入样例:3输出样例:153370371407这个问题最重要的思路就是如何把各个位置的数字拿出来!#include <stdio.h>int pow(int x, int n);int main(){int N, bit, sum = 0; // bit:每一位scanf("%d", &N);// pow(10, N-1):是下界 pow(10, N):是上界 for( int i=pow(10, N-1); i<pow(10, N); i++ ){ int x = i;while( x ){ // 取各位,求和bit = x % 10;sum += pow(bit, N);x /= 10;}if( sum == i )printf("%d\n", i);sum = 0; // 重置sum为0,便于下次计算}return 0;}// 手写pow,防止超时int pow(int x, int n){int sum = 1;for( int i=0; i<n; i++ ){sum *= x;}return sum;}。
一个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分钟内运行完毕。
#include<iostream>#include<string.h>#include<math.h>#include <time.h>using namespace std;void mc(int*b,int *a);void f(int *s,int n);void g(int *f,int *a);int main(){int k=0;int f1[10][21];memset(f1,0,sizeof(f1));int f2[10][21];memset(f2,0,sizeof(f2));int a[10],b[10];memset(a,0,sizeof(a));memset(b,0,sizeof(b));int h[21];memset(h,0,sizeof(h));int y[21]={-1};bool th =true;for(int i=0;i<10;i++){f1[i][0]=i;f(f1[i],21);}clock_t begin_time, end_time;begin_time= clock();for( a[0]=0;a[0]<21;a[0]++)for( a[1]=0;a[1]<21-a[0];a[1]++)for( a[2]=0;a[2]<21-a[0]-a[1];a[2]++)for( a[3]=0;a[3]<21-a[2]-a[0]-a[1];a[3]++)for( a[4]=0;a[4]<21-a[3]-a[2]-a[1]-a[0];a[4]++)for( a[5]=0;a[5]<21-a[4]-a[3]-a[2]-a[1]-a[0];a[5]++)for( a[6]=0;a[6]<21-a[5]-a[4]-a[3]-a[2]-a[1]-a[0];a[6]++)for( a[7]=0;a[7]<21-a[6]-a[5]-a[4]-a[3]-a[2]-a[1]-a[0];a[7]++)for( a[8]=0;a[8]<21-a[7]-a[6]-a[5]-a[4]-a[3]-a[2]-a[1]-a[0];a[8]++){a[9]=21-a[0]-a[1]-a[2]-a[3]-a[4]-a[5]-a[6]-a[7]-a[8];if(a[9]<=0||a[9]>9)continue;int gh;for(int i=0;i<10;i++){gh=0;for(int j=0;j<21;j++){int t=f1[i][j]*a[i]+gh;f2[i][j]=t%10;gh=t/10;}}for(i=0;i<10;i++){g(f2[i],h);}mc(b,h);for(i=0;i<10;i++){if(b[i]!=a[i]){th =false;break;}}if(th ==true){/*cout<<endl;for(i=0;i<10;i++)cout<<a[i];cout<<endl;for(i=0;i<10;i++)cout<<b[i];cout<<endl;*/for(i=20;i>=0;i--)cout<<h[i];cout<<endl;}th =true;memset(b,0,sizeof(b));memset(h,0,sizeof(h));memset(f2,0,sizeof(f2));}end_time = clock();printf("\nTime elapsed:%.3lf (ms)\n",(double)(end_time-begin_time)); return 0;}void mc(int*b,int *a){for(int i=0;i<21;i++){int n=a[i];switch(n){case 0:b[0]++;break;case 1:b[1]++;break;case 2:b[2]++;break;case 3:b[3]++;break;case 4:b[4]++;break;case 5:b[5]++;break;case 6:b[6]++;break;case 7:b[7]++;break;case 8:b[8]++;break;case 9:b[9]++;break;}}}void f(int *s,int n){ int c=fabs(s[0]),h=0;for(int i=0;i<20;i++){ h=0;for(int j=0;j<21;j++) {int t=fabs(s[j])*c+h;s[j]=t%10;h=t/10;}}}void g(int *f,int *a){int c=0;for(int i=0;i<21;i++) {int t=f[i]+a[i]+c;a[i]=t%10;c=t/10;#include<iostream>#include<string.h>#include<math.h>#include <time.h>using namespace std; void mc(int*b,int *a); void f(int *s,int n);void g(int *f,int *a);int main(){int k=0;int f1[10][21]; memset(f1,0,sizeof(f1)); int f2[10][21]; memset(f2,0,sizeof(f2)); int a[10],b[10]; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); int h[21];memset(h,0,sizeof(h)); int y[21]={-1};bool th =true;for(int i=0;i<10;i++){f1[i][0]=i;f(f1[i],21);}clock_t begin_time, end_time;begin_time= clock();for( a[0]=0;a[0]<21;a[0]++)for( a[1]=0;a[1]<21-a[0];a[1]++)for( a[2]=0;a[2]<21-a[0]-a[1];a[2]++)for( a[3]=0;a[3]<21-a[2]-a[0]-a[1];a[3]++)for( a[4]=0;a[4]<21-a[3]-a[2]-a[1]-a[0];a[4]++)for( a[5]=0;a[5]<21-a[4]-a[3]-a[2]-a[1]-a[0];a[5]++)for( a[6]=0;a[6]<21-a[5]-a[4]-a[3]-a[2]-a[1]-a[0];a[6]++)for( a[7]=0;a[7]<21-a[6]-a[5]-a[4]-a[3]-a[2]-a[1]-a[0];a[7]++)for( a[8]=0;a[8]<21-a[7]-a[6]-a[5]-a[4]-a[3]-a[2]-a[1]-a[0];a[8]++){a[9]=21-a[0]-a[1]-a[2]-a[3]-a[4]-a[5]-a[6]-a[7]-a[8];if(a[9]<=0||a[9]>9)continue;int gh;for(int i=0;i<10;i++){gh=0;for(int j=0;j<21;j++){int t=f1[i][j]*a[i]+gh;f2[i][j]=t%10;gh=t/10;}}for(i=0;i<10;i++){g(f2[i],h);}mc(b,h);for(i=0;i<10;i++){if(b[i]!=a[i]){th =false;break;}}if(th ==true){/*cout<<endl;for(i=0;i<10;i++)cout<<a[i];cout<<endl;for(i=0;i<10;i++)cout<<b[i];cout<<endl;*/for(i=20;i>=0;i--)cout<<h[i];cout<<endl;}th =true;memset(b,0,sizeof(b));memset(h,0,sizeof(h));memset(f2,0,sizeof(f2));}end_time = clock();printf("\nTime elapsed:%.3lf (ms)\n",(double)(end_time-begin_time)); return 0;}void mc(int*b,int *a){for(int i=0;i<21;i++){int n=a[i];switch(n){case 0:b[0]++;break;case 1:b[1]++;break;case 2:b[2]++;break;case 3:b[3]++;break;case 4:b[4]++;break;case 5:b[5]++;break;case 6:b[6]++;break;case 7:b[7]++;break;case 8:b[8]++;break;case 9:b[9]++;break;}}}void f(int *s,int n){ int c=fabs(s[0]),h=0;for(int i=0;i<20;i++){ h=0;for(int j=0;j<21;j++){int t=fabs(s[j])*c+h;s[j]=t%10;h=t/10;}}}void g(int *f,int *a){int c=0;for(int i=0;i<21;i++){int t=f[i]+a[i]+c;a[i]=t%10;c=t/10;}}#include <sstream>#include <iostream>#include <cstdlib>#include <ctime>using namespace std;template<class T> string tostring(T a){ostringstream os;os<<a;return os.str();} #define N 21typedef pair<long long,long long> NUM;#define MOD 1000000000000000LL;NUM pow21[10][N+1];int sump[10][N+1];void init(){for(int i=0;i<10;i++)for(int j=0;j<=N;j++)sump[i][j]=i*j;for(int i=0;i<10;i++){pow21[i][0].first=pow21[i][0].second=0;}pow21[0][1].first=pow21[0][1].second=0;for(int i=1;i<10;i++){pow21[i][1].first=1;pow21[i][1].second=0;for(int j=0;j<N;j++){pow21[i][1].first*=i;pow21[i][1].second*=i;pow21[i][1].second+=pow21[i][1].first/MOD; pow21[i][1].first%=MOD;}}for(int j=2;j<=N;j++){for(int i=0;i<10;i++){pow21[i][j].first=j*pow21[i][1].first;pow21[i][j].second=j*pow21[i][1].second; pow21[i][j].second+=pow21[i][j].first/MOD; pow21[i][j].first%=MOD;}}}int numct[10],numct2[10];void print(NUM t){string s=tostring(t.first);s=string(15-s.size(),'0')+s;cout<<t.second<<s<<endl;}void check(NUM sum){sum.second+=sum.first/MOD;sum.first%=MOD;if(sum.second<100000||sum.second>=1000000)return; memset(numct2,0,sizeof(numct2));long long t=sum.first;for(int i=0;i<15;i++){numct2[t%10]++;t/=10;}t=sum.second;for(int i=0;i<6;i++){numct2[t%10]++;t/=10;}if(memcmp(numct,numct2,sizeof(numct))==0)print(sum);}void dfs(int k,int remain,NUM sum,int sum2){if(k==2){if((sum.first+sum.second-sum2)%9!=0)return;}if(k==0){numct[0]=remain;check(sum);return;}NUM newsum;for(numct[k]=remain;numct[k]>=0;numct[k]--){newsum.first=sum.first+pow21[k][numct[k]].first; newsum.second=sum.second+pow21[k][numct[k]].second; dfs(k-1,remain-numct[k],newsum,sum2+sump[k][numct[k]]); }}int main(){int cl=clock();init();dfs(9,N,pair<long long,long long>(),0);cout<<"TIME::"<<clock()-cl<<"ms"<<endl;cin>>cl;return 0;}#include<string.h>#include<math.h>#include <time.h>using namespace std;void mc(int*b,int *a);void f(int *s,int n);void g(int *f,int *a);int main(){int k=0;int f1[10][21];memset(f1,0,sizeof(f1));int f2[10][21];memset(f2,0,sizeof(f2));int a[10],b[10];memset(a,0,sizeof(a));memset(b,0,sizeof(b));int h[21];memset(h,0,sizeof(h));int y[21]={-1};bool th =true;for(int i=0;i<10;i++){f1[i][0]=i;f(f1[i],21);}clock_t begin_time, end_time;begin_time= clock();for( a[0]=0;a[0]<21;a[0]++)for( a[1]=0;a[1]<21-a[0];a[1]++)for( a[2]=0;a[2]<21-a[0]-a[1];a[2]++)for( a[3]=0;a[3]<21-a[2]-a[0]-a[1];a[3]++)for( a[4]=0;a[4]<21-a[3]-a[2]-a[1]-a[0];a[4]++)for( a[5]=0;a[5]<21-a[4]-a[3]-a[2]-a[1]-a[0];a[5]++)for( a[6]=0;a[6]<21-a[5]-a[4]-a[3]-a[2]-a[1]-a[0];a[6]++)for( a[7]=0;a[7]<21-a[6]-a[5]-a[4]-a[3]-a[2]-a[1]-a[0];a[7]++)for( a[8]=0;a[8]<21-a[7]-a[6]-a[5]-a[4]-a[3]-a[2]-a[1]-a[0];a[8]++){a[9]=21-a[0]-a[1]-a[2]-a[3]-a[4]-a[5]-a[6]-a[7]-a[8];if(a[9]<=0||a[9]>9)continue;int gh;for(int i=0;i<10;i++){gh=0;for(int j=0;j<21;j++){int t=f1[i][j]*a[i]+gh;f2[i][j]=t%10;gh=t/10;}}for(i=0;i<10;i++){g(f2[i],h);}mc(b,h);for(i=0;i<10;i++){if(b[i]!=a[i]){th =false;break;}}if(th ==true){/*cout<<endl;for(i=0;i<10;i++)cout<<a[i];cout<<endl;for(i=0;i<10;i++)cout<<b[i];cout<<endl;*/for(i=20;i>=0;i--)cout<<h[i];cout<<endl;}th =true;memset(b,0,sizeof(b));memset(h,0,sizeof(h));memset(f2,0,sizeof(f2));}end_time = clock();printf("\nTime elapsed:%.3lf (ms)\n",(double)(end_time-begin_time)); return 0;}void mc(int*b,int *a){for(int i=0;i<21;i++){int n=a[i];switch(n){case 0:b[0]++;break;case 1:b[1]++;break;case 2:b[2]++;break;case 3:b[3]++;break;case 4:b[4]++;break;case 5:b[5]++;break;case 6:b[6]++;break;case 7:b[7]++;break;case 8:b[8]++;break;case 9:b[9]++;break;}}}void f(int *s,int n){ int c=fabs(s[0]),h=0;for(int i=0;i<20;i++){ h=0;for(int j=0;j<21;j++){int t=fabs(s[j])*c+h;s[j]=t%10;h=t/10;}}}void g(int *f,int *a){int c=0;for(int i=0;i<21;i++){int t=f[i]+a[i]+c;a[i]=t%10;c=t/10;}}#include <sstream>#include <iostream>#include <cstdlib>#include <ctime>using namespace std;template<class T> string tostring(T a){ostringstream os;os<<a;return os.str();} #define N 21typedef pair<long long,long long> NUM;#define MOD 1000000000000000LL;NUM pow21[10][N+1];int sump[10][N+1];void init(){for(int i=0;i<10;i++)for(int j=0;j<=N;j++)sump[i][j]=i*j;for(int i=0;i<10;i++){pow21[i][0].first=pow21[i][0].second=0;}pow21[0][1].first=pow21[0][1].second=0;for(int i=1;i<10;i++){pow21[i][1].first=1;pow21[i][1].second=0;for(int j=0;j<N;j++){pow21[i][1].first*=i;pow21[i][1].second*=i;pow21[i][1].second+=pow21[i][1].first/MOD; pow21[i][1].first%=MOD;}}for(int j=2;j<=N;j++){for(int i=0;i<10;i++){pow21[i][j].first=j*pow21[i][1].first;pow21[i][j].second=j*pow21[i][1].second; pow21[i][j].second+=pow21[i][j].first/MOD; pow21[i][j].first%=MOD;}}}int numct[10],numct2[10];void print(NUM t){string s=tostring(t.first);s=string(15-s.size(),'0')+s;cout<<t.second<<s<<endl;void check(NUM sum){sum.second+=sum.first/MOD;sum.first%=MOD;if(sum.second<100000||sum.second>=1000000)return; memset(numct2,0,sizeof(numct2));long long t=sum.first;for(int i=0;i<15;i++){numct2[t%10]++;t/=10;}t=sum.second;for(int i=0;i<6;i++){numct2[t%10]++;t/=10;}if(memcmp(numct,numct2,sizeof(numct))==0)print(sum);}void dfs(int k,int remain,NUM sum,int sum2){if(k==2){if((sum.first+sum.second-sum2)%9!=0)return;}if(k==0){numct[0]=remain;check(sum);return;}NUM newsum;for(numct[k]=remain;numct[k]>=0;numct[k]--){newsum.first=sum.first+pow21[k][numct[k]].first; newsum.second=sum.second+pow21[k][numct[k]].second; dfs(k-1,remain-numct[k],newsum,sum2+sump[k][numct[k]]); }int main(){int cl=clock();init();dfs(9,N,pair<long long,long long>(),0);cout<<"TIME::"<<clock()-cl<<"ms"<<endl;cin>>cl;return 0;}java语言实现import java.math.BigInteger;import java.util.Arrays;class Narcissistic {private static BigInteger[] table = new BigInteger[10];public static void main(String[] args) {long time = System.nanoTime();find(21);time = System.nanoTime() - time;System.out.println(time / 1000000000.0 + "s");}public static void find(int n) {for (int i = 0; i < 10; i++) {table[i] = BigInteger.valueOf(i).pow(n);}int[] nums = new int[n];int index = 0;int num = 0;while (true) {if (index < nums.length && num < 10) {nums[index] = num;index++;continue;} else if (index >= nums.length) {BigInteger big = sum(nums);int[] temp = getArray(big);if (check(nums, true, temp, false)) {System.out.println(big);}} else if (index <= 0) {break;}index--;num = nums[index] + 1;}}public static boolean check(int[] a1, boolean copy1, int[] a2, boolean copy2) { if (a1.length != a2.length) {return false;}if (copy1) {a1 = a1.clone();}if (copy2) {a2 = a2.clone();}Arrays.sort(a1);Arrays.sort(a2);return Arrays.equals(a1, a2);}public static BigInteger sum(int[] nums) {BigInteger sum = BigInteger.ZERO;for (int i = 0; i < nums.length; i++) {sum = sum.add(table[nums[i]]);}return sum;}public static int[] getArray(BigInteger big) {String s = String.valueOf(big);int length = s.length();int[] res = new int[length];for (int i = 0; i < length; i++) {res[i] = s.charAt(i) - '0';}return res;}}。
在各种编程语⾔中实现求取⽔仙花数的⽅法(⾮⾼精度)在各种编程语⾔中实现求取⽔仙花数的⽅法(⾮⾼精度)。
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语言水仙花数的解题思路摘要: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.水仙花数的并行算法设计与实现 (7)1.1 .1功能描述1.1.2 解决方案1.2算法设计 (7)1.2.1 串行算法设计1.2.2并行算法设计1.3 基于OpenMP的并行算法实现 (8)1.3.1 代码及注释(变量名名字首字母开头)1.3.2 执行结果截图(体现串行时间、并行时间和加速比)1.3.3 遇到的问题及解决方案1.4 基于MPI的并行算法实现 (11)1.4.1 代码及注释(变量名名字首字母开头)1.4.2 执行结果截图(体现串行时间、并行时间和加速比)1.4.3 遇到的问题及解决方案1.5 基于Java(Runnable)的并行算法实现 (13)1.5.1 代码及注释(变量名名字首字母开头)1.5.2 执行结果截图(体现串行时间、并行时间和加速比)1.5.3 遇到的问题及解决方案1.6 基于Windows(.NET)的并行算法实现 (20)1.6.1 代码及注释(变量名名字首字母开头)1.6.2 执行结果截图(体现串行时间、并行时间和加速比)1.6.3 遇到的问题及解决方案2. 理论基础 (22)2.1 并行计算机体系结构、并行计算模型、并行算法的概念2.2并行计算机体系结构、并行计算模型、并行算法的关系2.3实例说明并行计算机体系结构、并行计算模型、并行算法的关系评价实践效果(正确度/加速比)理论基础难度工作量独立性认证结果1.水仙花数的并行算法设计与实现1.1 .1功能描述水仙花数又称阿姆斯特朗数。
是指一种三位数,其各个数之立方和等于该数本身。
水仙花数只是自幂数的一种,严格来说三位数的3次幂数才成为水仙花数。
1.1.2 解决方案并行思想:并行计算的原理就是把一个任务或者作业分配到多个处理器上并发执行。
这样一来可以大大提高计算的效率。
在本次课题中,要实现水仙花数的并行计算输出,就是把制定范围内的数用多个处理器进行计算,从而得到水仙花数的并行输出。
再和串行执行方法进行比较,观察其优越性。
核心算法:int hundreds = n / 100;int tens = n % 100 / 10;int ones = n % 10;Return cube(hundreds) + cube(tens) + cube(ones) == n;1.2算法设计1.2.1 串行算法设计for(xlh=100;xlh<1000;xlh++){j=xlh/100;z=(xlh-100*j)/10;t=xlh%10;if(j*j*j+z*z*z+t*t*t==xlh)printf("%d\n",xlh);}1.2.2 并行算法设计for (int xlh=100+ id; xlh< 1000; xlh+=2) //1000以内的水仙花数{int j=xlh/100; //判断百位int z=xlh%100/10;//判断十位int t=xlh%10;//个位if(j*j*j+z*z*z+t*t*t ==xlh)//确定是否是水仙花数printf("%d\n",xlh);//输出水仙花数}1.3 基于OpenMP的并行算法实现1.3.1 代码及注释(变量名名字首字母开头)#include "stdafx.h"#include "Windows.h"#include "math.h"#include <time.h>#include <omp.h>#include<iostream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){printf("求水仙花数\n");cout<<"并行结果:"<<endl;clock_t t1=clock();//线程1#pragma omp parallel for//并行开始for(int i=100; i<1000; i++)//判断是否为水仙花数{int xlh=i/100;int k=(i-100*xlh)/10;int l=i%10;Sleep(1);if(xlh*xlh*xlh+k*k*k+l*l*l==i)printf("%d\n",i);}clock_t t2=clock();//并行结束double pt=t2-t1-0.0;printf("并行时间%f\n",pt-0.0);//输出并行时间clock_t t3=clock();//串行开始for(int i=100; i<1000; i++){int xlh=i/100;int k=(i-100*xlh)/10;int l=i%10;Sleep(1);if(xlh*xlh*xlh+k*k*k+l*l*l==i)printf("%d\n",i);}clock_t t4=clock();//串行结束double st=t4-t3-0.0;printf("串行时间%f\n",st-0.0);printf("加速比%f\n",st/pt);system("pause");return 0;}1.3.2 执行结果截图(体现串行时间、并行时间和加速比)1.3.3 遇到的问题及解决方案错误代码int xlh,j,z,t,m,n;int id=omp_get_thread_num();omp_set_num_threads(NUM_THREADS);clock_t t1=clock();#pragma omp parallel{for(xlh=100+id;xlh<1000;xlh+=NUM_THREADS)//判断是否为水仙花数{j=xlh/100;z=(xlh-100*j)/10;t=xlh%10;if(j*j*j+z*z*z+t*t*t==xlh)printf("%d\n",xlh);}}clock_t t2=clock();printf("并行时间%d\n",t2-t1);printf("串行水仙花数:\n");clock_t t3=clock();// for(xlh=100;xlh<1000;xlh++){j=xlh/100;z=(xlh-100*j)/10;t=xlh%10;if(j*j*j+z*z*z+t*t*t==xlh)printf("%d\n",xlh);}clock_t t4=clock();正确代码int _tmain(int argc, _TCHAR* argv[]){printf("求水仙花数\n");cout<<"并行结果:"<<endl;clock_t t1=clock();//线程1#pragma omp parallel for//并行开始for(int i=100; i<1000; i++)//判断是否为水仙花数{int xlh=i/100;int k=(i-100*xlh)/10;int l=i%10;Sleep(1);if(xlh*xlh*xlh+k*k*k+l*l*l==i)printf("%d\n",i);}clock_t t2=clock();//并行结束double pt=t2-t1-0.0;printf("并行时间%f\n",pt-0.0);//输出并行时间clock_t t3=clock();//串行开始for(int i=100; i<1000; i++){int xlh=i/100;int k=(i-100*xlh)/10;int l=i%10;Sleep(1);if(xlh*xlh*xlh+k*k*k+l*l*l==i)printf("%d\n",i);}clock_t t4=clock();//串行结束分析对并行算法设计不熟悉。
逻辑混乱,写代码有错误。
1.4 基于MPI的并行算法实现1.4.1 代码及注释(变量名名字首字母开头)#include "stdafx.h"#include <mpi.h>#include <iostream>int main(int argc,char * argv[]){int id,numpro;double startime01,endtime01,startime02,endtime02;MPI_Init (&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&id);MPI_Comm_size(MPI_COMM_WORLD,&numpro);startime01 =MPI_Wtime();printf("水仙花数:\n");if(id==0)//并行for (int xlh=100+ id; xlh< 1000; xlh+=2) //1000以内的水仙花数{int j=xlh/100; //判断百位int z=xlh%100/10;//判断十位int t=xlh%10;//个位if(j*j*j+z*z*z+t*t*t ==xlh)//确定是否是水仙花数printf("%d\n",xlh);//输出水仙花数}if(id==0){endtime01=MPI_Wtime();printf("并行时间:%f\n",endtime01-startime01);//输出并行时间}if(id==0)//串行{startime02=MPI_Wtime();printf("水仙花数:\n");for (int xlh =100; xlh < 1000; xlh+=1){int j=xlh/100;int z=xlh%100/10;int t=xlh%10;if(j*j*j+z*z*z+t*t*t ==xlh)printf("%d\n",xlh);}endtime02=MPI_Wtime();printf("串行时间:%f\n",endtime02-startime02);}MPI_Finalize();system("pause");return 0;}1.4.2 执行结果截图(体现串行时间、并行时间和加速比)1.4.3 遇到的问题及解决方案后果分析环境配置错误,在配置MPI的环境时花了很多时间,在自己电脑上运行一直出错,后来在机房运行成功的。