编程论坛's Archiver

zhoucang1hao 发表于 2007-11-15 14:23

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

5.编写一个程序实现求所有不超过200的N值,N的平方是具有对称性质的回文数。所谓回文数就是将一个数从左向右和从右向左读是一样的,例如34543和1234321都是回文数。<BR>希望各位大哥指教下呀..

codelet 发表于 2007-11-16 08:09

<P>不知道对不对?赐教<BR><BR>#include &lt;iostream&gt;<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 &lt; N; i++)<BR> {<BR>  x = i * i;<BR>  sprintf(xbuf, "%d", x);<BR>  if( isPaling(xbuf, strlen(xbuf)) )<BR>   cout &lt;&lt; x &lt;&lt; endl;<BR> }<BR> return 0;<BR>}<BR>bool isPaling(char* buf, int n)<BR>{<BR> for(int i = 0; i &lt; n/2 ; i ++)<BR>  if(buf[i] != buf[n - 1 -i])<BR>   return false;<BR> return true;<BR>}</P>

Tony_bb 发表于 2007-11-16 09:04

<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&lt;=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>

seavoice 发表于 2007-11-16 22:16

<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&lt;=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&gt;10000) g=e*10000+d*1000+c*100+b*10+a;<BR>else if(f&gt;1000) g=e*1000+d*100+c*10+b;<BR>else if(f&gt;100)  g=e*100+d*10+c;<BR>else if(f&gt;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>

ufowc 发表于 2007-11-16 22:18

谢分享  有什么好东西 在发出来哦

DancingWind 发表于 2007-11-16 22:22

谢分享  有什么好东西 在发出来哦[em34]

StarWing83 发表于 2007-11-17 00:27

<P>大家是不是觉得Java版本的很简单,很精炼,所以有点点后悔选择C呢?~<BR>非也!其实C可以写出更简单精炼的程序的!!<BR>以下是我的实现。经检验正确~<BR><BR>[CODE]#include&lt;stdio.h&gt;<BR>void main() {<BR>    int a[5],*p,*q,m,i;<BR>    for (i=1;i&lt;200;i++){<BR>        for (m=i*i,p=a; m; *p++=m%10,m/=10);     /*计算m的平方的各位数字。*/<BR>        for (p--,q=a; *q==*p&amp;&amp;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>

codelet 发表于 2007-11-17 12:48

<P>判断是否是回文,就是分析一个整数的各个位上的数字,一般的方法是除以10取余取商来求得,<br>但是可以直接用sprintf函数来进行拆分成一个字符数组,在我的程序里(第二楼)有体现,<br>然后再判断数组元素就可以了。<br><br>另一个相对应的sscanf函数在处理数据内容时也很有用。</P>
[align=right][color=#000066][此贴子已经被作者于2007-11-17 12:50:16编辑过][/color][/align]

StarWing83 发表于 2007-11-17 13:16

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

qq598369 发表于 2007-11-17 14:34

回复:(zhoucang1hao)[求助]C语言编程,计算回文数

<P>回文串算法<BR>  #include&lt;iostream.h&gt;<BR>#include&lt;string.h&gt;<BR> int reserve(char *str,int n)<BR>    {<BR>         if(n&lt;2) return 1;</P>
<P>          return <BR>     str[0]==str[n-1]&amp;&amp;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&lt;&lt;a[i];<BR> }</P>

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.