欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

高精度--模板

程序员文章站 2022-03-10 22:49:21
加法#pragma GCC optimize(1)#pragma GCC optimize(2)#pragma GCC optimize(3,"Ofast","inline")#include #include #include using namespace std;#define MAXN 1000int main(void){ char str[MAXN]; in...

加法

#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include <iostream>
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define MAXN 1000
int main(void)
{
   char str[MAXN];
   int arr1[MAXN],arr2[MAXN],len,len1,len2,i,j;
    scanf("%s",str);
    len1=strlen(str);
    for(i=0;i<len1;i++)//字符串倒叙导入数组,方便从低位开始运算
        arr1[i]=str[len1-1-i]-'0';
    scanf("%s",str);
    len2=strlen(str);
    for(i=0;i<len2;i++)
        arr2[i]=str[len2-1-i]-'0';//字符串中的是字符,要转换成数字
    len=(len1>len2)?len1:len2;
    for(i=0;i<len;i++)
    {
        j=(arr1[i]+arr2[i])/10;
        arr1[i+1]+=j;//进位
        arr1[i]=(arr1[i]+arr2[i])%10;//保留
    }
    if(j)len++;//最后一位是否进位
    for(i=0;i<len;i++)
        printf("%d",arr1[len-1-i]);
    return 0;
}
 
/**************************************************************
    Problem: 3580
    User: 2019UPC110
    Language: C++
    Result: 正确
    Time:1 ms
    Memory:2024 kb
****************************************************************/

减法

#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")

//std::ios::sync_with_stdio(false);
//std::cin.tie(0);

using namespace std;
int a[210],b[210],c[210],lena,lenb,lenc,i;
char n[210],n1[210],n2[210];
int main()
{
    scanf("%s",n1);
    scanf("%s",n2);
    if(strlen(n1)<strlen(n2)||(strlen(n1)==strlen(n2)&&strcmp(n1,n2)<0))
    {
        strcpy(n,n1);
        strcpy(n1,n2);
        strcpy(n2,n);
        cout<<"-";
    }
    lena=strlen(n1);lenb=strlen(n2);
    for(i=0;i<=lena-1;i++)a[lena-i]=int(n1[i]-'0');
    for(i=0;i<=lenb-1;i++)b[lenb-i]=int(n2[i]-'0');
    i=1;
    while(i<=lena||i<=lenb)
    {
        if(a[i]<b[i])
        {
            a[i]+=10;
            a[i+1]--;
        }
        c[i]=a[i]-b[i];
        i++;
    }
    lenc=i;
    while((c[lenc]==0)&&(lenc>1))lenc--;
    for(i=lenc;i>=1;i--)cout<<c[i];
    cout<<endl;
    return 0;
}

乘法写的好hh

#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")

//std::ios::sync_with_stdio(false);
//std::cin.tie(0);
int main(){
    string a,b;
    int an[105]={0},bn[105]={0},c[15000]={0};
    cin>>a>>b;
    int lena=a.length();
    int lenb=b.length();
    //倒序存储两个数于整型数组中
    for(int i=0;i<lena;i++){
        an[lena-i-1]=a[i]-'0';
    }

    for(int i=0;i<lenb;i++){
        bn[lenb-i-1]=b[i]-'0';
    }
    //进行乘法运算,结果存于c[]
    for(int i=0;i<lenb;i++){
        for(int j=0;j<lena;j++){
            c[i+j]+=an[j]*bn[i];
            c[i+j+1]+=c[i+j]/10;
            c[i+j]%=10;
        }
    }
   int  lenc=lena+lenb;
    //删除结果高位的前缀0
    while(c[lenc-1]==0  && lenc>1){
        lenc--;
    }
    //将结果倒序输出
    for(int i=lenc-1;i>=0;i--){
        cout<<c[i];
    }
    cout<<endl;
    return 0;
}

 

本文地址:https://blog.csdn.net/QXK_Jack/article/details/107159642