高精度除法+麥森數

*高精度除法*

#題目大意#

高精度除法

#輸入格式#

共兩行,每行一個數:m,n。

#輸出格式#

共一行,m/n

#樣例數據#

input

73861758
12471

output

5922

#分析#

(來自蒟蒻)用字符讀入,用數組記錄每一位。最左端對齊,將除法轉化爲減法,一位一位往下減,直至不能再減。輸出時注意首位0.(特判答案爲0時的情況)

#代碼#

#include<bits/stdc++.h>
using namespace std;
string m,n;
int lm,ln;
int a[22222],b[22222];
int ans[22222]={};
int num=0;
int BJ()
{
	for(int i=0;i<=lm-1;i++)
	{
		if(a[i]>b[i])
		 return 1;
		else
		if(a[i]<b[i])
		 return 0;
	}
	return 1;
}//比較大小
int find()
{
	int i=0;
	for(;a[i]==0;i++);
	return i;
}//尋找不是0的最高位
int main()
{
	cin>>m>>n;
	for(int i=0;i<=m.size()-1;i++)
	 a[i]=m[i]-'0';
	for(int i=0;i<=n.size()-1;i++)
	 b[i]=n[i]-'0';
	lm=m.size();
	ln=n.size();
	if(lm<ln)
	{
		cout<<0<<endl;
		return 0;
	}//如果m的長度小於n的長度,直接輸出0
	int fm=0;
	int fn=-1;
	for(;;)
	{
		fm=find();
		int k=0;
		for(;BJ()==1;)
		{
			for(int i=fm+ln-1;i>=fm;i--)
			{
				a[i]-=b[i];
				if(a[i]<0)
				{
					a[i]+=10;
					a[i-1]--;
				}//將除法轉換爲減法
			}
			k++;
		if(BJ()==0)
		 break;//直至不能再減
		}
		ans[num]=k;
		if(lm-fm<ln||(lm-fm==ln&&BJ()==0))
		 break;//不能再減
		 fn++;
		if(fn+ln>=lm)
		 break;//不能再減
		for(int i=fn+ln;i>=fn+1&&i-1>=0;i--)
		 b[i]=b[i-1];
		for(int i=fn;i>=0;i--)
		 b[i]=0;//往後移位
		 num++;
	}
	int i=0;
	for(;ans[i]==0&&i<=num;i++);//去除前導0
	for(;i<=num;i++)
	 cout<<ans[i];//輸出
	cout<<endl;
	return 0;
}

*麥森數*

#題目大意#

如2^P-1的素數稱爲麥森數,這時P一定也是個素數。但反過來不一定,即如果P是個素數,2^P-1不一定也是素數。到1998年底,人們已找到了37個麥森數。最大的一個是P=3021377,它有909526位。麥森數有許多重要應用,它與完全數密切相關。(感謝互動百科)任務:從文件中輸入P(1000<P<3100000),計算2^P-1的位數和最後500位數字(用十進制高精度數表示)

#輸入格式#

讀入P(1000<P<3100000)

#輸出格式#

第一行輸出位數,第二行輸出2^P-1的後500位(標準格式詳見樣例數據)

#樣例數據#

input

1279

output

386
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000104079321946643990819252403273640855
38615262247266704805319112350403608059673360298012
23944173232418484242161395428100779138356624832346
49081399066056773207629241295093892203457731833496
61583550472959420547689811211693677147548478866962
50138443826029173234888531116082853841658502825560
46662248318909188018470682222031405210266984354887
32958028878050869736186900714720710555703168729087

#分析#

emmm。這就是一道快速冪+高級精度乘法。前面log算位數。(詳見度娘)

#代碼#

#include<bits/stdc++.h>
using namespace std;
int p;
int f[100100];
int a[100100],b[100100];
int main()
{
	cin>>p;
	cout<<int(log10(2)*p+1)<<endl;//求位數
	a[1]=2;
	b[1]=1;
	for(;p!=0;)
	{
		if(p%2==1)
		{
			for(int i=1;i<=500;i++)
			{
				for(int j=1;j<=500;j++)
				{
					f[i+j-1]+=a[j]*b[i];
				}
			}
			for(int i=1;i<=501;i++)
			{
				f[i]+=f[i-1]/10;
				f[i-1]%=10;
			}
			for(int i=1;i<=500;i++)
			{
				b[i]=f[i];
				f[i]=0;
			}
		}
		p/=2;
			for(int i=1;i<=500;i++)
			{
				for(int j=1;j<=500;j++)
				{
					f[i+j-1]+=a[i]*a[j];
				}
			}
			for(int i=1;i<=501;i++)
			{
				f[i]+=f[i-1]/10;
				f[i-1]%=10;
			}
			for(int i=1;i<=500;i++)
			{
				a[i]=f[i];
				f[i]=0;
			}
    }//快速冪
    b[1]-=1;
	for(int i=500;i>=1;i--)
	 if(i%50==0&&i!=500)
	 {
	 	cout<<endl;
	 	cout<<b[i];
	 }
	 else
	 {
	 	cout<<b[i];
	 }//輸出
	 return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章