高精度除法+麦森数

*高精度除法*

#题目大意#

高精度除法

#输入格式#

共两行,每行一个数: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;
} 

猜你喜欢

转载自blog.csdn.net/qq_40681184/article/details/81020149