回文数
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
0
-
描述
-
请寻找并输出1至1000000之间的数m,它满足m、m^2和m^3均为回文数。回文数大家都知道吧,就是各位数字左右对称的整数,例如121、676、123321等。满足上述条件的数如m=11,m^2=121,m^3=1331皆为回文数。
-
输入
- 没有输入 输出
输出1至1000000之间满足要求的全部回文数,每两个数之间用空格隔开,每行输出五个数
已经走到了这一步,一定要坚持下去,一定要想尽一切办法克服困难,决不能放弃!!
这一题要注意的地方就是int是不够的,只能显示前六个数。要用long long才行
#include<iostream> #include<vector> #include<string> using namespace std; int t=0; char * fenjie(long long k) { t=0; char *a; a = new char[30] ; while(k) { a[t++]=k%10+'0'; k=k/10; } a[t]='\0'; return a; } bool is(char* a) { string s; while(t--) { s+=a[t]; } return equal(s.begin() ,s.end() , s.rbegin() ); } int main() { vector<int> vec; vector<int>::iterator it; for(long long i = 1;i != 1000001; i++) { if(is(fenjie(i))&&is(fenjie(i*i))&&is(fenjie(i*i*i))) vec.push_back(i); } int m=1; for(it=vec.begin() ;it!=vec.end() ;it++){ m++; cout<<(*it); if(m==6){ m=1; cout<<endl; } else cout<<" "; } return 0; }
还有在定义函数fenjie的时候,字符数组a定义成char a[30]就一直会有一个worning出现,后来学长帮我改成了指针(用new)才除掉。
看到别人写的不错的代码:
#include <stdio.h> int isreverse(long long n) { long long m = n,k=0; while (m != 0) { k = 10*k + m % 10; //直接算出倒过来的数 m /= 10; } return (k == n); //看到过来的数与原来的数是否相等,如果想等说明是回文数否则就不是。我咋就没想到呢 } int main() { long long i,j=0; for (i=1; i<= 1000000; i++) { if (isreverse(i) && isreverse(i*i) && isreverse(i*i*i)) { printf("%d ",i); j++; if (j % 5 == 0) { printf("\n"); } } } printf("\n"); }