回 帖 发 新 帖 刷新版面

主题:[讨论]请老师和学长们不吝赐教:奥赛题精确题解(Pascal)

三次方求和
       给你一个三位数,你要对这个三位数的各位数字的3次方求和,然后再对求出的和中各位数字的3次方求和,如此一直继续下去,判断最后能否得到一个不再变化的固定值。如能得到一个固定值,就告诉我这个固定值;如果不能,则告诉我提示信息“error”。注意了,在求解过程中,若某一次求和得到的值超过3位数,则取该数的低三位继续往下运算……
例如:对于三位数111,则第一次计算应该是1×1×1 + 1×1×1 + 1×1×1=3。第二次应是0×0×0 + 0×0×0 + 3×3×3=27。第三次应是0×0×0 + 2×2×2 + 7×7×7=351。第四次应是3×3×3 + 5×5×5 + 1×1×1=153。第五次应是1×1×1 + 5×5×5 + 3×3×3=153,与第四次结果重合,不再计算,输出固定值153。

输入:一行,一个三位数N(100≤N≤999)。

输出:一行,如能得到一个固定值,则输出这个固定值;如不能,输出提示信息“error”。

样例1:
输入:(cubsum.in)
111

输出:(cubsum.out)
153
样例2:
输入:
102

输出:
error
0

回复列表 (共1个回复)

沙发

如果有答案的话就很简单了,但是如果没有答案呢,就要从数学的角度上考虑了吧,RT地做下去如果没有答案会不会出现某种循环呢?

如果有,那么结果如下了(样例2有错):

var
	xh:array[1..1000000] of integer;
	i,j:longint;
	
function lf(x:integer):integer;
begin
	lf:=((x div 100)*(x div 100)*(x div 100)+(x mod 100 div 10)*(x mod 100 div 10)*(x mod 100 div 10)+(x mod 10)*(x mod 10)*(x mod 10)) mod 1000;
end;
	
begin
	assign(input,'cubsum.in'); reset(input);
	assign(output,'cubsum.out'); rewrte(output);
	
	readln(xh[1]);

	i:=2;
	xh[i]:=lf(xh[1]);
	while true do
	begin
		if xh[i]=xh[i-1] then
		begin
			writeln(xh[i]);
			close(input);
			close(output);
			halt;
		end;
		for j:=1 to i-2 do
			if xh[i]=xh[j] then
			begin
				writeln('error');
				close(input);
				close(output);
				halt;
			end;
		inc(i);
		xh[i]:=lf(xh[i-1]);
	end;
	
end.

我来回复

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