标题:大数加减法
取消只看楼主
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1728
专家分:3216
注 册:2015-12-2
结帖率:100%
已结贴  问题点数:20 回复次数:4 
大数加减法
大数乘法和除法还不会,怎么弄带浮点数的大数乘除法


大数加法
#include <stdio.h>
#define N 100
main()
{
    int i,j,k,l;
    char a1[N]={0},a2[N]={0},sum[N]={0};
    scanf("%s %s",a1,a2);
    for(i=0;a1[i];i++);  //i移动字符串末尾
    for(j=0;a2[j];j++);
    for(k=N-2;i>0;k--,i--)  //a1字符串平移到末尾
    {
        a1[k]=a1[i-1];
        a1[i-1]=0;
    }
    for(k=N-2;j>0;k--,j--)
    {
        a2[k]=a2[j-1];
        a2[j-1]=0;
    }
    for(l=N-2;a1[l]!=0&&a2[l]!=0;l--)  //处理加法算式上下都有数字的和结果
    {
        sum[l]+=a1[l]+a2[l]-'0';
        sum[l-1]=(sum[l]-'0')>9?1:0;
        if(sum[l-1]==1)
           sum[l]-=10;
    }
    while(a1[l]!=0||a2[l]!=0)  //处理只有一边(只有上面有或只有下面有)有数字的和结果
    {
        sum[l]+=a1[l]+a2[l];
        l--;
    }
    for(i=0;!sum[i];i++);//打印结果
    printf("%s",&sum[i]);
}

大数减法
#include <stdio.h>
#include <string.h>
#define N 100

int sub(char a1[],char a2[],char diff[])  //减法子函数
{
    int l;
    for(l=N-2;a2[l];l--)   //处理上下都有数的减法结果
        {
            diff[l]+=a1[l]-a2[l]+10+'0';
            diff[l-1]=diff[l]>'9'?0:-1;
            if(diff[l-1]==0)diff[l]-=10;
        }
    for(;a1[l];l--)   //处理只有上面有数的减法结果
    {
        if(diff[l]==-1)diff[l]=a1[l]-1;
        else
        diff[l]=a1[l];
        
    }
    return diff[l+1]==0?l+1:l; 返回结果前一项的下标
main()
{
    int i,j,k,flag=0,cy;
    char a1[N]={0},a2[N]={0},diff[N]={0};
    scanf("%s %s",a1,a2);
    for(i=0;a1[i];i++);
    for(j=0;a2[j];j++);
    if(i>j)flag=1;  //比较出两数大小,flag=1表示a1大,flag=2表示a2大,flag=3表示相等;
    else if(i<j)flag=2;
    else if(strcmp(a1,a2)>0)flag=1;
    else if(strcmp(a1,a2)<0)flag=2;
    else flag=3;
    for(k=N-2;i>0;k--,i--)//数据移到末尾对齐
    {
        a1[k]=a1[i-1];
        a1[i-1]=0;
    }
    for(k=N-2;j>0;k--,j--)
    {
        a2[k]=a2[j-1];
        a2[j-1]=0;
    }
    if(flag==1)
    {
        sub(a1,a2,diff);
    }
    else if(flag==2)
    {
        cy=sub(a2,a1,diff);
        diff[cy]='-';
    }
        
    else if(flag==3)diff[N-2]='0';
    for(i=0;!diff[i];i++);
    printf("%s",&diff[i]);
}

[此贴子已经被作者于2019-7-30 20:29编辑过]

搜索更多相关主题的帖子: 大数 sum for 结果 flag 
2019-07-29 23:47
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1728
专家分:3216
注 册:2015-12-2
得分:0 
回复 2楼 rjsp
好的,那除法呢?
2019-07-30 11:47
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1728
专家分:3216
注 册:2015-12-2
得分:0 
大数乘法
感觉写得有点复杂,不知道怎么优化好
#include <stdio.h>
#include <string.h>
#define N 100

int mul(char a1[],int b1,char a2[],int b2,char product[])
{
    char result[2*N]={0};
    int i,j,k;
        for(i=N-2;a2[i]!=0;i--)
        {
            for(j=N-2;a1[j]!=0;j--)
        {
            
            result[i+j+1]=((a2[i]-'0') *(a1[j]-'0')+result[i+j+2])/10;
            result[i+j+2]=((a2[i]-'0') *(a1[j]-'0')+result[i+j+2])%10;
            
        }
            k=result[i+j+2]==0?i+j+3:i+j+2;
            for(int n=N+i;n>=k;n--)
        {
            
            product[n-1]=(product[n-1]+(product[n]+result[n])/10)%10;
            product[n]=(product[n]+result[n])%10;
        }
        memset(result,0,2*N);}
   
        for(k=0;product[k]==0;k++);
        
        while(k<=2*N-2)
        product[k++]+='0';
    return    b1+b2;
}

main()
{
    char a1[N]={0},a2[N]={0},product[N*2]={0};
    int b1=0,b2=0,b3,i,j,k,l,flag;
    scanf("%s %s",a1,a2);
    for(i=0;a1[i];i++);  //i移动到字符串末尾
    for(j=0;a2[j];j++);
    for(k=N-2;i>0;i--)  //a1字符串平移到末尾
    {
        if(a1[i-1]!='.')
        {
            a1[k]=a1[i-1];
            a1[i-1]=0;
            k--;
        }
        else
        {
            a1[i-1]=0;
            b1=N-k-2;
        }
        
    }
    for(k=N-2;j>0;j--)  //a1字符串平移到末尾
    {
        if(a2[j-1]!='.')
        {
            a2[k]=a2[j-1];
            a2[j-1]=0;
            k--;
        }
        else
        {
            a2[j-1]=0;
            b2=N-k-2;
        }
        
    }
    b3= mul(a1,b1,a2,b2,product);
    for(l=0;product[l]==0;l++);
    printf("%se%d",&product[l],(-1)*b3);
}

[此贴子已经被作者于2019-7-30 20:30编辑过]

2019-07-30 20:27
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1728
专家分:3216
注 册:2015-12-2
得分:0 
回复 5楼 自学的数学
两个超大数之间的除法怎么算,要求可以精确到小数点后n位。
2019-07-30 20:54
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1728
专家分:3216
注 册:2015-12-2
得分:0 
回复 7楼 吹水佬
哦,知道了,除法就暂时不弄了。谢谢了。
2019-07-31 18:13



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-496098-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.911709 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved