整数的大数加减

版权声明:没人会转的( ̄▽ ̄") https://blog.csdn.net/j2_o2/article/details/78348620

萌新的整数大数加减


大致思路:

  1. 数据输入         将数据存入字符数组 运算符号存入字符。

  2. 整数正负判断  使用strlen()函数将两组字符串长度存入整形变量len,之后判断数据是否为负,是则长度减一并且使用一整型变量存储正负数据。

  3. 数据类型转换  倒叙将字符数组转为整型数组。

  4. 判断运算类型  

  5. 输出符号判断

  6. 数据运算         加法运算直接模拟竖式计算;减法运算使被减数在两组数据最高位后一位补一,再相减(如456-789转换为1456-789=0667),如果最高位后一位为1直接输出,否则(即为0)使最高位为1其余为0减去结果(1000-0667=333)。

  7. 输出运算结果  找到第一个不为0的数开始输出,全0则输出0。


分割线

2018.10.30 代码有点bug,应该是第43行没处理好,懒得改了


#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;

char str1[1010],str2[1010];
int v1[1010],v2[1010],range=1000+1;             //range为计算位数+1

void add(int len)                               //加法运算
{
    int i;
    for(i=range-1;i>=len;i--)                   //倒叙相加逢十进一
    {
        v1[i]+=v2[i];
        if(v1[i]>9)
        {
            v1[i]-=10;
            v1[i-1]++;
        }
    }
    if(v1[len-1]!=0)printf("%d",v1[len-1]);     //判断最高位下一位是否为0
    for(i=len;i<range;i++)
        printf("%d",v1[i]);                     //输出
    printf("\n");
}

void sub(int len,int flag1)                     //减法运算
{
    int i,sign=1;                               //sign >0为正 =0为0 <0为负
    if(v1[len]==v2[len])                        //判断数据结果是否为负或0
    {
        for(i=len+1;i<range;i++)
        {
            if(v1[i]!=v2[i])
                sign=(v1[i]-v2[i])*flag1;
        }
        if(i==range)sign=0;
    }
    else sign=(v1[len]-v2[len])*flag1;
    if(sign<0)printf("-");
    if(sign==0)printf("0");
    v1[len-1]=1;                                //最高位前一位补1
    for(i=range-1;i>=len;i--)                   //相减结果存入v1
    {
        v1[i]-=v2[i];
        if(v1[i]<0)
        {
            v1[i]+=10;
            v1[i-1]--;
        }
    }
    if(v1[len-1]==1)                            //最高位前一位未被借位
        {
            for(i=len;i<range;i++)
                if(v1[i]!=0)break;
            for(;i<range;i++)                   //输出
                printf("%d",v1[i]);
        }
    else                                        //具体见思路6
    {                                           //结果存入v2
        memset(v2,0,sizeof(v2));
        v2[len-1]=1;
        for(i=range-1;i>=len;i--)
        {
            v2[i]-=v1[i];
            if(v2[i]<0)
            {
                v2[i]+=10;
                v2[i-1]--;
            }
        }
        for(i=len;i<range;i++)
            if(v2[i]!=0)break;
        for(;i<range;i++)                       //输出
            printf("%d",v2[i]);
    }
    printf("\n");
}

int main()
{
    int i,j;
    char sign;
    while(~scanf("%s %c %s",&str1,&sign,&str2))
    {
        int len1=strlen(str1),len2=strlen(str2),flag1=1,flag2=1,j1=0,j2=0;
        if(str1[0]=='-')        //flag存数据正负 len存长度 j存从第几位开始转换
        {
            j1++;
            len1--;
            flag1=-1;
        }
        if(str2[0]=='-')
        {
            j2++;
            len2--;
            flag2=-1;
        }
        for(i=range-len1,j=j1;i<range;i++)
            v1[i]=str1[j++]-'0';
        for(i=range-len2,j=j2;i<range;i++)
            v2[i]=str2[j++]-'0';
        if(sign=='+')
        {
            if(flag1*flag2==-1)
            {
                sub(min(range-len1,range-len2),flag1);      //正+负  负+正
            }
            else
            {
                if(flag1==-1)
                {
                    printf("-");
                    add(min(range-len1,range-len2));        //负+负
                }
                else
                    add(min(range-len1,range-len2));        //正+正
            }
        }
        if(sign=='-')
        {
            if(flag1*flag2==1)
            {
                sub(min(range-len1,range-len2),flag1);       //正-正 负-负
            }
            if(flag1*flag2==-1)
            {
                if(flag1==1)add(min(range-len1,range-len2));        //正-负
                else {printf("-");add(min(range-len1,range-len2));} //负-正
            }
        }
        memset(v2,0,sizeof(v2));        //清零
        memset(v1,0,sizeof(v1));
        printf("\n");
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/j2_o2/article/details/78348620