注册 登录
编程论坛 新人交流区

[求助]C语言编程,计算回文数

zhoucang1hao 发布于 2007-11-15 14:23, 3207 次点击
5.编写一个程序实现求所有不超过200的N值,N的平方是具有对称性质的回文数。所谓回文数就是将一个数从左向右和从右向左读是一样的,例如34543和1234321都是回文数。
希望各位大哥指教下呀..
9 回复
#2
codelet2007-11-16 08:09

不知道对不对?赐教

#include <iostream>
#define N 200
using namespace std;

bool isPaling(char* , int );

int main()
{
int x, len, i;
char xbuf[11]; //32位机子long类型就10位
for(i = 1; i < N; i++)
{
x = i * i;
sprintf(xbuf, "%d", x);
if( isPaling(xbuf, strlen(xbuf)) )
cout << x << endl;
}
return 0;
}
bool isPaling(char* buf, int n)
{
for(int i = 0; i < n/2 ; i ++)
if(buf[i] != buf[n - 1 -i])
return false;
return true;
}

#3
Tony_bb2007-11-16 09:04

java版的

public class A{
public static void main(String[] args){
StringBuffer sb;
String s;
for(int i=1;i<=200;i++){
int mul=i*i;
s=String.valueOf(mul);
sb=new StringBuffer(s);
if(sb.reverse().toString().equals(s)){
System.out.println(i+"is OK");
}

}
}
}

#4
seavoice2007-11-16 22:16
你给的这个题目思路应该很清晰的,我初步想过之后,写出了这样的程序:
#define N 200
main()
{int a,b,c,d,e;
int i;
long f;
long g;
int n=0;
clrscr();
for(i=1;i<=N;i++)
{
f=i*i;
a=f/10000;
b=(f-a*10000)/1000;
c=(f-a*10000-b*1000)/100;
d=(f-a*10000-b*1000-c*100)/10;
e=(f-a*10000-b*1000-c*100-d*10);
if(f>10000) g=e*10000+d*1000+c*100+b*10+a;
else if(f>1000) g=e*1000+d*100+c*10+b;
else if(f>100) g=e*100+d*10+c;
else if(f>10) g=e*10+d;
else g=e;
if(f==g) {n++;printf("%d-----%d------%ld\n",n,i,f);}
getch();
}
}
经过运行和调试,结果是正确的,但是这个程序有很大的弱点,对于每一个数,它循环的次数太多,会造成CPU过慢,甚至死机
基本的思维:对于任一个数的平方所得的结果,总可以写出程序中a,b,c,d,e的结果,大不了为0;但是倒过来也必须考虑位数了,否则一定产生错误
#5
ufowc2007-11-16 22:18
谢分享  有什么好东西 在发出来哦
#6
DancingWind2007-11-16 22:22
谢分享  有什么好东西 在发出来哦
#7
StarWing832007-11-17 00:27

大家是不是觉得Java版本的很简单,很精炼,所以有点点后悔选择C呢?~
非也!其实C可以写出更简单精炼的程序的!!
以下是我的实现。经检验正确~

[CODE]#include<stdio.h>
void main() {
int a[5],*p,*q,m,i;
for (i=1;i<200;i++){
for (m=i*i,p=a; m; *p++=m%10,m/=10); /*计算m的平方的各位数字。*/
for (p--,q=a; *q==*p&&p!=q; p--,q++); /*判断是否为回文,如果是*/
if( p==q )printf("%d,",i); /*回文的话最后p会等于q的。*/
}
}[/CODE]

当然啦,代码风格不是很好看~~不过这只不过是为了精简啦,实际写程序时我可不会这样的~
只是想说明:只要多学习,就可以写出比其他语言更简练的C程序~~呵呵~~

这里说说效率。按效率说的话,seavoice的效率是最高的,毕竟没有嵌套循环。不过我的程序和他的都是线性级的,我的总是会慢一倍左右不过好消息是,如果仅仅算到200的话,在我的电脑上两个算法需要的时间都小于1ms(Vista,VC++2005)。本来想做做效率测试的,但是海音兄的程序似乎不好扩展啊……所以……

不管怎么说,如果遇到这种东西。从优化角度上来说,海音兄的程序是最好的。像我的 程序只不过是适合不愿打字的懒人而已,呵呵~~

#8
codelet2007-11-17 12:48

判断是否是回文,就是分析一个整数的各个位上的数字,一般的方法是除以10取余取商来求得,
但是可以直接用sprintf函数来进行拆分成一个字符数组,在我的程序里(第二楼)有体现,
然后再判断数组元素就可以了。

另一个相对应的sscanf函数在处理数据内容时也很有用。

[此贴子已经被作者于2007-11-17 12:50:16编辑过]

#9
StarWing832007-11-17 13:16

的确……但是楼上的程序至少很多地方都是可以优化掉的……效率方面……
我还是喜欢自己处理~~~比较高效一点~不过像海音兄的方法是不是优化太过了呢……

#10
qq5983692007-11-17 14:34
回复:(zhoucang1hao)[求助]C语言编程,计算回文数

回文串算法
#include<iostream.h>
#include<string.h>
int reserve(char *str,int n)
{
if(n<2) return 1;

return
str[0]==str[n-1]&&reserve(str+1,n-2);//
}
void main()
{
char a[10]="abcdedcba";

int b=reserve(a,strlen(a));
for(int i;a[i]!='\0';i++)
cout<<a[i];
}

1