pascal波浪数

来源:百度知道 编辑:UC知道 时间:2024/05/11 15:24:50
求波浪数做法
波浪数是在一对数字之间交替转换的数,如1212121,双重波浪数则是指在两种进制下都是波浪数的数,如十进制数191919是一个十进制下的波浪数,它对应的十一进制数121212也是一个波浪数,所以十进制数191919是一个双重波浪数。
类似的可以定义三重波浪数,三重波浪数在三种不同的进制中都是波浪数,甚至还有四重波浪数,如十进制300=606(七进制)=363(九进制)=454(八进制)=1A1(十三进制)…,你的任务就是在指定范围内找出双重、三重、四重波浪数。

输入:
一行,包含五个用空格隔开的十进制整数,前两个数表示进制的范围(2~32),第三与第四个数表示指定的范围(1~10000000),第五个数为2,3,4中的一个,表示要找的波浪数的重数。

输出:
从小到大,以十进制形式输出指定范围内的指定重数的波浪数,一行输出一个数。

样例输入:
10 11 190000 960000 2

样例输出:
191919
383838
575757
767676
959595

提示:
穷举n
穷举a = n进制时最小值长度
穷举x 1~n-1
穷举y 0~n-1
如果x和y不同
产生波浪数temp
temp转至十进制
如果 temp 在指定范围内
(进行处理)
否则 如果 temp 大于最大值
退出循环,至穷举n
穷举y 结束
穷举x 结束
穷举a 结束
穷举n 结束

var f1,f2,b,s,l1,l2,x,i,j,k,l,len,t,z:longint;s1:string;tf,ft:boolean;
a:array[1..1000]of longint;
begin
assign(input,'mr180.in');reset(input);
assign(output,'mr180.ou');rewrite(output);
readln(f1,f2,l1,l2,x);
for i:=l1 to l2 do begin
k:=i;s1:='';str(k,s1);len:=length(s1);tf:=true;
for j:=1 to len do begin
if j mod 2=0 then if s1[j]<>s1[2]then tf:=false;
if j mod 2=1 then if s1[j]<>s1[1]then tf:=false;
end;
if(len mod 2=0)and tf then begin
for l:=f1 to f2 do begin
k:=i;s1:='';
repeat
b:=k mod l;
if b in[0..9]then s1:=s1+chr(b+48)else s1:=s1+chr(b+64-9);
k:=k div l;
until k=0;
len:=length(s1);tf:=true;
for j:=1 to len do begin
if j mod 2=0 then if s1[j]<>s1[2]then tf:=false;
if j mod 2=1 then if s1[j]<>s1[1]then tf:=false;
end;
if tf and(len mod 2=0)then inc(s);
if s=x then <