#include<iostream>#include<cmath>#include<iomanip>using namespace std;int main(){ int a,m,n=0,i=0; for(m=1;m<=1000;m=m+1) { for(int j=1;j<=4;j=j+1) { a=m; n=n+(a%10)^3; a=a/10; } if(n==m) { cout<<m; i=i+1; if(i%10==0)cout<<endl; } } return 0;}这是我编的程序,看不出哪里有错,希望大家帮帮忙~~
你的思想是对的。不过程序有如下错误:1. a=m;这个要放在循环外。因为你是对一个相对固定的数字m进行位数处理,不能在处理位数时,每次都重新赋值,这是和a=a/10;自相矛盾的。2. n=0 这个要放在外层循环内,因为n是一个暂时的计算各位数字的立方和的存放点,必须在计算下一个数字m时,重新归0。3. cout<<m;这个写法很不好,因为所有数字都挤在一起,应该加上<<' ';4. 最严重的错误是:n=n+(a%10)^3;注意,这种数学公式直接搬上来是错误的,^这个符号表示异或,而不是你想象的立方符号,应该使用库函数int pow(int x, int y);其中,x是要求立方的数字,y是求几次方,函数原型可能跟我写的不一样,但是大概意思是这样的。所以写程序还是注意细节比较好,不然出了错误很难找,你这个还是很简单的,修改以后的程序应该像这样:#include<iostream>#include<cmath>#include<iomanip>using namespace std;int main(){ int i=0; for(int m=1;m<=1000;m=m+1) { int a=m; int n=0; for(int j=1;j<=4;j=j+1) { n=n+pow(a%10,3); a=a/10; } if(n==m) { cout<<m<<' '; i=i+1; if(i%10==0)cout<<endl; } } return 0;}
晕~~很简单的不要直接想首先一位数只有1能实现,其他的不能,不多解释了两位数如果能满足要求的话,a^3+b^3=10*a+b三位数 同理得 a^3+b^3+c^3=100*a+10*b+c这样的话就只要遍历0~9就OK#include <iostream.h>int main(){cout<<1<<endl;for(int a=1;a<=9;a++)for(int b=0;b<=9;b++){int c=0;while(c<=9){ if(a*a*a+b*b*b+c*c*c==100*a+10*b+c)cout<<100*a+10*b+c<<endl;c++;}if(a*a*a+b*b*b==10*a+b){cout<<10*a+b<<endl;}}return 0;}
很显然,错了挺多地方,比如a=m;得放在for循环外,要不就每次循环都被赋值了,还有if(n==m)完后得重新给令n=0;否则n会一直加下去,还有很多错误,而且算法有点复杂,我重新给你写个吧#include <iostream>#include<cmath>using namespace std;void main(){ int i,gw,sw,bw; for(i=1;i<1000;i++) { bw=i/100; //百位 sw=(i%100)/10;//十位 gw=i%10;//个位 if(pow(bw,3)+pow(sw,3)+pow(gw,3)==i) printf("%d\n",i); }} 如果非得改你那个程序的话,可以改成这样的:#include <iostream>#include<cmath>using namespace std;main(){ int i,j,k,s; for(i=1;i<=1000;i++){ j=i;s=0; while(j){ k=j%10; s+=k*k*k; j/=10; } if(s==i) printf("%d\n",i); }}
= =!百科有~~上次见过呢~for(i=0;i<9;i++) for(j=0;j<9;j++) for(k=1;k<9;k++) if((i*i*i)+(j*j*j)+(k*k*k)==(k*100)+(j*10)+i) printf("%d%d%d",k,j,i);