没错又是我,又来求优化了~~
我听取了上一位大佬的建议,把正常的乘方改成快速幂。
但是哪位大佬的第二点建议“可以在乘法计算完之后只保留后 500 位。”,由于我太蒻了,听不懂思密达,求luogu的大佬们帮我改进一下高精乘法并把改后高精乘法的代码发在讨论区,谢谢!!
my code :
#include<bits/stdc++.h>
using namespace std;
const int N = 1000000;
int a[N],b[N],c[N];
string div(string A,string B){ // 求A整除B得到多少
// 将B转化为单精度整数
int _b=stoi(B);
//cout << _b<<endl;
memset(c, 0, sizeof(c));
if (A.size()<B.size()){
return "0";
}
else if (B=="0") return "Error: Division by zero";
int t=0;
for (int i=0;i<A.size();i++){
int q=(A[i]-'0')+t*10;
c[i]=q/_b;
t=q%_b;
// cout << c[i] << " " << t << endl;
}
int f=0;
// 去除前导零
string ans="";
for (int i=0;i<A.size();i++){
if (f==0&&c[i]!=0){
f=1;
ans=ans+char(c[i]+'0');
}
else if (f==0&&c[i]==0)continue;
else ans=ans+char(c[i]+'0');
}
return ans;
}
string times(string A, string B) {
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));
reverse(A.begin(), A.end());
reverse(B.begin(), B.end());
for (int i = 0; i < A.size(); i++)a[i] = A[i] - '0';
for (int i = 0; i < B.size(); i++)b[i] = B[i] - '0';
for (int i = 0; i < A.size(); i++) {
for (int j = 0; j < B.size(); j++) {
c[i + j] += a[i] * b[j];
}
}
int t = 0;
for (int i = 0; i < A.size() + B.size() + 10; i++) {
t = c[i] / 10;
c[i] %= 10;
c[i + 1] += t;
//cout << c[i] << " ";
}
int f = 0;
string C = "";
for (int i = A.size() + B.size() + 10; i >= 0; i--) {
if (c[i] == 0 && f == 0)continue;
else {
f = 1;
C = C + char(c[i] + '0');
}
}
return C;
}
string qp(string a,string b){ // a^b
if (b=="1")return a;
string k=div(b,"2");
string kk=times(a,a);
if ((b[b.size()-1]-'0')%2==0){
return qp(kk,k);
}
else if ((b[b.size()-1]-'0')%2==1){
return times(a,qp(kk,k));
}
}
string jian(string a){//a-1
int n=a.size();
//a[n-1]=char((a[n-1]-'0')-1);
char c=a[n-1];
int cc=c-'0';
cc-=1;
c=char(cc+'0');
a[n-1]=c;
return a;
}
int main() {
string p="1279";
cin >> p;
string ans=qp("2",p);
//cout << ans<<endl;
ans=jian(ans);
int m=ans.size();
cout <<m<<endl;
string z="";
if (m>500){
for (int i=m-500;i<m;i++){
z=z+ans[i];
}
for (int i=0;i<10;i++){
for (int j=i*50;j<i*50+50;j++)cout <<z[j];
cout<<endl;
}
}
else {
int r=500-m;
z=ans;
for (int i=0;i<r;i++)z="0"+z;
for (int i=0;i<10;i++){
for (int j=i*50;j<i*50+50;j++)cout <<z[j];
cout<<endl;
}
}
return 0;
}
QWQWQWQWQWQWQWQWQWQQWWQWQWQWQ