靳东鬼吹灯之精绝古城:pascal题目求解

来源:百度文库 编辑:高校问答 时间:2024/04/28 07:42:33
问题2:数码阶乘和(digfac)
在数学中,N阶乘(记作N!)的定义是N * (N-1) * (N-2) * ... * 1。而且规定0!=1。
例如5! = 5 * 4 * 3 * 2 * 1 = 120。
这里,我们在定义一个数码阶乘和,也就是将一个数的各位数码的阶乘加起来。例如25的数码阶乘和是122,因为2! + 5! = 2 + 120 = 122。
再计算122的数码阶乘和,1! + 2! + 2! = 5。
我们可以一直按照定义计算下去,从25出发,可以得到一串数:25 -> 122 -> 5 -> 120 -> 4 -> 24 -> 26 -> 722 -> 5044 -> 169 -> 363601 -> 1454 -> 169 ->……
发现到了169就出现重复了,以后必然循环。该问题就是输入起始数,输出到哪个数开始循环。

输入:digfac.in
一个整数N,1<=N<=9999999。

输出:digfac.out
从N开始,不断地求数码阶乘和,到哪个数开始循环。到那里为止,所有产生的数都要输出,一行输出一个数。

样例:
输入
25
输出
25
122
5
120
4
24
26
722
5044
169
363601
1454
169

program digfac;

type int=0..9999999;
Tlist=array[0..100] of int;
function mult(n:int):int;
var
tmp,i:int;
begin
if (n=0) or (n=1) then mult:=1
else begin
tmp:=1;
for i:=1 to n do tmp:=tmp*i;
mult:=tmp;
end;
end;

function dig(var n:int):int;
var tn,tmod,tmp:int;
begin
tn:=n;
tmp:=0;
repeat
tmod:=tn mod 10;
tn:=tn div 10;
tmp:=tmp+ mult(tmod);
until tn=0;
dig:=tmp;
n:=tmp;
end;

procedure WriteDigList(n:int);
var

list:Tlist;

function Inlist(n:int):boolean;
var i:int;
re:boolean;
begin
re:=false;
if n>1 then for i:=1 to (list[0]-1) do if list[i]=n then re:=true;
Inlist:=re;
end;

var k,tmp:int;
begin
tmp:=n;
list[0]:=0;
k:=0;
repeat
list[k+1]:= dig(tmp);
k:=k+1;
list[0]:=list[0]+1;
writeln(list[k])
until InList(list[k]);

end;

var a:int;
begin
write('Type in a number:');
readln(a);
WriteDigList(a);
readln;
end.

采纳答案下吧(包括前面那题)
不要那么不厚道嘛

需要高精度