*高精度除法*
#题目大意#
高精度除法
#输入格式#
共两行,每行一个数: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;
}