高精度

1.高精度加法(高精度加高精度)

复制代码
复制代码
#include<iostream>
#include<cstring>
#define maxn 10000001
using namespace std;
int a[maxn],b[maxn];
int c[maxn];
int lena,lenb;
int main()
{
    string a1,b1;
    cin>>a1>>b1;
    lena=a1.length();
    lenb=b1.length();
    //倒序存放在a,b数组中 
    for(int i=0;i<lena;i++){
        a[i]=a1[lena-i-1]-'0';
    }
    for(int i=0;i<lenb;i++){
        b[i]=b1[lenb-i-1]-'0';
    }
    int m=0;
    if(lena>=lenb){
        for(int i=0;i<lena;i++){
            int f=a[i];
            a[i]=(b[i]+a[i]+m)%10;
            m=(f+b[i]+m)/10;
        }
        if(m){//进位 
            a[lena]=m;
            lena++;
        } 
        for(int i=lena-1;i>=0;i--){
            cout<<a[i];
        }
    }else{
        for(int i=0;i<lenb;i++){
            int f=b[i];
            b[i]=(b[i]+a[i]+m)%10;
            m=(f+a[i]+m)/10;
        }
        if(m){
            b[lenb]=m;
            lenb++;
        } 
        for(int i=lenb-1;i>=0;i--){
            cout<<b[i];
        }
        
    }
    


}
复制代码

 

复制代码

2.高精度乘法

复制代码
复制代码
#include<iostream>
#include<cstring> 
#define maxn 10000001
char a1[maxn],b1[maxn];
int a[maxn],b[maxn],c[maxn];
using namespace std;
int main()
{

    int lena,lenb,lenc;
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    cin>>a1>>b1;
    lena=strlen(a1);
    lenb=strlen(b1);
    lenc=lena+lenb;
    for(int i=0;i<lena;i++){
        a[i]=a1[lena-i-1]-'0';
    }
    for(int i=0;i<lenb;i++){
        b[i]=b1[lenb-i-1]-'0';
    }
    
    for(int i=0;i<lena;i++){
        for(int j=0;j<lenb;j++){
            //i+j为乘法该位置上的数 
            c[i+j]=c[i+j]+(a[i]*b[j]);
            c[i+j+1]=c[i+j+1]+(c[i+j]/10);//进位 
            c[i+j]=c[i+j]%10; 
        }
    }
    int f=0,f1=0;
//    if(c[lenc-1]==0) lenc--;
    for(int i=lenc-1;i>=0;i--){
        if(c[i]!=0) f=1;
        if(f) 
        {
            cout<<c[i];
            f1=1;
        }
    }
    if(!f1) cout<<"0";


}
复制代码

 

复制代码

3.高精度乘单精度

复制代码
#include<iostream>
#include<cstring>
#define maxn 10000001
int a[maxn];
using namespace std;
int main()
{
    //高精度a[]*单精度n;
    //单精度*单精度 
    int n;
    cin>>n; 
    memset(a,0,sizeof(a));
    a[1]=1;
    
    int p=1;//位数
    //求n的10次方 
    int i;
    for(int j=0;j<10;j++){
        int m=0;//进位 
        for(i=1;i<=p;i++){
            a[i]=a[i]*n+m;
            m=a[i]/10;
            a[i]=a[i]%10;    
        }
        //乘完之后还有进位 
        while(m>0){
            a[i]=m%10;
            m=m/10;
            i++;
        }
        p=i-1;
    }
    for(i=p;i>=1;i--){
        cout<<a[i];
    }


}
复制代码

 

 

 

 

4.在题目中运用

洛古p1009

复制代码
#include<iostream>
#include<cstring>
#define maxn 10000
using namespace std;
int a[maxn],s[maxn];
void pplus(int *a,int*s){
    int m=0;
    for(int i=1;i<=1000;i++){
        s[i]=s[i]+a[i]+m;
        m=s[i]/10;
        s[i]=s[i]%10;
    }
}
void cheng(int *a,int n){
    int m=0;//进位 
    for(int i=1;i<=1000;i++){
        //for表示运算次数,最后数长度 
        //*n为每次结束后a[]里存的是n-1的阶乘 
        a[i]=a[i]*n+m;
        m=a[i]/10;
        a[i]=a[i]%10;
    }
    
}

int main()
{
    int n;
    cin>>n;
    a[1]=1;
    memset(s,0,sizeof(s)); 
    for(int i=1;i<=n;i++){
        cheng(a,i);
        pplus(a,s);
    }
    int flag=0;
    for(int i=1000;i>=1;i--){
        if(s[i]!=0) flag=1;//去除开头0 
        if(flag) cout<<s[i];
         
    }
     


}
复制代码

 

posted @   lwx_R  阅读(36)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示