任务:利用数组,实现回文数的判断
#include<iostream> using namespace std; bool isPalindrome(int); int main() { int m,n; cout<<"求多少以内的回文数?"<<endl; cin>>m; for(n=1;n<=m;++n) if(isPalindrome(n)) cout<<n<<" "; return 0; } bool isPalindrome(int n) { int a[20]; //用于存储n中的各位数 int i=0; //下面的循环,使a数组中依次存放个、十、百……位数 while(n>0) { a[i++]=n%10; n/=10; } //退出循环,可以知道n为i位数 int j=0,k=i-1; while(a[j]==a[k]&&j<k)//只要两边的数相等,齐往中间“看” j++,k--; if(j>=k) return true; //前后两端对应的数字都比较过了,都相等,是回文数 else return false; }
拓展:利用上面的比较算法,可以判断一个字符串是否是回文(真正的文),典型的回文,如"level"。试编写这样的程序。本文最后还附一组古人的回文诗,值得欣赏。
后记:写本文,源于有网友发来求助信让我看看下面的程序。其中用到了数组,是或以作为一种思路,再看到静态变量(并且还是全局的),尤其是goto语句,感觉到完全没有必要了。想去理出个头绪来,但如此难读,这种程序不读也罢,不管能不能完成任务,即使领着初学者读懂了,也是将人往沟里带的程序。交朋友要有选择,读程序也是这样。
下面是原程序,粗读一下,当作反面材料好了。注意在实际工作中,静态变量、全局变量能不用就不用,而用高级语言编程,goto语句更是不要去用,有的是办法替代。
#include<iostream> using namespace std; int a[20]; //可以通过改变元素的多少来改变所求整数的范围 static int i=0; void f(int); void f(int n) { lp:for(n;n>=10;n--) { int N=n; for(i=0;i<10;i++) //用循环将一个整数的各位分离出来 { if(N/10==0) { a[i]=N; break; } else { a[i]=N; N/=10; } } int b=i; for(i,b;i>=0;i--) //用来判断是否为回文数! { if(a[i]==a[b-i]) continue; else { n--; goto lp; } } cout<<n<<endl; } } void main() { int n=0; cout<<"求多少以内的回文数?"<<endl; cin>>n; f(n); }
附:明末浙江才女吴绛雪《四时山水诗》,诗云: ——自http://baike.baidu.com/view/46546.htm
莺啼岸柳弄春晴夜月明,香莲碧水动风凉夏日长,
秋江楚雁宿沙洲浅水流,
红炉透炭炙寒风御隆冬。
这首十字回文诗,每句来回复读,可成一首七言绝句。四首绝句,也描写四时景色。
春 景 诗
莺啼岸柳弄春晴,柳弄春晴夜月明。
明月夜晴春弄柳,晴春弄柳岸啼莺。
夏 景 诗
香莲碧水动风凉,水动风凉夏日长。
长日夏凉风动水,凉风动水碧莲香。
秋 景 诗
秋江楚雁宿沙洲,雁宿沙洲浅水流。
流水浅洲沙宿雁,洲沙宿雁楚江秋。
冬 景 诗
红炉透炭炙寒风,炭炙寒风御隆冬。
冬隆御风寒炙炭,风寒炙炭透炉红。