C++实现大数的加法

来源:互联网 发布:c 编程实战宝典 pdf 编辑:程序博客网 时间:2024/05/16 23:52

加法计算还是比较容易的,我们也是先从低位算起,因为只须要对应的位相加,再加上前一位的进位,再去判断是否本位是否有进位, 有则把本位数字改为减去它的权,也就是10,再置进位为1。如果没有进位,则给进位赋值0。

【C/C++】大数四则运算的C++实现(转) - 八月照相馆 - 八月照相馆

 

    在程序时应注意:
    1、两个加数中那一个数的位数长,以位数长的作为循环变量;
    2、结束循环时,不仅仅是最后一位加完就停止,还应加入如果有进位,也要再循环一次。如最后一位是9,进位是1,则相加时进位,要加上进位这一位值。具体看代码,输入输出时和乘法的一样。


//没有考虑相加的数中有负数的情况,只考虑了两个数都是正数

#include<iostream>
using namespace std;
void addition(char* num1,char* num2,char* result,int num1length,int num2length,int resultindex)
{
int flag=0;//标志进位
int index=0;
while(num1length>=0&&num2length>=0)
{
int nsum=num1[num1length]-'0'+num2[num2length]-'0'+flag;
flag=nsum/10;//判断是不是有进位
nsum%=10;//如果有进位制,则要求出进位后余下的值
result[resultindex--]=nsum+'0';
num1length--;
num2length--;
}
if(num1length<0)
{
while(num2length>=0)
{
int nsum=num2[num2length]-'0'+flag;
flag=nsum/10;
nsum%=10;
result[resultindex--]=nsum+'0';
num2length--;
}
}
if(num2length<0)
{
while(num1length>=0)
{
int nsum=num1[num1length]-'0'+flag;
flag=nsum/10;
nsum%=10;
result[resultindex--]=nsum+'0';
num1length--;
}
}


if(flag!=0)
{
result[resultindex]=flag+'0';
}
}
void print(char*num,int nlength)
{
bool isbegining=true;
for(int i=0;i<nlength;i++)
{
if(num[i]!='\0')
{
if(isbegining&&num[i]!='0')//因为之前预留了空位,所以位数不够nlength位,之前为0,为了符合打印习惯,从左往右找到第一个非‘0’的值
isbegining=false;
if(!isbegining)
cout<<num[i];
}
}
cout<<endl;
}




int main()
{
char num1[]="123456";
char num2[]="123";
int num1length=strlen(num1)-1;//数组是从0开始
int num2length=strlen(num2)-1;//数组是从0开始
int maxlength=(num1length>num2length)? num1length:num2length;
int resultlength=maxlength+10;
int resultindex=resultlength;//用于addition函数中数组result的标号
char* result=new char[resultlength];
memset(result,'0',resultlength-2);//减2是因为数组是从0开始,数组最后一位放置结束符。结果数组清0,调用了memset函数,注意是赋值‘0’而不是0,否则出错
result[resultlength-1]='\0';//数组添加结束符
resultindex--;//减掉一位,因为最后一位不放任何内容,只放结束符
    addition(num1,num2,result,num1length,num2length,resultindex);
print(result,resultlength);
delete [] result;
return 0;
}









0 0
原创粉丝点击