noip 用pascal语言设计考虑如下序列的生成算法:从整数n开始,如果n是偶数,把他除以2;如果他是奇数,把他乘3加1.用新得到的值重复上面的步骤,知道n=1为止.例如n=22时,这个算法的生成序列是:2
来源:学生作业帮助网 编辑:作业帮 时间:2024/06/30 10:34:59
![noip 用pascal语言设计考虑如下序列的生成算法:从整数n开始,如果n是偶数,把他除以2;如果他是奇数,把他乘3加1.用新得到的值重复上面的步骤,知道n=1为止.例如n=22时,这个算法的生成序列是:2](/uploads/image/z/3602656-64-6.jpg?t=noip+%E7%94%A8pascal%E8%AF%AD%E8%A8%80%E8%AE%BE%E8%AE%A1%E8%80%83%E8%99%91%E5%A6%82%E4%B8%8B%E5%BA%8F%E5%88%97%E7%9A%84%E7%94%9F%E6%88%90%E7%AE%97%E6%B3%95%EF%BC%9A%E4%BB%8E%E6%95%B4%E6%95%B0n%E5%BC%80%E5%A7%8B%2C%E5%A6%82%E6%9E%9Cn%E6%98%AF%E5%81%B6%E6%95%B0%2C%E6%8A%8A%E4%BB%96%E9%99%A4%E4%BB%A52%EF%BC%9B%E5%A6%82%E6%9E%9C%E4%BB%96%E6%98%AF%E5%A5%87%E6%95%B0%2C%E6%8A%8A%E4%BB%96%E4%B9%983%E5%8A%A01.%E7%94%A8%E6%96%B0%E5%BE%97%E5%88%B0%E7%9A%84%E5%80%BC%E9%87%8D%E5%A4%8D%E4%B8%8A%E9%9D%A2%E7%9A%84%E6%AD%A5%E9%AA%A4%2C%E7%9F%A5%E9%81%93n%3D1%E4%B8%BA%E6%AD%A2.%E4%BE%8B%E5%A6%82n%3D22%E6%97%B6%2C%E8%BF%99%E4%B8%AA%E7%AE%97%E6%B3%95%E7%9A%84%E7%94%9F%E6%88%90%E5%BA%8F%E5%88%97%E6%98%AF%EF%BC%9A2)
noip 用pascal语言设计考虑如下序列的生成算法:从整数n开始,如果n是偶数,把他除以2;如果他是奇数,把他乘3加1.用新得到的值重复上面的步骤,知道n=1为止.例如n=22时,这个算法的生成序列是:2
noip 用pascal语言设计
考虑如下序列的生成算法:从整数n开始,如果n是偶数,把他除以2;如果他是奇数,把他乘3加1.用新得到的值重复上面的步骤,知道n=1为止.例如n=22时,这个算法的生成序列是:
22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
人们猜想(没有证明)对于任意的整数n,该算法总能得到终止于n=1.这个猜想至少对于1000000以内的数都正确.
对于给定的n,该序列的元素(包括1)个数称之为n的循环节长度.例如上例中循环节长度为16.
输入格式 Input Format
输入两个数i,j,你的任务是计算i到j(包含i和j),之间的整数中,循环节长度最大的值
并且有多组数据!
0
noip 用pascal语言设计考虑如下序列的生成算法:从整数n开始,如果n是偶数,把他除以2;如果他是奇数,把他乘3加1.用新得到的值重复上面的步骤,知道n=1为止.例如n=22时,这个算法的生成序列是:2
program ex01;
var
a:array[1..100000000] of integer;
b,c:array[1..100] of longint;
i,n,m,x,y,j:longint;
procedure search(x,y,z:longint);
begin
if ( (y>1000000) or (a[y]0)) then
if odd(y) then search(x,y+y+y+1,z+1)
else search(x,y shr 1,z+1)
else a[x]:=a[y]+z;
end;
procedure f(x:longint);
begin
if a[x]0 then exit;
if odd(x) then begin if x+x+x+1>1000000 then search(x,x,0) else begin f(x+x+x+1);a[x]:=a[x+x+x+1]+1;end;end
else begin f(x shr 1);a[x]:=a[x shr 1]+1;end;
end;
begin
fillchar(a,sizeof(a),0);
read(n);
a[1]:=1;
a[2]:=2;
a[4]:=3;
for i:=1 to n do
read(b[i],c[i]);
for j:=1 to n do
begin
m:=0;
for i:=b[j] to c[j] do
begin
f(i);
if a[i]>m then m:=a[i];
end;
writeln(b[j],' ',c[j],' ',m);
end;
end.
不过你需要先输入有几组数据,不然的话你可以改动一下输入