ブルーブリッジカップ学習アルゴリズムいくつかの質問マイセンC / C ++

アルゴリズムを訓練質問のマイセン数

リソース制限の
制限時間:1.0秒メモリ制限:256.0メガバイトの
問題が記載
  素数2P-1マセソンの数と呼ばれ、その後、Pはまた、プライミングしなければなりません。Pが素数であれば必ずしもそうではないがその逆、すなわち、2P-1は必ずしも素数ではありません。1998年の終わりまでに、それは37マイセン番号を発見されました。909526を持っている最大のP = 3021377、です。マイセンの数は、それが密接完全数に関連して、多くの重要なアプリケーションを持っています。
  タスク:ファイルからの入力、P(1,000 <P <310万)は 、 ビット2P-1 500の数を計算し、最後の桁(小数精度の数値で)
入力形式の
  ファイルは、唯一のP(1,000 <P <310万整数が含ま)
出力形式
  最初のライン:精密2P-1の桁の数。
  行2-11:小数点以下の桁精度2P-1の最後の500。(より少ない場合、高ビット0より各出力線50、共通出力線10、500)は、
  2P-1を検証する必要はなく、Pは素数です。
サンプル入力
1279
サンプル出力
386
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000104079321946643990819252403273640855
38615262247266704805319112350403608059673360298012
23944173232418484242161395428100779138356624832346
49081399066056773207629241295093892203457731833496
61583550472959420547689811211693677147548478866962
50138443826029173234888531116082853841658502825560
46662248318909188018470682222031405210266984354887
32958028878050869736186900714720710555703168729087

アイデア:問題がタイムアウトすることがあり、大きな困難な操作の数は、最後の桁と値を取得することはより困難であるので、それは、(int型)((log10の(ベース2プラスワンに10桁の対数を求めることができ、あります!N))+ 1)この式で、本来のNビットの数の階乗必要なく、電源2の中央側を見つけることができ、次のようになる。(INT)((log10の(2))* P + 1)、Pは(INT)((log10の(2 ^ P))+ 1)となり、pはに降ろす必要があり、底部2の電源、2 ^ pベース10の式でありますあなたは1を追加する必要がありますので(int型)((log10の(2))* P + 1)、なぜ我々はそれ増やす必要があり、このフォームは、10までの操作のための3桁の数字は、実際には、その後、2つに500をオンにしますコンピューティングパワーもので、この直接コードに、前回の記事で書いた二回、達成するために二分法と高速なアプローチを使用することができます。

コードは以下の通りであります:

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
void han(int a[501],int b[501]){
	int c[501],i,j,k,t,s=0;
	memset(c,0,sizeof(c));
	for(i=499;i>=0;i--){
		k=i;s=0;
		for(j=499;j>=0;j--){
			t=a[i]*b[j];
			c[k]=c[k]+t%10+s;  //高精度乘法比如31乘31,需要1乘31加3乘31,而3乘31的位数会高一位,把平时乘法思想用代码实现即可
			s=t/10+c[k]/10;
			c[k]=c[k]%10;	
			k--;
			if(k<0){
				break;
			}
		}
	}
	memcpy(a,c,sizeof(c));
}
int main(){
	int a[501],b[501],i,j,k,p;
	cin>>p;
	cout<<(int)((log10(2))*p+1)<<endl;
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	a[499]=2;b[499]=1;
	while(p>0){
		if(p%2==1){
			han(b,a);
		}
		han(a,a);
		p/=2;
	}
	for(i=0;i<500;i++){
		if(i%50==0 && i>0){
			cout<<endl;
		}
		if(i==499){
			cout<<b[i]-1;  //2的幂次最后一位不会为零,所以不用判断
		} else{
			cout<<b[i];
		}
	}
}
公開された63元の記事 ウォン称賛64 ビュー3502

おすすめ

転載: blog.csdn.net/weixin_45269353/article/details/104801708