大数的四则运算

简介:

在处理大数的运算时,一般采用数组去模拟,下面介绍大数的加、减、乘、除四则运算的实现方法。

1.加法。

  如:

  Input: 123456789123456789123456789

            1

  Output:123456789123456789123456790

  输入采用字符数组保存,然后将输入存在整形数组里,然后逐位相加即可,同时注意进位处理。

复制代码
#include<stdio.h>
#include<string.h>
int max(int x,int y)
{
    if(x>y)
        return x;
    else
        return y;
}

int main(void)
{
    
    char str1[510],str2[510];
    while(scanf("%s %s",str1,str2)==2)
    {
        
        int a[510]={0},b[510]={0},c[510]={0},i;
        int m,n,max1=0;
        m=strlen(str1);
        n=strlen(str2);
        max1=max(m,n);
        for(i=0;i<max1;i++)
        {
            a[m-i-1]=str1[i]-48;
            b[n-i-1]=str2[i]-48;
        }
        for(i=0;i<max1;i++)
            c[i]=a[i]+b[i];
        for(i=0;i<max1;i++)
        { 
            c[i+1]=c[i]/10+c[i+1];
            c[i]=c[i]%10;
        }
        if(c[max1]!=0)
        {
            for(i=max1;i>=0;i--)
                printf("%d",c[i]);
        }
        else
        {
            for(i=max1-1;i>=0;i--)
                printf("%d",c[i]);
        }
        printf("\n");
    }
    return0;
}
复制代码

2.减法

Input:123456789123456789

         1

Output:123456789123456788

原理同加法一样(这里假设第一个数大于第二个数)

复制代码
#include<stdio.h>

#include<string.h>

int main(void)
{
    char s1[505],s2[505];
    while(scanf("%s%s",s1,s2)==2)
    {
        int i,j,len1,len2;
        int a[105]={0},b[105]={0};
        len1=strlen(s1);
        len2=strlen(s2);
        for(i=len1-1,j=0;i>=0;i--,j++)
        {
            a[j]=s1[i]-48;
        }
        for(i=len2-1,j=0;i>=0;i--,j++)
        {
            b[j]=s2[i]-48;
        }
        for(i=0;i<len1;i++)
        {
            a[i]=a[i]-b[i];
            if(a[i]<0)
            {
                a[i]+=10;
                a[i+1]--;
            }
        }
        i=len1-1;
        while(a[i]==0)
        {
            i--;
        }
        for(;i>=0;i--)
        {
            printf("%d",a[i]);
        }
        printf("\n");
    }
    return0;
}
复制代码

 3.乘法

  原理上也是采用数组模拟。

 a[i]   12345

 b[j]        23

 用c[k]来保存每次的运算结果,k=i+j;

 c[i+j]=c[i+j]+a[i]*b[j];

 这里来模拟一次乘法过程:

            123

         *   12

      --------------

             246   

        + 123

      --------------

            1476

复制代码
#include<iostream>
#include<string.h>
usingnamespace std;


int main(void)
{
    char s1[510],s2[510],temp[510];
    int a[510],b[510],c[1010];
    while(scanf("%s%s",s1,s2)==2)
    {
        int i,j,h;
        int len1,len2;
        if(strlen(s1)<strlen(s2))
        {
            strcpy(temp,s1);
            strcpy(s1,s2);
            strcpy(s2,temp);
        }
        len1=strlen(s1);
        len2=strlen(s2);
        memset(c,0,sizeof(c));
        for(i=len1-1,j=0;i>=0;i--,j++)
        {
            a[j]=s1[i]-48;
        }
        for(i=len2-1,j=0;i>=0;i--,j++)
        {
            b[j]=s2[i]-48;
        }
        for(i=0;i<len2;i++)
        {
            for(j=0;j<len1;j++)
            {
                c[i+j]=a[j]*b[i]+c[i+j];
            }
        }
        for(i=0;i<2*len1;i++)
        {
            if(c[i]>=10)
            {
                c[i+1]=c[i+1]+c[i]/10;
                c[i]=c[i]%10;
            }
        }
        i=2*len1;
        while(c[i]==0)
        {
            i--;
        }
        if(i<0)
        {
            printf("0\n");
        }
        else
        {
            for(;i>=0;i--)
                printf("%d",c[i]);
            printf("\n");
        }    
    }
    return0;
}
复制代码

4.除法

除法也是利用数组模拟,不过这里不是直接按照除法的运算来,而是把除法转变为减法运算,从而求得结果。

复制代码
#include<stdio.h>
#include<string.h>

int len1,len2;
char s1[905];
char s2[905];
int re[905];

void sub()
{
    int i=0;
    int j;
    while(1)
    {
        if(s1[i]=='0')
            i++;
        else
        {
            j=i;
            break;
        }
    }
    for(;i<len2;i++)
    {
        s1[i]=s1[i]-s2[i]+'0';
    }
    for(i=len2-1;i>j;i--)    //低位开始检测是否小于0
    {
        if(s1[i]<'0')
        {
            s1[i]+=10;
            s1[i-1]--;
        }
    }
}

int main(void)
{
    int i,p;
    while(scanf("%s%s",s1,s2)==2)
    {
        len1=strlen(s1);
        len2=strlen(s2);
        if(len1<len2||(len1==len2&&strncmp(s1,s2,len2)<0))   //如果a<b,直接输出0
        {
            printf("0\n");
            continue;
        }
        p=0;
        while(1)
        {
            re[p]=0;
            while(strncmp(s1,s2,len2)>=0)       //一直进行减法,直到不能减为止
             {
                sub();
                re[p]++;
            }
            p++;
            if(len1==len2)
                break;
            for(i=len2-1;i>=0;i--)             //在s2前面补0,以便进行减法运算
             {
                s2[i+1]=s2[i];
            }
            s2[0]='0';
            len2++;
            s2[len2]='\0';
        }
        i=0;
        while(1)
        {
            if(re[i]==0)
                i++;
            else
                break;
        }
        for(;i<p;i++)
            printf("%d",re[i]);
        printf("\n");
    }
    return0;
}
复制代码
本文转载自海 子博客园博客,原文链接: http://www.cnblogs.com/dolphin0520/archive/2011/04/11/2012867.html 如需转载自行联系原作者
相关文章
|
Shell Linux 测试技术
Linux下一键安装Python3&更改镜像源&虚拟环境管理技巧
主要介绍如何在Linux系统下通过shell脚本一键安装Python3,以及如何临时or永久更换镜像源、管理虚拟环境。工欲善其事必先利其器,环境搭建是一切开发&自动化测试绕不开的前提。
Linux下一键安装Python3&更改镜像源&虚拟环境管理技巧
|
测试技术 Linux
三分钟搞定压力测试之http_load
本文对一个正在云服务器上运行的系统进行一个并发访问的压力测试,以此来模仿真实环境并发访问造成资源带宽不稳定出现的种种问题。
591 0
三分钟搞定压力测试之http_load
|
9月前
|
数据采集 人工智能 缓存
腾讯混元又来开源,一出手就是最大MoE大模型
腾讯混元团队近日发布了开源Transformer-based MoE模型Hunyuan-Large,参数量达3890亿,激活参数520亿,处理tokens高达256K。该模型在多个基准测试中超越LLama3.1-70B,在某些方面媲美更大规模的LLama3.1-405B。其成功源于合成数据集、混合专家路由策略、键值缓存压缩及专家特定学习率等创新技术。尽管面临训练成本高和数据质量等挑战,Hunyuan-Large仍为AI行业注入新活力,并推动技术进步与应用创新。
168 13
|
10月前
|
边缘计算 人工智能 运维
Linux操作系统:开源力量的崛起与影响###
一场技术革命的回顾 回溯至1991年,当Linus Torvalds宣布Linux操作系统的诞生时,世界或许并未意识到这一举措将如何深刻地改变技术领域的面貌。本文旨在探讨Linux操作系统的发展历程、核心特性、以及它如何引领了一场开源运动,重塑了软件行业的生态。从最初的个人爱好项目成长为全球最广泛采用的服务器操作系统之一,Linux的故事是技术创新与社区精神共同推动下的辉煌篇章。 ###
|
SQL 消息中间件 OLAP
OneSQL OLAP实践问题之实时数仓中数据的分层如何解决
OneSQL OLAP实践问题之实时数仓中数据的分层如何解决
179 1
|
存储 缓存 算法
一篇文章让你学会什么是哈希(上)
哈希概念 哈希在C++中有广泛的应用,它是一种用于快速查找和存储数据的数据结构和算法。以下是一些常见的哈希在C++中的应用: 哈希表(Hash Table):哈希表是一种高效的数据结构,用于存储键值对。在C++中,std::unordered_map 和 std::unordered_set 是标准库提供的哈希表实现。
|
Oracle jenkins 持续交付
新的centos7.9安装jenkins(二)
新的centos7.9安装jenkins(二)
135 1
|
运维 监控 流计算
TDengine 3.2.3.0 版本发布,流计算等八大板块功能更新
据了解,3.2.3.0 版本涉及到的更新内容包括流计算、传输压缩、授权机制、监控、数据接入、Explorer、性能优化、运维优化八大模块。
320 2
|
机器学习/深度学习 人工智能 算法
|
Ubuntu Java 编译器
iMX6 yocto平台QT交叉编译环境搭建
iMX6 yocto平台QT交叉编译环境搭建
473 0
iMX6 yocto平台QT交叉编译环境搭建