整数的大数加减

来源:互联网 发布:常用的数据分析模型 编辑:程序博客网 时间:2024/05/22 20:07

萌新的整数大数加减


大致思路:

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

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

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

  4. 判断运算类型  

  5. 输出符号判断

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

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


#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为计算位数+1void 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;}
原创粉丝点击