一道Pascal小问题-----绝对回文数(高手们快来呀)

来源:百度知道 编辑:UC知道 时间:2024/05/29 23:30:08
我刚学pascal语言,有问题请教.
有一种绝对回文数,其十进制与二进制均为回文数。
输入:只有一行且只有一个正整数: n
( 1< n < 10^6 )
输出:只有一行且只有一个正整数:1至n之间(包括1和n)的绝对回文数个数
例如:输入10 输出5
我的程序是这样的:
var
n,j,k:longint;s1,s2:string;i:integer;a:array[1..100]of string;
begin
readln(n);
k:=0;
for j:=1 to n do begin
str(j,s1);
for i:=1 to length(s1) do
a[i]:=s1[i];
s2:='';
for i:=length(s1) downto 1 do
s2:=s2+a[i];
if s1=s2 then begin
s1:='';
repeat
s1:=s1+char(ord('0')+j mod 2);
j:= j div 2
until j=0;
for i:=1 to length(s1) do
a[i]:=s1[i];
s2:='';
for i:=length(s1) downto 1 do
s2:=s2+a[i];
if s1=s2 then inc(k);
end;
end;
writeln(k)
end.
程序超时了,我是新手,只会字符串和一维数组,所以解题要求是:
1不可定义函数
2要简单明了,让我看得懂
3用最基础的语句解

穷举生成2进制的回文数,反过来验证10进制的时候是否也是回文
直接穷举10进制数是会超时的

= =

姐姐会= =
我学的忘了= =

首先
你的程序根本运行不了
是错误的!
你按F9
然后按空格
这时你的程序中会出现一条绿色的粗的线
这就是你错误的地方
j是一个循环变量
你一开始就用for j:=把整个程序扩了起来
你那段直到语句也在其中,那怎么可能until j=0呢?

我的程序:
var
n,i,x,j,y,total:longint;
s1,s,k,k1,ch:string;
begin
readln(n);
total:=0;
for i:=1 to n do begin
y:=i;
s:='';
s1:='';
repeat
x:=y mod 2;
str(x,ch);
s:=ch+s;
s1:=s1+ch;
y:=y div 2
until y=0;
if s1=s then begin
str(i,k);
k1:='';
for j:=length(k) downto 1 do
k1:=k1+k[j];
if k1=k then inc(total);
end;
end;
writeln(total);
end.