USACO 1.2 回文平方数

本文介绍了一种算法,用于找出特定进制下其平方为回文数的所有整数(范围1到300)。通过枚举和转换进制的方法,实现对回文数的有效判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

回文平方数

题目描述

回文数是指从左向右念和从右向左念都一样的数。如12321就是一个典型的回文数。

给定一个进制B(2<=B<=20,由十进制表示),输出所有的大于等于1小于等于300(十进制下)且它的平方用B进制表示时是回文数的数。用’A’,’B’……表示10,11等等。

分析:主程序不长,枚举1~300并判断,转B进制的时候存数组里,最后注意大于10要输出字母!

代码

var
  a:array[0..10000] of longint;
  s:string;
  p,i,j,n:longint;


procedure change(x:longint);
begin
  p:=0;
  while x<>0 do
    begin
      inc(p);
      a[p]:=x mod n;
      x:=x div n;
    end;
end;


function check:boolean;
var
  i,j:longint;
begin
  check:=true;
  i:=1;j:=p;
  while i<=j do
    begin
      if a[i]<>a[j] then exit(false);
      inc(i);dec(j);
    end;
end;


begin
  readln(n);
  for i:=1 to 300 do
    begin
      change(sqr(i));
      if check then
        begin
          change(i);
          for j:=p downto 1 do
            if a[j] in [0..9] then write(a[j]) else write(chr(a[j]+55));
          change(sqr(i));
          write(' ');
          for j:=p downto 1 do
            if a[j] in [0..9] then write(a[j]) else write(chr(a[j]+55));
          writeln;
        end;
    end;
end.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值