高精度计算问题

高精度加法

描述
求两个不超过200位的非负整数的和。

输入
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。
输出
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
样例输入
22222222222222222222
33333333333333333333
样例输出
55555555555555555555

//题解:高精度入门题:结构体+字符转换+进位 
#include<cstdio>
#include<cstring>
struct nod{
    
    int n,a[210];nod(){
    
    memset(a,0,sizeof(a));}}a,b;
char s[210];
int main()
{
    
    
    int ns;//读入a============ 
    scanf("%s",s+1);//下标从1开始 
    ns=strlen(s+1);    a.n=ns;
    for(int i=1;i<=ns;i++)//字符逆序转换为数字 
    {
    
    //为了数位 对齐,翻转数字 
        a.a[ns-i+1]=s[i]-'0';
    }//========================
    
    //读入b==================== 
    scanf("%s",s+1);//下标从1开始 
    ns=strlen(s+1);    b.n=ns;
    for(int i=1;i<=ns;i++)//字符逆序转换为数字 
    {
    
    //为了数位 对齐,翻转数字 
        b.a[ns-i+1]=s[i]-'0';
    }//=========================
    //模拟加法运算 
    a.n=a.n>b.n?a.n:b.n;//确定数位 
    for(int i=1;i<=a.n;i++)//暴力加 
    {
    
    
        a.a[i]+=b.a[i];
    }
    for(int i=1;i<=a.n;i++)//处理进位 
    {
    
    
        if(a.a[i]>9)
        {
    
    
            a.a[i+1]+=a.a[i]/10;//向右进位 
            a.a[i]%=10;//保留个位数
            if(i==a.n) a.n++;//最高位溢出 
        }
    }
    //消除前导0
    while(a.a[a.n]==0&&a.n>1) a.n--;//最高位必须非0
    //反向输出
    for(int i=a.n;i>=1;i--)
    {
    
    
        printf("%d ",a.a[i]);
    } 
    return 0;
}
 

高精度减法

描述
求两个大的正整数相减的差。

输入
共2行,第1行是被减数a,第2行是减数b(a > b)。每个大整数不超过200位,不会有多余的前导零。
输出
一行,即所求的差。
样例输入
9999999999999999999999999999999999999
9999999999999
样例输出
9999999999999999999999990000000000000

//题解:高精度入门题:结构体+字符转换+借位 
#include<cstdio>
#include<cstring>
struct nod{
    
    int n,a[210];nod(){
    
    memset(a,0,sizeof(a));}}a,b;
char s[210];
int main()
{
    
    
    int ns;//读入a============ 
    scanf("%s",s+1);//下标从1开始 
    ns=strlen(s+1);    a.n=ns;
    for(int i=1;i<=ns;i++)//字符逆序转换为数字 
    {
    
    //为了数位 对齐,翻转数字 
        a.a[ns-i+1]=s[i]-'0';
    }//========================
    //读入b==================== 
    scanf("%s",s+1);//下标从1开始 
    ns=strlen(s+1);    b.n=ns;
    for(int i=1;i<=ns;i++)//字符逆序转换为数字 
    {
    
    //为了数位 对齐,翻转数字 
        b.a[ns-i+1]=s[i]-'0';
    }//=========================
    //模拟减法运算  
    for(int i=1;i<=a.n;i++) a.a[i]-=b.a[i];//暴力减 
    for(int i=1;i<=a.n;i++)//处理借位 
    {
    
    
        if(a.a[i]<0)
        {
    
    
            a.a[i+1]-=1;//向右借 1 
            a.a[i]+=10;//补充数值 
        }
    }
    //消除前导0//本题保证a>b,如果不知道大小关系呢? 
    while(a.a[a.n]==0&&a.n>1) a.n--;//最高位必须非0
    //反向输出
    for(int i=a.n;i>=1;i--) printf("%d",a.a[i]);
    return 0;
}

高精度乘法

高精度*低精度

描述
任意给定一个正整数N(N<=100),计算2的n次方的值。
输入
输入一个正整数N。
输出
输出2的N次方的值。
样例输入
5
样例输出
32

//题解:高精度*低精度 +非结构体 +函数 
#include<cstdio>
int a[1010],na;//估算数组,2的100次不知道是多少位?
//10的100次是1000位,可以了吗?
void cf(int x)
{
    
    
    for(int i=1;i<=na;i++)//每位都乘 
    {
    
    
        a[i]*=x;
    }
    for(int i=1;i<=na;i++)//处理进位 
    {
    
    
        if(a[i]>9)
        {
    
    
            a[i+1]+=a[i]/10;
            a[i]%=10;
            if(i==na) na++;//最高位溢出 
        }
    }
}
int main()
{
    
    
    int n;
    scanf("%d",&n);
    a[1]=1;na=1;
    for(int i=1;i<=n;i++)
    {
    
    
        cf(2);
    }
    for(int i=na;i>=1;i--) printf("%d",a[i]);//反向输出 
    
    //现在你可以知道2的100次方是多少位了吗? 
    
    return 0;
}
 

高精度除法

高精度/低精度

描述
已知正整数k满足2<=k<=9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k。

输入
一个非负整数c,c的位数<=30。
输出
若存在满足 c%k == 0 的k,从小到大输出所有这样的k,相邻两个数之间用单个空格隔开;若没有这样的k,则输出"none"。
样例输入
30
样例输出
2 3 5 6

//题解:高精度除以低精度:模拟思想 
#include<cstdio>
#include<cstring>
char s[210];
int a[210],na,ls=0; 
void chu(int x)
{
    
    
    int k=0;//余数 
    for(int i=na;i>=1;i--)//模拟竖式除法 
    {
    
    
        k=k*10+a[i];
        k=k%x;
    }
    if(k==0) 
    {
    
        ls=1; //打标签 
        printf("%d ",x);
    } 
}
int main()
{
    
    
    int ns;
    scanf("%s",s+1);//下标从1开始 
    ns=strlen(s+1);    na=ns;
    for(int i=1;i<=ns;i++)//字符逆序转换为数字 
    {
    
    
        a[ns-i+1]=s[i]-'0';
    }
    for(int i=2;i<=9;i++)
    {
    
    
        chu(i);//函数处理 
    }
    if(ls==0) printf("none"); 
    return 0;
}
 

猜你喜欢

转载自blog.csdn.net/weixin_44972129/article/details/111059298