社区讨论

高精加和高精乘的函数没有问题,但过不了,求助,感谢感谢感谢!!!

P1009[NOIP 1998 普及组] 阶乘之和参与者 3已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@lo1t0cof
此快照首次捕获于
2023/10/23 02:30
2 年前
此快照最后确认于
2023/11/03 03:06
2 年前
查看原帖
CPP
#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;
}

回复

7 条回复,欢迎继续交流。

正在加载回复...