c语言大数的加减乘除

    在计算的过程中我们经常会遇到加减乘除这些常用的运算,通常我们都
    是用整数类型进行存储然后进行运算,可有时它给的数可能很大,也就
    是所谓的大数,这时它已经超出了我们的这整形范围,就需要我们用数
    组来模拟这个运算。下面我们就讲一下如何用数组模拟加减乘除运算。
    首先是加法
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
#include<algorithm>
#include<map>
#include<iostream>
using namespace std;
typedef long long ll;
const ll maxn=1e5+10;
ll a[maxn],b[maxn];
char c[maxn],d[maxn];
int main()
{
    ll i,len,j;
    scanf("%s %s",c,d);
    a[0]=strlen(c);
    for(i=1;i<=a[0];i++)//这里是将字符串里的数倒叙,因为我们运算是从小到大算
        a[i]=c[a[0]-i]-'0';
        b[0]=strlen(d);
    for(i=1;i<=b[0];i++)
        b[i]=d[b[0]-i]-'0';
        len=max(a[0],b[0]);
    for(i=1;i<=len;i++)//这里面便是每一位的运算
    {
        a[i]+=b[i];
        a[i+1]+=a[i]/10;
        a[i]=a[i]%10;

    }
    len++;//这里的加一是判断最后一个进位
    while((a[len]==0)&&(len>1))//这个是如果没有进位,变不用加
        len--;
    for(i=len;i>=1;i--)//倒叙输出,因为前面进数组时是倒叙
        printf("%lld",a[i]);
    printf("\n");

}

大数减法和加法的方法差不多,多的是一定要判断两个字符串的大小,要让大的减小的

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
#include<algorithm>
#include<map>
#include<iostream>
using namespace std;
typedef long long ll;
const ll maxn=1e5+10;
ll a[maxn],b[maxn];
char c[maxn],d[maxn];
int main()
{
    ll i,len,j;
    scanf("%s %s",c,d);
    a[0]=strlen(c);
    for(i=1;i<=a[0];i++)
        a[i]=c[a[0]-i]-'0';
        b[0]=strlen(d);
    for(i=1;i<=b[0];i++)
        b[i]=d[b[0]-i]-'0';
    if(strcmp(c,d)>=0)
    {
        for(i=1;i<=a[0];i++)
        {
            a[i]-=b[i];
            if(a[i]<0)
            {
                a[i+1]--;
                a[i]+=10;
            }
        }
        a[0]++;
        while((a[a[0]]==0)&&a[0]>1)
            a[0]--;
        for(i=a[0];i>=1;i--)
            printf("%lld",a[i]);
        printf("\n");
    }
    else
    {
        printf("-");
        for(i=1;i<=b[0];i++)
        {
            b[i]-=a[i];
            if(b[i]<0)
            {
                b[i+1]--;
                b[i]+=10;
            }
        }
        b[0]++;
        while((b[b[0]]==0)&&b[0]>1)
            b[0]--;
        for(i=b[0];i>=1;i--)
            printf("%lld",b[i]);
        printf("\n");
    }


}

大数乘法

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
#include<algorithm>
#include<map>
#include<iostream>
using namespace std;
typedef long long ll;
const ll maxn=1e5+10;
ll a[maxn],b[maxn],n[maxn];
char c[maxn],d[maxn];
int main()
{
    ll i,len,j;
    scanf("%s %s",c,d);
    a[0]=strlen(c);
    for(i=1;i<=a[0];i++)
        a[i]=c[a[0]-i]-'0';
        b[0]=strlen(d);
    for(i=1;i<=b[0];i++)
        b[i]=d[b[0]-i]-'0';
        memset(n,0,sizeof(n));
    for(i=1;i<=a[0];i++)/*前面的步骤都差不多,主要是在运算方面不同,他是a数组的一位,
    去乘b数组的每一位,它的乘积正好在i+j-1位上*/
    {
        for(j=1;j<=b[0];j++)
        {
            n[i+j-1]+=a[i]*b[j];
            n[i+j]+=n[i+j-1]/10;
            n[i+j-1]%=10;
        }
    }
    len=a[0]+b[0]+1;
    while(n[len]==0&&len>1)
        len--;
    for(i=len;i>=1;i--)
        printf("%lld",n[i]);
    printf("\n");


}

大数相除
大数相除的算法有好几种,这里只讲了一种,也就是高精度除以低精度,也就是只有一个数是大数

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
#include<algorithm>
#include<map>
#include<iostream>
using namespace std;
typedef long long ll;
const ll maxn=1e5+10;
ll a[maxn],b[maxn],n[maxn];
char c[maxn],d[maxn];
int main()
{
    ll i,len=1,j,m;
    scanf("%s %lld",c,&m);
    a[0]=strlen(c);
    for(i=1;i<=a[0];i++)
        a[i]=c[i-1]-'0';
    ll x=0;
    for(i=1;i<=a[0];i++)//这个没有将函数逆置
    {
        b[i]=(x*10+a[i])/m;
        x=(x*10+a[i])%m;
    }
    while(b[len]==0&&len<a[0])
        len++;
    for(i=len;i<=a[0];i++)
        printf("%lld",b[i]);
    printf("\n%lld\n",x);




}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值