[求助]C语言编程,计算回文数
5.编写一个程序实现求所有不超过200的N值,N的平方是具有对称性质的回文数。所谓回文数就是将一个数从左向右和从右向左读是一样的,例如34543和1234321都是回文数。<BR>希望各位大哥指教下呀.. <P>不知道对不对?赐教<BR><BR>#include <iostream><BR>#define N 200<BR>using namespace std;</P><P>bool isPaling(char* , int );</P>
<P>int main()<BR>{<BR> int x, len, i;<BR> char xbuf[11]; //32位机子long类型就10位<BR> for(i = 1; i < N; i++)<BR> {<BR> x = i * i;<BR> sprintf(xbuf, "%d", x);<BR> if( isPaling(xbuf, strlen(xbuf)) )<BR> cout << x << endl;<BR> }<BR> return 0;<BR>}<BR>bool isPaling(char* buf, int n)<BR>{<BR> for(int i = 0; i < n/2 ; i ++)<BR> if(buf[i] != buf[n - 1 -i])<BR> return false;<BR> return true;<BR>}</P> <P>java版的</P>
<P>public class A{<BR> public static void main(String[] args){<BR> StringBuffer sb;<BR> String s;<BR> for(int i=1;i<=200;i++){<BR> int mul=i*i;<BR> s=String.valueOf(mul);<BR> sb=new StringBuffer(s);<BR> if(sb.reverse().toString().equals(s)){<BR> System.out.println(i+"is OK");<BR> }<BR> <BR> }<BR> }<BR>}</P> <FONT color=#472cb1>你给的这个题目思路应该很清晰的,我初步想过之后,写出了这样的程序:<BR>#define N 200<BR>main()<BR>{int a,b,c,d,e;<BR>int i;<BR>long f;<BR>long g;<BR>int n=0;<BR>clrscr();<BR>for(i=1;i<=N;i++)<BR>{<BR>f=i*i;<BR>a=f/10000;<BR>b=(f-a*10000)/1000;<BR>c=(f-a*10000-b*1000)/100;<BR>d=(f-a*10000-b*1000-c*100)/10;<BR>e=(f-a*10000-b*1000-c*100-d*10);<BR>if(f>10000) g=e*10000+d*1000+c*100+b*10+a;<BR>else if(f>1000) g=e*1000+d*100+c*10+b;<BR>else if(f>100) g=e*100+d*10+c;<BR>else if(f>10) g=e*10+d;<BR>else g=e;<BR>if(f==g) {n++;printf("%d-----%d------%ld\n",n,i,f);}<BR>getch();<BR>}<BR>}<BR>经过运行和调试,结果是正确的,但是这个程序有很大的弱点,对于每一个数,它循环的次数太多,会造成CPU过慢,甚至死机<BR></FONT><FONT color=#c43ca9>基本的思维:对于任一个数的平方所得的结果,总可以写出程序中a,b,c,d,e的结果,大不了为0;但是倒过来也必须考虑位数了,否则一定产生错误</FONT> 谢分享 有什么好东西 在发出来哦 谢分享 有什么好东西 在发出来哦[em34] <P>大家是不是觉得Java版本的很简单,很精炼,所以有点点后悔选择C呢?~<BR>非也!其实C可以写出更简单精炼的程序的!!<BR>以下是我的实现。经检验正确~<BR><BR>[CODE]#include<stdio.h><BR>void main() {<BR> int a[5],*p,*q,m,i;<BR> for (i=1;i<200;i++){<BR> for (m=i*i,p=a; m; *p++=m%10,m/=10); /*计算m的平方的各位数字。*/<BR> for (p--,q=a; *q==*p&&p!=q; p--,q++); /*判断是否为回文,如果是*/<BR> if( p==q )printf("%d,",i); /*回文的话最后p会等于q的。*/<BR> }<BR>}[/CODE]<BR><BR>当然啦,代码风格不是很好看~~不过这只不过是为了精简啦,实际写程序时我可不会这样的~[em04]<BR>只是想说明:只要多学习,就可以写出比其他语言更简练的C程序~~呵呵~~<BR><BR>这里说说效率。按效率说的话,seavoice的效率是最高的,毕竟没有嵌套循环。不过我的程序和他的都是线性级的,我的总是会慢一倍左右[em04]不过好消息是,如果仅仅算到200的话,在我的电脑上两个算法需要的时间都小于1ms(Vista,VC++2005)。本来想做做效率测试的,但是海音兄的程序似乎不好扩展啊……[em03]所以……<BR><BR>不管怎么说,如果遇到这种东西。从优化角度上来说,海音兄的程序是最好的。像我的 程序只不过是适合不愿打字的懒人而已,呵呵~~</P> <P>判断是否是回文,就是分析一个整数的各个位上的数字,一般的方法是除以10取余取商来求得,<br>但是可以直接用sprintf函数来进行拆分成一个字符数组,在我的程序里(第二楼)有体现,<br>然后再判断数组元素就可以了。<br><br>另一个相对应的sscanf函数在处理数据内容时也很有用。</P>
[align=right][color=#000066][此贴子已经被作者于2007-11-17 12:50:16编辑过][/color][/align]
<P>的确……但是楼上的程序至少很多地方都是可以优化掉的……效率方面……<BR>我还是喜欢自己处理~~~比较高效一点~不过像海音兄的方法是不是优化太过了呢……</P>
回复:(zhoucang1hao)[求助]C语言编程,计算回文数
<P>回文串算法<BR> #include<iostream.h><BR>#include<string.h><BR> int reserve(char *str,int n)<BR> {<BR> if(n<2) return 1;</P><P> return <BR> str[0]==str[n-1]&&reserve(str+1,n-2);//<BR> }<BR> void main()<BR> { <BR> char a[10]="abcdedcba"; </P>
<P> int b=reserve(a,strlen(a));<BR> for(int i;a[i]!='\0';i++)<BR> cout<<a[i];<BR> }</P>
页:
[1]
