pascal题目,求高手解决。
数根(digit)【问题描述】正整数的数根指的是该整数各位数字的和。如果结尾是一位数,那么这个数就是数根。如果结果有两个或两个以的数字,那么就只需将结果的各位数字再相加直...
数根
(digit)
【问题描述】
正整数的数根指的是该整数各位数字的和。如果结尾是一位数,那么这个数就是数根。如果结果有两个或两个以的数字,那么就只需将结果的各位数字再相加直到只是一位数字。
例如正整数24。2和4相加等于6。因为6是一位数,6就是24的数根。再如正整数39。3和9相加等于12。因为12不是一位数,所以必须重复该过程。把1和2相加等于3,这是一位数,也是39的数根。
【输入格式】
输入文件digit.in中有一个整数,这个整数不超过100位。
【输出格式】
输出文件digit.out中仅有一个数,该数是输入的整数的数根。
【样例输入】
123
【样例输出】
6 展开
(digit)
【问题描述】
正整数的数根指的是该整数各位数字的和。如果结尾是一位数,那么这个数就是数根。如果结果有两个或两个以的数字,那么就只需将结果的各位数字再相加直到只是一位数字。
例如正整数24。2和4相加等于6。因为6是一位数,6就是24的数根。再如正整数39。3和9相加等于12。因为12不是一位数,所以必须重复该过程。把1和2相加等于3,这是一位数,也是39的数根。
【输入格式】
输入文件digit.in中有一个整数,这个整数不超过100位。
【输出格式】
输出文件digit.out中仅有一个数,该数是输入的整数的数根。
【样例输入】
123
【样例输出】
6 展开
展开全部
这个题目好像是上一年的初赛题吧?还是其他的我忘了,反正就是竞赛中出现的。我做过,过了,我就写一下解题思路吧。
首先,这个整数不超过一百位,没有一个整数类型能容纳这么大的一个数,所以,我们可以实用字符串记录,也就是string类型。
其次,一百位,也就是一百个数第一次相加最多为9*100=900,不超过整形integer的界限32767,故用string类型读入后,第一次运算即可将结果放进integer类型的变量中。
第三,整数类型要数位数挺麻烦的,所以我们可以将整数类型的结果放进string类型中再次执行第一步操作。由于无论如何都要执行一次操作,所以用repeat语句,而结束条件很明显就是只有一位数,也就是string类型的变量的长度=1。
程序实现如下:
var st:string;
a,i:integer; {定义变量,原本只有两个,由于考虑到要将各位数相加,所以要定义多一个循环变量,一般用i,j.k}
begin
readln(st); {读入要操作的数,因为位数太大,所以用字符串读入}
repeat
a:=0; {首先将储存变量a清零}
for i:=1 to length(st) do a:=a+ord(st[i])-48; {累加,因为在ascii码中,字符'0'为48,'1'为49,以此类推,直到'9'为57}
str(a,st); {将a转换成字符串类型,此时st的值将被覆盖}
until length(st)=1; {直到答案长度为一,也就是一位数,结束}
writeln(st); {输出答案}
end.
首先,这个整数不超过一百位,没有一个整数类型能容纳这么大的一个数,所以,我们可以实用字符串记录,也就是string类型。
其次,一百位,也就是一百个数第一次相加最多为9*100=900,不超过整形integer的界限32767,故用string类型读入后,第一次运算即可将结果放进integer类型的变量中。
第三,整数类型要数位数挺麻烦的,所以我们可以将整数类型的结果放进string类型中再次执行第一步操作。由于无论如何都要执行一次操作,所以用repeat语句,而结束条件很明显就是只有一位数,也就是string类型的变量的长度=1。
程序实现如下:
var st:string;
a,i:integer; {定义变量,原本只有两个,由于考虑到要将各位数相加,所以要定义多一个循环变量,一般用i,j.k}
begin
readln(st); {读入要操作的数,因为位数太大,所以用字符串读入}
repeat
a:=0; {首先将储存变量a清零}
for i:=1 to length(st) do a:=a+ord(st[i])-48; {累加,因为在ascii码中,字符'0'为48,'1'为49,以此类推,直到'9'为57}
str(a,st); {将a转换成字符串类型,此时st的值将被覆盖}
until length(st)=1; {直到答案长度为一,也就是一位数,结束}
writeln(st); {输出答案}
end.
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询