题目
题目:[NOIP1999]回文数 题目描述 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之
题目:[NOIP1999]回文数
题目描述
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数.
例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数.
又如:对于10进制数87:
STEP1:87+78 = 165 STEP2:165+561 = 726
STEP3:726+627 = 1353 STEP4:1353+3531 = 4884
在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884.
输入格式
第一行是整数N(2
题目:[NOIP1999]回文数
题目描述
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数.
例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数.
又如:对于10进制数87:
STEP1:87+78 = 165 STEP2:165+561 = 726
STEP3:726+627 = 1353 STEP4:1353+3531 = 4884
在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884.
输入格式
第一行是整数N(2
提问时间:2021-03-29
答案
本题也很简单,只是考查了一些基本编程能力,没有什么难度可言.只要细心,本题的分是可以轻松拿到手的.
这里数采用字符串表示(其他方法当然也可以),因为处理方便.
N进制的加法是本题的重头戏,处理如下:
1)字符->数字,可以用数组来简化程序,即digit和chars数组
2)做加法,保留各位数字和进位,就想做高精度加法一样.
g是进位.
const
step:integer=0;
chars:array[0..15] of char=('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
var
digit:array[char] of integer;
i,n,g:integer;
m,s:string;
ok:boolean;
begin
for i:=0 to 9 do digit[char(ord('0')+i)]:=i;
for i:=0 to 5 do digit[char(ord('A')+i)]:=i+10;
write('n='); readln(n);
write('m='); readln(s);
for i:=1 to length(s) do s[i]:=upcase(s[i]);
repeat
ok:=true;
for i:=1 to length(s) div 2 do
if s[i]s[length(s)+1-i] then ok:=false;
if ok then break;
inc(step);
m:=s; g:=0;
for i:=length(m) downto 1 do
begin
s[i]:=chars[(digit[m[i]]+digit[m[length(m)+1-i]]+g) mod n];
g:=(digit[m[i]]+digit[m[length(m)+1-i]]+g) div n;
end;
if g>0 then s:=chars[g]+s;
until step>=30;
if ok then
writeln('STEP=',step)
else
writeln('Impossible');
end.
没问题请采纳,有问题追问.
这里数采用字符串表示(其他方法当然也可以),因为处理方便.
N进制的加法是本题的重头戏,处理如下:
1)字符->数字,可以用数组来简化程序,即digit和chars数组
2)做加法,保留各位数字和进位,就想做高精度加法一样.
g是进位.
const
step:integer=0;
chars:array[0..15] of char=('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
var
digit:array[char] of integer;
i,n,g:integer;
m,s:string;
ok:boolean;
begin
for i:=0 to 9 do digit[char(ord('0')+i)]:=i;
for i:=0 to 5 do digit[char(ord('A')+i)]:=i+10;
write('n='); readln(n);
write('m='); readln(s);
for i:=1 to length(s) do s[i]:=upcase(s[i]);
repeat
ok:=true;
for i:=1 to length(s) div 2 do
if s[i]s[length(s)+1-i] then ok:=false;
if ok then break;
inc(step);
m:=s; g:=0;
for i:=length(m) downto 1 do
begin
s[i]:=chars[(digit[m[i]]+digit[m[length(m)+1-i]]+g) mod n];
g:=(digit[m[i]]+digit[m[length(m)+1-i]]+g) div n;
end;
if g>0 then s:=chars[g]+s;
until step>=30;
if ok then
writeln('STEP=',step)
else
writeln('Impossible');
end.
没问题请采纳,有问题追问.
举一反三
我想写一篇关于奥巴马的演讲的文章,写哪一篇好呢?为什么好
奥巴马演讲不用看稿子.为什么中国领导演讲要看?
想找英语初三上学期的首字母填空练习……
英语翻译
1,人们染上烟瘾,最终因吸烟使自己丧命.
最新试题
- 1如图,在梯形ABCD中,AD∥BC,对角线AC与BD垂直相交于O,MN是梯形ABCD的中位线,∠DBC=30°,求证:AC=MN.
- 2已知a是第一象限的角,且cosa=5/13,求sin(a+派/4)/cos(2a+3派)
- 3在一块形状为三角形的空地上植树,每条边上种5棵,最多可以植多少棵?
- 43/1x-4/3x=5/26 解方程
- 5翻译:benchmark rate
- 6长1米宽20米面积是多少 周长是多少?
- 7一个正方形是轴对称图形,它有2条对称轴.判断对搓
- 8My birthday is on November 5th (改为否定句)
- 9人生命是有限的,但知识是无限的,正如古人说( )
- 10January is the first month of the year.什么
热门考点
- 152张桥牌中有4张A,甲、乙、丙、丁每人任意分到13张牌,已知甲手中有一张A,求丙手中至少有一张A的概率.
- 2请专家!翻译一段【古文】!
- 3然去中州万里的去是什么意思
- 4方仲永具有怎样非凡的才能?(用原文回答) (1) ;(2)
- 5怎么时刻坚守信念坚持理想为之奋斗且保持一颗平静的心态
- 6在1批商品合格率检查中,一批商品合格的有294件,合格率是98%,这批商品共有多少件?
- 7请写一篇英语作文,主题为"weight loss":以你个人或熟悉的人为例,说明造成这个人体重过重的原因:a)爱吃油炸食品和肉;b)睡得太多;c)不喜欢进行体育锻炼.然后提出你认为理想的解决之道:1.
- 8play an active part in 造句
- 9(1)1/4,4/9,7/16,10/25( )( )
- 10荒漠草原与草原化荒漠的区别