洛谷 高精度

https://www.luogu.org/problemnew/show/P1601
高精度加法

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int L=505;
string add(string a,string b)//只限两个非负整数相加
{
    string ans;
    int na[L]={0},nb[L]={0};
    int la=a.size(),lb=b.size();
    for(int i=0;i<la;i++) na[la-1-i]=a[i]-'0';//翻转复制a 到 na,string->int
    for(int i=0;i<lb;i++) nb[lb-1-i]=b[i]-'0';//翻转复制b 到 nb,string->int
    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+=na[i]+'0';//逆序保存到字符串中即为答案
    return ans;
}
int main()
{
    string a,b;
    cin>>a>>b;
    cout<<add(a,b)<<endl;
    return 0;
}

https://www.luogu.org/problemnew/show/P2142
高精度减法

#include<bits/stdc++.h>
using namespace std;
int compare(string s1,string s2);
int main()
{
    string str1,str2;
    int a[10250],b[10250];
    int i;
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    cin>>str1>>str2;
    a[0]=str1.length();
    for(i=1;i<=a[0];i++) a[i]=str1[a[0]-i]-'0';
    b[0]=str2.length();
    for(i=1;i<=b[0];i++) b[i]=str2[b[0]-i]-'0';
    
    if((compare(str1,str2))==0)  //*a>= *b,做按位减,并处理借位。
    {
        for(i=1;i<=a[0];i++)
        {
            a[i]-=b[i];
            if (a[i]<0) 
            {
                a[i+1]--;
                a[i]+=10;
            
            }
        }
        a[0]++;
        while((a[a[0]]==0)&&(a[0]>1)) a[0]--;
        for(i=a[0];i>=1;i--)
        cout<<a[i];
        cout<<endl;
    }
    else
    {
        cout<<'-';  //小于就输出负号
        for(i=1;i<=b[0];i++)  //做按位减,大的减小的
        {
            b[i]-=a[i];
            if (b[i]<0) 
            {
                b[i+1]--;
                b[i]+=10;
            }
        }
        b[0]++;
        while((b[b[0]]==0)&&(b[0]>1)) b[0]--;
        for(i=b[0];i>=1;i--)
        cout<<b[i];
        cout<<endl;
    }
    return 0;
}
int compare(string s1,string s2)  //比较字符串(两个数)数字的大小,大于等于返回0

,小于返回1。
{
    if(s1.length()>s2.length()) return 0;  
    if(s1.length()<s2.length()) return 1;
    for(int i=0;i<=s1.length();i++)  
    {
        if(s1[i]>s2[i]) return 0;
        if(s1[i]<s2[i]) return 1;
    }
    return 0;   
}

https://www.luogu.org/problemnew/show/P1303
高精度乘法

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    string str1,str2;
    int a[2050],b[2050],c[5000],len;    //2050位以内的两个数相乘
    int i,j;
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    cin>>str1>>str2;
    a[0]=str1.length();
    for(i=1;i<=a[0];i++)    a[i]=str1[a[0]-i]-'0';
    b[0]=str2.length();
    for(i=1;i<=b[0];i++)    b[i]=str2[b[0]-i]-'0';
    memset(c,0,sizeof(c));
    for(i=1;i<=a[0];i++)   //做按位乘法同时处理进位,注意循环内语句的写法。
        for(j=1;j<=b[0];j++)
        {
            c[i+j-1]+=a[i]*b[j];
            c[i+j]+=c[i+j-1]/10;
            c[i+j-1]%=10;
        }
    len=a[0]+b[0]+1;  //去掉前导0,然后输出
    while((c[len]==0)&&(len>1)) len--;  
    for(i=len;i>=1;i--)    cout<<c[i];
    return 0;
}

https://www.luogu.org/problemnew/show/P1255
斐波那契高精度保存

#include<bits/stdc++.h>
using namespace std;
int n,len=1,f[5003][5003];//第一维表示到某台阶方案数,第二维存高精度的各位
void hhh(int k)//高精度加法,k表示台阶数 
{    
    int i;
    for(i=1;i<=len;i++)
        f[k][i]=f[k-1][i]+f[k-2][i];
    for(i=1;i<=len;i++)              
    {
        if(f[k][i]>=10)
        {
            f[k][i+1]+=f[k][i]/10;
            f[k][i]=f[k][i]%10;
            if(f[k][len+1])len++;
        }
    }
}
int main()
{
    int i;
    scanf("%d",&n);
    f[1][1]=1; f[2][1]=2;         
    for(i=3;i<=n;i++)             
        hhh(i);                         
    for(i=len;i>=1;i--)
        printf("%d",f[n][i]);
    return 0;
}

https://www.luogu.org/problemnew/show/P1604
两个B进制数相加,求结果

#include<bits/stdc++.h>
using namespace std;
const int L=2005;
string add_Base(string a,string b,int Base)
{
    int maxl,na[L]={0},nb[L]={0};
    int la=a.length(),lb=b.length();
    maxl=la>lb?la:lb;
    for(int i=0;i<la;i++)
    {
        if(a[i]>='0'&&a[i]<='9')
            na[la-i-1]=a[i]-'0';
        else na[la-i-1]=a[i]-'A'+10;
    }
    for(int i=0;i<lb;i++)
    {
        if(b[i]>='0'&&b[i]<='9')
            nb[lb-i-1]=b[i]-'0';
        else nb[lb-i-1]=b[i]-'A'+10;
    }
    for(int i=0;i<maxl;i++)
    {
        na[i]+=nb[i];
        if(na[i]>=Base)
        {
            na[i+1]+=na[i]/Base;
            na[i]%=Base;
        }
    }
    if(na[maxl]) maxl++;
    while(na[maxl--]==0&&maxl>0);
    maxl++;

    string ans;
    for(int i=maxl;i>=0;i--)
    {
        if(na[i]>=0&&na[i]<=9) ans+=('0'+na[i]);
        else ans+=('A'+na[i]-10);
    }
    return ans;
}

int main()
{
    string a,b;
    int Base;
    cin>>Base>>a>>b;
    cout<<add_Base(a,b,Base);
}
### 关于高精度乘法在洛谷平台上的实现方法 高精度计算通常用于解决超出标准整型范围的大数值运算问题。对于高精度乘法,在洛谷平台上可以通过多种方式实现,以下是基于 C++ 和 Python 的两种常见解决方案。 #### 使用 C++ 实现高精度乘法 C++ 中的高精度乘法通常是通过模拟手工乘法的方式完成。具体来说,可以利用数组来存储大数的每一位数字,并按照逐位相乘的原则进行操作[^3]: ```cpp #include <iostream> #include <vector> using namespace std; vector<int> multiply(const vector<int>& a, const vector<int>& b) { vector<int> c(a.size() + b.size(), 0); for (int i = 0; i < a.size(); ++i) { for (int j = 0; j < b.size(); ++j) { c[i + j] += a[i] * b[j]; c[i + j + 1] += c[i + j] / 10; c[i + j] %= 10; } } while (c.size() > 1 && c.back() == 0) c.pop_back(); return c; } void printVector(const vector<int>& v) { for (auto it = v.rbegin(); it != v.rend(); ++it) cout << *it; cout << endl; } int main() { string s1, s2; cin >> s1 >> s2; vector<int> a(s1.size()), b(s2.size()); for (int i = 0; i < s1.size(); ++i) a[s1.size() - 1 - i] = s1[i] - '0'; for (int i = 0; i < s2.size(); ++i) b[s2.size() - 1 - i] = s2[i] - '0'; vector<int> result = multiply(a, b); printVector(result); return 0; } ``` 上述代码实现了两个大数字符串 `s1` 和 `s2` 的高精度乘法逻辑。它将每个字符转换为对应的十进制数字并存入向量中,随后按逐位相乘的方法得出最终结果。 #### 使用 Python 实现高精度乘法 Python 提供了内置支持的大整数类型,因此可以直接处理任意长度的整数而无需额外编写高精度算法。然而,如果希望手动实现高精度乘法,则可借鉴 FFT 或 NTT 技术加速卷积过程[^4]: ```python def fft_multiply(x, y): from numpy.fft import fft, ifft n = 1 while n < max(len(x), len(y)): n *= 2 n *= 2 fx = list(map(int, x[::-1])) + [0] * (n - len(x)) fy = list(map(int, y[::-1])) + [0] * (n - len(y)) Fx = fft(fx) Fy = fft(fy) Fz = Fx * Fy z = ifft(Fz).real.round().astype(int) carry = 0 res = [] for num in z: total = num + carry res.append(total % 10) carry = total // 10 while carry: res.append(carry % 10) carry //= 10 return ''.join(map(str, reversed(res))) if __name__ == "__main__": x = input() y = input() product = fft_multiply(x, y) print(product.strip('0') or '0') ``` 该脚本展示了如何借助快速傅里叶变换(FFT)技术优化两数之间的高精度乘法效率。 --- ### 总结 无论是使用 C++ 还是 Python 编程语言,都可以有效地应对洛谷上涉及高精度乘法的相关题目。前者依赖细致的手工模拟,后者则得益于其强大的动态内存管理能力简化了许多复杂度较高的步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值