任务:利用数组,实现回文数的判断
#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
莺啼岸柳弄春晴夜月明,香莲碧水动风凉夏日长,
秋江楚雁宿沙洲浅水流,
红炉透炭炙寒风御隆冬。
这首十字回文诗,每句来回复读,可成一首七言绝句。四首绝句,也描写四时景色。
春 景 诗
莺啼岸柳弄春晴,柳弄春晴夜月明。
明月夜晴春弄柳,晴春弄柳岸啼莺。
夏 景 诗
香莲碧水动风凉,水动风凉夏日长。
长日夏凉风动水,凉风动水碧莲香。
秋 景 诗
秋江楚雁宿沙洲,雁宿沙洲浅水流。
流水浅洲沙宿雁,洲沙宿雁楚江秋。
冬 景 诗
红炉透炭炙寒风,炭炙寒风御隆冬。
冬隆御风寒炙炭,风寒炙炭透炉红。