| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3206 人关注过本帖
标题:[求助]C语言编程,计算回文数
只看楼主 加入收藏
zhoucang1hao
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-11-15
收藏
 问题点数:0 回复次数:9 
[求助]C语言编程,计算回文数
5.编写一个程序实现求所有不超过200的N值,N的平方是具有对称性质的回文数。所谓回文数就是将一个数从左向右和从右向左读是一样的,例如34543和1234321都是回文数。
希望各位大哥指教下呀..
搜索更多相关主题的帖子: 回文数 C语言 平方 性质 
2007-11-15 14:23
codelet
Rank: 2
来 自:广东深圳
等 级:论坛游民
帖 子:61
专家分:37
注 册:2007-11-6
收藏
得分:0 

不知道对不对?赐教

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


Losing emotion, Finding devotion.
2007-11-16 08:09
Tony_bb
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2007-11-16
收藏
得分:0 

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
专家分:0
注 册:2007-11-16
收藏
得分:0 
你给的这个题目思路应该很清晰的,我初步想过之后,写出了这样的程序:
#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
专家分:0
注 册:2007-11-16
收藏
得分:0 
谢分享  有什么好东西 在发出来哦
2007-11-16 22:18
DancingWind
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2007-11-16
收藏
得分:0 
谢分享  有什么好东西 在发出来哦
2007-11-16 22:22
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 

大家是不是觉得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: 2
来 自:广东深圳
等 级:论坛游民
帖 子:61
专家分:37
注 册:2007-11-6
收藏
得分:0 

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

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

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


Losing emotion, Finding devotion.
2007-11-17 12:48
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 

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


专心编程………
飞燕算法初级群:3996098
我的Blog
2007-11-17 13:16
qq598369
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-9-5
收藏
得分:0 
回复:(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
快速回复:[求助]C语言编程,计算回文数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017425 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved