希望各位大哥指教下呀..
希望各位大哥指教下呀..
不知道对不对?赐教
#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;
}
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");
}
}
}
}
大家是不是觉得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)。本来想做做效率测试的,但是海音兄的程序似乎不好扩展啊……
所以……
不管怎么说,如果遇到这种东西。从优化角度上来说,海音兄的程序是最好的。像我的 程序只不过是适合不愿打字的懒人而已,呵呵~~
判断是否是回文,就是分析一个整数的各个位上的数字,一般的方法是除以10取余取商来求得,
但是可以直接用sprintf函数来进行拆分成一个字符数组,在我的程序里(第二楼)有体现,
然后再判断数组元素就可以了。
另一个相对应的sscanf函数在处理数据内容时也很有用。
[此贴子已经被作者于2007-11-17 12:50:16编辑过]
回文串算法
#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];
}