回 帖 发 新 帖 刷新版面

主题:[讨论]完全平方回文数!!高手指导下!正确悬赏~

题3、完全平方回文数(base.???)

【问题描述】
给定一个十进制自然数的范围和进制的范围,十进制自然数范围在1到2×10^9之间,进制的范围在2到36之间,给定范围里的数中有许多数在某进制下既是完全平方数又是回文数,你的任务是统计给定范围内有多少个数满足下列条件:仅在某一进制下既是完全平方数又是回文数。
说明:3*3=9,因为它在十进制和11进制中都是回文数,所以9不能算;同样26^2 = 676也不算。

【输入格式】
一行四个整数,分别表示给定的十进制自然数的范围和进制的范围。

【输出格式】
单独一行包含一个整数,表示给定范围内满足条件的数的个数。

【输入样例】
1 10000 9 11

【输出样例】
12

样例解释
6^2 = 36 = 33 base 11
10^2 = 100 = 121 base 9
11^2 = 121 = 121 base 10
12^2 = 144 = 121 base 11
20^2 = 400 = 484 base 9
22^2 = 484 = 484 base 10
24^2 = 576 = 484 base 11
72^2 = 5184 = 3993 base 11
82^2 = 6724 = 10201 base 9
84^2 = 7056 = 5335 base 11
91^2 = 8281 = 12321 base 9
100^2 = 10000 = 14641 base 9

回复列表 (共1个回复)

沙发

program base;
var s:array[1..10000] of integer;
    top,bot,min,max,i,j,can,tot:longint;

procedure change(x,num:longint);
var long,n,k:longint;
    b:boolean;
begin
 n:=num;
 b:=true;
 fillchar(s,sizeof(s),0);
 long:=0;
 while n>0 do
  begin
   inc(long);
   s[long]:=n mod x;
   n:=n div x;
  end;
 for k:=1 to long div 2 do
  if s[k]<>s[long+1-k] then begin b:=false; break; end;
 if b then inc(can);
end;

begin
 assign(input,'base.in'); reset(input);
 assign(output,'base.out'); rewrite(output);
 tot:=0;
 readln(min,max,top,bot);

 for i:=trunc(sqrt(min)) to trunc(sqrt(max)) do
 begin
  can:=0;
  for j:=top to bot do change(j,i*i);
  if can=1 then inc(tot);
 end;

 writeln(tot);
 close(input); close(output);
end.

我来回复

您尚未登录,请登录后再回复。点此登录或注册