大数运算——加减乘除和求平方根

这篇博客介绍了大数运算的基本方法,包括大数加法、减法、乘法和除法的详细步骤。乘法通过逐位相乘和移位实现,除法则通过不断做减法来完成。此外,还提及了对乘法算法的改进以及增加了求平方根的运算。
摘要由CSDN通过智能技术生成

大数加法,从低位开始,依次运算,注意进位即可。
大数减法,从低位开始,按位依次做减法,注意借位即可。
大数乘法(此处为高精度*高精度),用到移位和加法(都是对数组进行操作)。以123*456为例说明算法运行过程。先令结果ans数组置零,第一步,计算6*123,结果保存在数组temp1中,再向左移动0位,低位补零。再将ans与temp1相加,相加的结果保存在ans中。第二步,用5*123,结果保存在temp1中,再向左移动1位,低位补零。再将ans与temp1相加,相加的结果保存在ans中.第三步,用4*123,结果保存在temp1中,再向左移动2位,低位补零。再将ans与temp1相加,相加的结果保存在ans中。
大数除法,就是不断做减法的过程,以7654/23为例,说明算法运行过程,设”7654”的长度为len1=4,”23”为len2=2,nTimes=len1-len2=2;第一步,将”23”左移nTimes位,低位补零,即变为“2300”.在用“7654”-“2300”,够减,则用结果“5354”替代“7654”,以便进行下一次运算。并且ans[nTimes]++。然后,用“5354-2300”,够减,则用结果“3054”替代“5354”,以便进行下一次运算。并且ans[nTimes]++.再用“3054”-“2300”,,够减,则用结果“754”替代“3054”,以便进行下一次运算。并且ans[nTimes]++.再用“754”-“2300”,不够减,则将“23”左移nTimes-1位,低位补零,变为“230”.用“754”-“230”,够减,则用结果“524”替代“754”,以便进行下一次运算。并且ans[nTimes-1]++.继续用“524”-“230”,,够减,则用结果“294”替代“524”,以便进行下一次运算。并且ans[nTimes-1]++,继用“294”-“230”,,够减,则用结果“64”替代“294”,以便进行下一次运算。并且ans[nTimes-1]++,继续用“64”-“230”,不够减,则将“23”左移nTimes-2位,低位补零,变为“23”.在用“64”-“23”,够减,则用结果“41”替代“64”,以便进行下一次运算。并且ans[nTimes-2]++。在用“41”-“23”,够减,则用结果“18”替代“41”,以便进行下一次运算。并且ans[nTimes-2]++。在用“18”-“23”,不够减。算法结束。逆序输出ans的值即为结果.


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int compare(int a[],int b[],int len1,int len2);
int add(int a[],int b[],int len1,int len2);
int sub(int a[],int b[],int len1,int len2);
int mul(int a[],int b[],int len1,int len2,int ans[]);
int division(int a[],int b[],int len1,int len2,int ans[]);
int main()
{
    char ch;
    char input[25];
    int i,j,k,len1,len2,num;
    int a[12],b[12],ans[25];
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(ans,0,sizeof(ans));
    for(i=0;scanf("%c",&input[i])==1&&input[i]!='\n';i++);
    ch=input[0];
    for(j=i-1,k=0;input[j]!=' ';j--,k++)
    {
        b[k]=input[j]-'0';
    }
    len2=k;
    for(i=j-1,k=0;input[i]!=' ';i--,k++)
    {
        a[k]=input[i]-'0';
    }
    len1=k;
    if(ch=='+')
    {
        num=add(a,b,len1,len2);
        if(num==-1)
        {
            printf("0\n");
            return 0;
        }
        else
        {
            for(i=num;i>=0;i--)
                printf("%d",a[i]);
        }
    }
    else if(ch=='-')
    {
        if(compare(a,b,len1,len2)==0)
        {
            printf("0\n");
            return 0;
        }
        else if(compare(a,b,len1,len2)>0)
        {
            num=sub(a,b,len1,len2);
            if(num==-1)
            {
                printf("0\n");
                return 0;
            }
            else
            {
                for(i=num;i>=0;i--)
                    printf("%d",a[i]);
            }
        }
        else if(compare(a,b,len1,len2)<0)
        {
            num=sub(b,a,len2,len1);
            if(num==-1)
            {
                printf("0\n
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值