日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

[蓝桥杯][算法训练VIP]麦森数(Java大数+快速幂)

發布時間:2023/12/15 java 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [蓝桥杯][算法训练VIP]麦森数(Java大数+快速幂) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述
形如2p-1的素數稱為麥森數,這時P一定也是個素數。但反過來不一定,即如果P是個素數,2p-1不一定也是素數。到1998年底,人們已找到了37個麥森數。最大的一個是P=3021377,它有909526位。麥森數有許多重要應用,它與完全數密切相關。
任務:從文件中輸入P(1000< P< 3100000),計算2p-1的位數和最后500位數字(用十進制高精度數表示)
輸入
文件中只包含一個整數P(1000< P< 3100000)
輸出
第一行:十進制高精度數2P-1的位數。
第2-11行:十進制高精度數2p-1的最后500位數字。(每行輸出50位,共輸出10行,不足500位時高位補0)
不必驗證2p-1與P是否為素數。
樣例輸入
1279
樣例輸出
386
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000104079321946643990819252403273640855
38615262247266704805319112350403608059673360298012
23944173232418484242161395428100779138356624832346
49081399066056773207629241295093892203457731833496
61583550472959420547689811211693677147548478866962
50138443826029173234888531116082853841658502825560
46662248318909188018470682222031405210266984354887
32958028878050869736186900714720710555703168729087
思路:單純的用java大數+快速冪,還是會有三個樣例超時。是因為在快速冪的時候,如果數字過大,還是會很耗時的。因為只要求求500位,那么我們就一直取余10的500次方,這樣就一直是最大500位。但是這樣的話,數字長度就不能保證了。其實麥森數的數字長度可以直接計算出來。計算步驟如下,圖片來源:

代碼如下:

import java.math.BigInteger; import java.util.Scanner;public class Main{public static BigInteger qsm(BigInteger x,int y) {BigInteger w=new BigInteger("10");w=w.pow(500);BigInteger ans=BigInteger.ONE;while(y>0){if(y%2==1) ans=ans.multiply(x).mod(w);y>>=1;x=x.multiply(x).mod(w);}return ans;}public static void main(String args[]) {Scanner cin=new Scanner(System.in);int n;n=cin.nextInt();System.out.println((int)(n*Math.log10(2)+1));String o="2";BigInteger a=new BigInteger(o);a=qsm(a,n);a=a.subtract(BigInteger.ONE);String s=a.toString();if(s.length()<500){String t="";int x=500-s.length();for(int i=0;i<x;i++) t=t+'0';s=t+s;}int cnt=0;String t="";for(int i=s.length()-500;i<s.length();i++){t=t+s.charAt(i);cnt++;if(cnt==50) {cnt=0;System.out.println(t);t="";}}} }

努力加油a啊,(o)/~

總結

以上是生活随笔為你收集整理的[蓝桥杯][算法训练VIP]麦森数(Java大数+快速幂)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。