求调,玄关

P1009 [NOIP1998 普及组] 阶乘之和

xiayunpeng @ 2024-10-24 22:56:39

高精度加法有问题

#include<bits/stdc++.h>
using namespace std;

string st(long long n) {
    string sum="", ans="";
    while(n){
        ans+=n%10+'0';
        n/=10;
    }int l=ans.length();
    for (int i = l-1; i >= 0; i--) sum+=ans[i];
    return sum;
}//类型转换(long long -> string) 

string jia(string s1, string s2) {
    string tsum="";//结果字符串 
    int l1=s1.length(),l2=s2.length();
    short sum[2000]={0}/*结果数组*/, a[l1+1]={2000}, b[l2+1]={2000};
    for(int i = l1-1; i >= 0; i--)a[i]=s1[l1-i-1]-'0';
    for(int i = l2-1; i >= 0; i--)b[i]=s2[l2-i-1]-'0';
    int k=0/*进位*/;
    for (int i = 0; i <= max(l1,l2); i++) {
        sum[i]=a[i]+b[i]+k;
        k=sum[i]/10;
        sum[i]%=10;
    }
    bool flag=0;
    for (int i = l1+l2+1; i >= 0; i--)
        if(sum[i]!=0||flag)flag=1,tsum+=sum[i]+'0';
    if(!flag)return "0";
    return tsum;
}//高精度加法(就是这有大问题)

string chen(string s1, string s2) {
    string tsum="";//结果字符串
    int l1=s1.length(),l2=s2.length(), f1=0/*正向计数*/;
    short a[2000]={0}, b[2000]={0}, sum[2000]={0}/*结果数组*/;
    for(int i = l1-1; i >= 0; i--) a[i]=s1[i]-'0';
    for(int i = l2-1; i >= 0; i--) b[i]=s2[i]-'0';
    for(int i = l2-1; i >= 0 ; i--) {
        int k=0/*进位*/,f2=0/*正向计数*/;
        for (int j = l1-1; j >= 0; j--) {
            sum[f1+f2]+=a[j]*b[i]+k;
            k=sum[f1+f2]/10;
            sum[f1+f2]%=10;
            f2++;
        }
        if(k>0)sum[f1+f2]+=k;
        f1++;
    }bool flag=0;
    for (int i = l1+l2+1; i >= 0; i--)
        if(sum[i]!=0||flag)flag=1,tsum+=sum[i]+'0';
    if(!flag)return "0";
    return tsum;
}//高精度乘法 

string jc(int n) {
    string sum="1";
    for(int i = 1; i <= n; i++)
        sum=chen(sum,st(i))/*, cout << sum << '\n'*/;
    return sum;
}//阶乘(没问题) 

int main() {
/*  int n;cin >> n;
    string sum="0";
    for (int i = 1; i <= n; i++) {
        cout << sum << '\n';
        sum=jia(sum,jc(i));
    }
    for (int i = 0; i < n; i++) {
        cout << i << ' ' << jc(i) << '\n';
    }
    cout << sum;*/
    string a,b;
    cin >> a >> b;
    cout << chen(a,b);
    return 0;
}

玄关


by wyz0326 @ 2024-10-24 23:06:41

你这个高精度咋还拿字符串呢?那玩意儿高低有点麻烦了,给你贴一个简单点的用数组做的高精度,你自己那个就是减来减去的很麻烦就容易错大概是错在进位后切位上了(说实在没看懂) 其实这个题用高精乘法就好

#include<bits/stdc++.h>
using namespace std;
int main(){
    int a[5050]={0},b[5050]={0};
    a[0]=b[0]=1;
    int n;
    cin>>n;
    for(int i=2;i<=n;i++){
        for(int j=0;j<5050;j++){
           a[j]=a[j]*i;
          }

          for(int j=0;j<5050;j++){
            if(a[j]>9){
                a[j+1]+=a[j]/10;
                a[j]%=10;
           }
          } 
        for(int j=0;j<5050;j++){
            b[j]+=a[j];
            if(b[j]>9){
                b[j+1]+=b[j]/10;
                b[j]=b[j]%10;
            }
        }

    }
    int len=5049;
    for(int i=len;i>=0;i--){
        if(b[i]==0){
            len--;
        }
        else{
            break;
        } 
    }
    for(int i=len;i>=0;i--){
        cout<<b[i];
    }

    return 0;
}

RP++


|