[竞赛]最短代码输出所有小于n的回文数

fire_woods 2009-07-15 11:28:28
回文数就是一个数,倒过来还是一样的,比如12321.
框架代码已给
#include <sdtio.h>
void p(int n)
{
//添加
}
void main()
{
p(25);//n
}

输出为
1
2
3
...
9
11
22

切记是代码字符数最少,包括空格和回车.
最少者独得200分.
...全文
1372 40 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
ShingRay 2009-08-14
  • 打赏
  • 举报
回复
void p(int n){if(n>1)p(n-1);int i=n,m=0;while(i,m=m*10+i%10,i/=10);m==n&&printf("%d\n",n);}
ahjoe 2009-08-13
  • 打赏
  • 举报
回复

procedure PrintNumber(N: integer);
label cont;
var
s: string;
i, j: integer;
begin // 输出回文正整数
for i := 1 to N-1 do
begin
s := IntToStr(i);
for j := 1 to Length(s) shr 1 do
if s[j] <> s[Length(s)-j+1] then
goto cont;
WriteLn(s);
cont:
end;
end;
LPR_Pro 2009-08-13
  • 打赏
  • 举报
回复

void p(int n)
{
if(n>1)p(n-1);int i=n,j=0;while(i){j=j*10+i%10;i/=10;}if(j==n)printf("%d\n",n);
}
fxg0110 2009-08-12
  • 打赏
  • 举报
回复
n-1?p(n-1):1;n>9&&n%11!=0?1:printf("%d\n",n);

都给大虾昨完了,没分抢了....呜呜
来个只合适楼主给出n的,或者说是符合n<100的
嘻嘻
FancyMouse 2009-08-09
  • 打赏
  • 举报
回复
根本就不必判断,输出的话直接枚举,找个数可以O(logn)
绿色夹克衫 2009-08-07
  • 打赏
  • 举报
回复
仅从输出的量上来看,效率能提高的幅度有限,如果改为,输入N,输出0-n之间回文数的数量,对效率要求就比较高了。

这种比短的比赛,主要比的是对于某种语言语法的熟练,不过目前仅限定为C,许多程序用C写未必能够达到最短,

经常是C上百行的代码,pathon 10几行就实现了,.net自从有了linq之后,也短了很多。

如果不管效率的话,可以用那些动态或半动态语言来写,也许更短。

[Quote=引用 29 楼 shellcoder 的回复:]
没劲,多研究下效率多好

这种游戏某个比赛已经搞过了,估计真要去比了,倒是一个都做不出来了。
[/Quote]
ToBeTough 2009-08-07
  • 打赏
  • 举报
回复
我觉的从数字本身出发可能是种有效率,且代码不会太长。类似排列组合。1位的0-9
2位 11-99 三位的(1-9)(0-9)90种情况。比较就行。4位的情况种类和3位的是一样的。
不知道可行不?
fire_woods 2009-08-06
  • 打赏
  • 举报
回复
10^i在c语言里面是10异或i.
LeonTown 2009-08-06
  • 打赏
  • 举报
回复
void p(int n)
{
if(n>1)
p(n-1);
unsigned int uLen = 1;
while(n/=10)
++uLen;
for(unsigned int i=0; i<uLen/2; ++i)
{
if( (n%(10^(i+1)))/(10^i) != (n%(10^(uLen-i-1)))%10 )
return;
}
printf("%d\n", n);
}
linren 2009-08-06
  • 打赏
  • 举报
回复
把:
n?p(n-1):1;for(int i=n,j=0;i;(j=j*10+i%10)-n?i/=10:printf("%d\n",n));

改成非递归式:
for(int k=1,i=1,j=0;i||(j=0,i=++k)<=n;(j=j*10+i%10)-k?i/=10:printf("%d\n",k));
fire_woods 2009-08-06
  • 打赏
  • 举报
回复
13楼的代码,稍微修改一下,可以省下5个字符.
linren 2009-08-06
  • 打赏
  • 举报
回复
构造一个顺序相反的数……
判断是否与原来的数相等
这个办法真厉害……
linren 2009-08-06
  • 打赏
  • 举报
回复
我想到的……
void p(int n){
for(int a,j,i=1;i<=n;i++){
j=1;a=i;
while(a>9){a/=10;j*=10;}
a=i;
while(1){
if(j<1){
printf("%d\n",i);break;
}
if((a/j)!=(a%10)) break;
a%=j;a/=10;j/=100;
}
}
}

还是太多字符了……

30楼好像应该是:
n?p(n-1):1;for(int i=n,j=0;i;(j=j*10+i%10)-n?i/=10:printf("%d\n",n));
fire_woods 2009-08-06
  • 打赏
  • 举报
回复
突破70个字符了.

n?p(n-1):1;for(int i=n,j=0;(j=j*10+i%10)-n?i/=10:printf("%d\n",n););
adfas 2009-08-06
  • 打赏
  • 举报
回复
没劲,多研究下效率多好

这种游戏某个比赛已经搞过了,估计真要去比了,倒是一个都做不出来了。
fire_woods 2009-08-06
  • 打赏
  • 举报
回复
一起娱乐,哈哈.
又少一个字节


n?p(n-1):1;for(int i=n,j=0;i;(j=j*10+i%10)-n?i/=10:printf("%d\n",n));

pkuzhaojm1997 2009-08-06
  • 打赏
  • 举报
回复
上面那个回复是有问题的代码,只在楼主的调用主程序环境中没问题 ,纯属娱乐贴,哈哈
pkuzhaojm1997 2009-08-06
  • 打赏
  • 举报
回复
继续优少化,哈哈 :)

void p(int n)
{
if(n)p(n-1);for(int i=n,j=0;i;(j=j*10+i%10)-n?i/=10:printf("%d\n",n));
}


[Quote=引用 24 楼 ACrazer 的回复:]
还可以再少一个:
void p(int n)
{
if(n>1)p(n-1);for(int i=n,j=0;(j=j*10+i%10)-n?i/=10:printf("%d\n",n););
}


引用 23 楼 ACrazer 的回复:
我也来一个:比20楼少4个字符!
void p(int n)
{
if(n>1)p(n-1);for(int i=n,j=0;i;(j=j*10+i%10)-n?i/=10:printf("%d\n",n));
}

引用 20 楼 pkuzhaojm1997 的回复:

C/C++ code

void p(int n)
{
if(n>1)p(n-1);int i=n,j=0;for(;i;i/=10)j=j*1…
[/Quote]
KWHOK 2009-08-06
  • 打赏
  • 举报
回复
这题目用来查看语言的一些特性还是不错地!
KWHOK 2009-08-06
  • 打赏
  • 举报
回复
还可以再少一个:
void p(int n)
{
if(n>1)p(n-1);for(int i=n,j=0;(j=j*10+i%10)-n?i/=10:printf("%d\n",n););
}

[Quote=引用 23 楼 ACrazer 的回复:]
我也来一个:比20楼少4个字符!
void p(int n)
{
if(n>1)p(n-1);for(int i=n,j=0;i;(j=j*10+i%10)-n?i/=10:printf("%d\n",n));
}

引用 20 楼 pkuzhaojm1997 的回复:

C/C++ code

void p(int n)
{
if(n>1)p(n-1);int i=n,j=0;for(;i;i/=10)j=j*10+i%10;if(j==n)printf("%d\n",n);
}



[/Quote]
加载更多回复(20)

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧