| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付赛孚耐:软件保护加密专家
身份认证令牌USB KEY   
共有 514 人关注过本帖
标题:[求助]C语言编程,计算回文数
收藏  订阅  推荐  打印 
zhoucang1hao
Rank: 1
等级:新手上路
帖子:3
积分:132
注册:2007-11-15
[求助]C语言编程,计算回文数

5.编写一个程序实现求所有不超过200的N值,N的平方是具有对称性质的回文数。所谓回文数就是将一个数从左向右和从右向左读是一样的,例如34543和1234321都是回文数。
希望各位大哥指教下呀..
搜索更多相关主题的帖子: 回文数  C语言  平方  性质  
2007-11-15 14:23
codelet
Rank: 1
等级:新手上路
帖子:35
积分:458
注册:2007-11-6

不知道对不对?赐教

#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;
}


2007-11-16 08:09
Tony_bb
Rank: 1
等级:新手上路
帖子:37
积分:472
注册:2007-11-16

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");
}

}
}
}

2007-11-16 09:04
seavoice
Rank: 1
等级:新手上路
帖子:5
积分:150
注册:2007-11-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;但是倒过来也必须考虑位数了,否则一定产生错误

2007-11-16 22:16
ufowc
Rank: 1
等级:新手上路
帖子:10
积分:200
注册:2007-11-16

谢分享  有什么好东西 在发出来哦
2007-11-16 22:18
DancingWind
Rank: 1
等级:新手上路
帖子:12
积分:220
注册:2007-11-16

谢分享  有什么好东西 在发出来哦
2007-11-16 22:22
StarWing83
Rank: 12Rank: 12Rank: 12
来自:湖北工业大学
等级:贵宾
威望:12
帖子:2517
积分:26598
注册:2007-11-16

大家是不是觉得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)。本来想做做效率测试的,但是海音兄的程序似乎不好扩展啊……所以……

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


专心编程………
飞燕算法初级群:3996098
我的Blog
2007-11-17 00:27
codelet
Rank: 1
等级:新手上路
帖子:35
积分:458
注册:2007-11-6

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

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

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


2007-11-17 12:48
StarWing83
Rank: 12Rank: 12Rank: 12
来自:湖北工业大学
等级:贵宾
威望:12
帖子:2517
积分:26598
注册:2007-11-16

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


专心编程………
飞燕算法初级群:3996098
我的Blog
2007-11-17 13:16
qq598369
Rank: 1
等级:新手上路
帖子:13
积分:230
注册:2007-9-5
回复:(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];
}

2007-11-17 14:34
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.064247 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved