題目描述 形如2P-1的素數稱為麥森數,這時P一定也是個素數。但反過來不一定,即如果P是個素數,2P-1不一定也是素數。到1998年底,人們已找到了37個麥森數。最大的一個是P=3021377,它有909526位。麥森數有許多重要應用,它與完全數密切相關。 任務:從文件中輸入P(1000<=P<3100000),計算2P-1的位數和最后500位數字(用十進制高精度數表示)
輸入輸出格式 輸入格式: 文件中只包含一個整數P(1000<=P<3100000) 輸出格式: 第一行:十進制高精度數2^P-1的位數。 第2-11行:十進制高精度數2^P-1的最后500位數字。(每行輸出50位,共輸出10行,不足500位時高位補0) 不必驗證2^P-1與P是否為素數。
輸入輸出樣例 輸入樣例#1: 1279 輸出樣例#1: 386 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000104079321946643990819252403273640855 38615262247266704805319112350403608059673360298012 23944173232418484242161395428100779138356624832346 49081399066056773207629241295093892203457731833496 61583550472959420547689811211693677147548478866962 50138443826029173234888531116082853841658502825560 46662248318909188018470682222031405210266984354887 32958028878050869736186900714720710555703168729087
說明 這一題要用到分治,將高精乘分治,這過程要用多些循環。 我就是因為分治弄得不好,改了很久才寫出來。
程序如下
var i,n:longint; a,b:array[1..1000] of longint;PRocedure main(m:longint);var i,j:longint;begin if m<=0 then exit; main(m div 2); for i:=1 to 500 do for j:=1 to 500 do b[i+j-1]:=b[i+j-1]+a[i]*a[j]; for i:=1 to 1000 do begin if (m mod 2)=1 then a[i]:=b[i]*2 else a[i]:=b[i]; b[i]:=0; end; for i:=1 to 500 do begin a[i+1]:=a[i+1]+a[i] div 10; a[i]:=a[i] mod 10; end;end;begin readln(n); a[1]:=1; writeln(trunc(n*ln(2)/ln(10))+1); main(n); a[1]:=a[1]-1; for i:=500 downto 1 do begin write(a[i]); if i mod 50=1 then writeln; end;end.新聞熱點
疑難解答