*高精度除法*
#題目大意#
高精度除法
#輸入格式#
共兩行,每行一個數: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;
}