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


大数加法
#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
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:7 
乘法的话,无非就是多记录一个 小数点偏移值,比如
1.23 * 987.643 = 123*10^-2 * 987643*10^-3 = 123*987643 * 10^-5

2019-07-30 08: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
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
得分:7 
大数除法:
程序代码:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define MaxSize 1000
main()
{
    char a[MaxSize];
    int b[MaxSize];
    int c[MaxSize];
    int i,n,x=0,lena=0,lenc=1;
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    scanf("%s",a);
    scanf("%d",&n);
    for(i=0;i<strlen(a);i++)
           b[i+1]=a[i]-'0';
    lena=strlen(a);
    for(i=1;i<=lena;i++)
    {
        c[i]=(x*10+b[i])/n;
        x=(x*10+b[i])%n;
    }

    while (c[lenc]==0&&lenc<lena)
            lenc++;
    c[0]=lena-lenc+1;
    for(i=1;i<=c[0];i++)
    {
        c[i]=c[lenc];
        lenc++;
    }
    for(i=1;i<=c[0];i++)
            printf("%d",c[i]);
    printf(" %d",x);
    system("pause");
}
2019-07-30 20:41
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1728
专家分:3216
注 册:2015-12-2
得分:0 
回复 5楼 自学的数学
两个超大数之间的除法怎么算,要求可以精确到小数点后n位。
2019-07-30 20:54
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:7 
以下是引用ehszt在2019-7-30 20:54:10的发言:

两个超大数之间的除法怎么算,要求可以精确到小数点后n位。

乘法搞定,除法就没问题。
加减乘除,除法相对比较复杂低效,对运算效率要求高的话,应尽量避免使用除法。
    如:
    b/a = b * 1/a
    1/a 可用牛顿迭代求得:
    X=1/a
    Xn+1 = (2-a*Xn)*Xn
初始x与a有关,小数位数可取a的位数-1
2019-07-31 08:29
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.393352 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved