QYlucky @ 2023-08-17 17:19:37
#include<iostream>
using namespace std;
string cheng(string s1,string s2){//高精乘
int a[100000],b[100000],c[100000];
string ans="";
int la,lb,lc;
la=s1.length();
lb=s2.length();
for(int i=0;i<la;i++){
a[la-i]=s1[i]-'0';
}
for(int i=0;i<lb;i++){
b[lb-i]=s2[i]-'0';
}
lc=la+lb;
for(int i=1;i<=la;i++){
for(int j=1;j<=lb;j++){
c[i+j-1]+=a[i]*b[j];
c[i+j]+=c[i+j-1]/10;
c[i+j-1]%=10;
}
}
while(c[lc]==0&&lc>1) lc--;
for(int i=lc;i>=1;i--){
ans+=c[i]+'0';
}
return ans;
}
string jia(string a,string b)//高精加
{
string ans;
int na[100000]= {0},nb[100000]= {0};
int la=a.size(),lb=b.size();
for(int i=0; i<la; i++)//a倒置放入na数组
na[la-1-i]=a[i]-'0';
for(int i=0; i<lb; i++)//b倒置放入nb
nb[lb-1-i]=b[i]-'0';
int lmax=la>lb?la:lb;
for(int i=0; i<lmax; i++){
na[i]+=nb[i];
na[i+1]+=na[i]/10;//进位
na[i]%=10;//进位后余下的
}
if(na[lmax])
lmax++;
for(int i=lmax-1; i>=0; i--)//把结果赋值给字符串ans
ans+=na[i]+'0';
return ans;
}
int main(){
int n;
cin>>n;
string a="1";
string ans="0";
for(int i=1;i<=n;i++){
string b="";
if(i<10) b=i+'0';
else{
b=i/10+'0';
b+=i%10+'0';
}
a=cheng(a,b);
ans=jia(ans,a);
}
cout<<ans<<endl;
return 0;
}
by YMnRb @ 2023-08-17 19:08:22
还嘴硬说高精加和高精乘的函数没有问题
高精加函数都把数组全部初始化为0了,高精乘怎么就忘了啊
// 略去上文
string cheng(string s1,string s2){
int a[100000],b[100000],c[100000]={};
// 略去下文
a 和 b 不用初始化是因为下文这段代码起到了初始化的作用:
for(int i=0;i<la;i++){
a[la-i]=s1[i]-'0';
}
for(int i=0;i<lb;i++){
b[lb-i]=s2[i]-'0';
}
by YMnRb @ 2023-08-17 19:12:14
反而高精加函中无需将数组na
和nb
初始化,因为下文也有一段代码起到了初始化的作用 @QYlucky
by zhouzihang3 @ 2023-08-17 19:39:35
@YuanJiayan 用int数组是不是好点,能用memset还可以省略转化
by YMnRb @ 2023-08-17 19:51:28
@ZE_WY 你是说直接把高精度函数参数类型改为int
数组吗?如果是的话,我想说几点:
={}
和调用memset
完全是等效的,时间应该也相差不大; string
,毕竟输出方便; by YMnRb @ 2023-08-17 20:04:42
@ZE_WY 而且这也与代码习惯有关吧,有些人喜欢全用int
,有些人喜欢全用string
,也有人喜欢用char
数组,还有些人喜欢int
和string
混用。
——沃茨基·硕德
by QYlucky @ 2023-08-18 15:25:28
@YuanJiayan 感谢!!!
by zhouzihang3 @ 2023-08-18 19:02:15
@YuanJiayan 《我自己·说的(方言++)》