高精度整数(包括负数)加法
2010-07-02 23:55
567 查看
//shengsun
//高精度整数(包括负数)加法 char读入
#include <stdio.h>
#include <string.h>
const int LEN=1000;
//高精度非负数加法, 作为函数intadd的子程序调用
//参数(a,b: 字符串表示的加数; result: 字符串表示的结果)
//注: 传入result时最好将其初始化为0
void add(char *a,char *b,char *result)
{
int temp[LEN]={0};
int i,j,carry=0,len_t=0,len_c=0;
int len_a=strlen(a);
int len_b=strlen(b);
for(i=len_a-1,j=len_b-1;i>=0&&j>=0;i--,j--)
{
temp[len_t++]=(a[i]-'0'+b[j]-'0'+carry)%10;
carry=(a[i]-'0'+b[j]-'0'+carry)/10;
}
while(i>=0) //处理a位数比b多的情况
{
temp[len_t++]=(a[i]-'0'+carry)%10;
carry=(a[i--]-'0'+carry)/10;
}
while(j>=0) //处理b位数比a多的情况
{
temp[len_t++]=(b[j]-'0'+carry)%10;
carry=(b[j--]-'0'+carry)/10;
}
if(carry>0) //处理最高位有进位的情况
{
temp[len_t++]=1;
}
len_t--;
while(len_t>=0) //将结果转换为字符串
{
result[len_c++]=temp[len_t--]+'0';
}
}
//高精度非负数减法, 作为函数intadd的子程序调用
//参数(a,b: 字符串表示的减数; result: 字符串表示的结果)
//注: 传入result时最好将其初始化为0
void minus(char *a,char *b,char *result)
{
int temp[LEN]={0};
int i,j,borrow=0,len_t=0,len_c=0,flag;
int len_a=strlen(a);
int len_b=strlen(b);
if((len_a>len_b)||((len_a==len_b)&&strcmp(a,b)>=0))
{
flag=0; //作为结果符号的判断, flag=0表示两数相减为非负数
}
else
{
flag=1; //flag=1表示两数相减的结果为负数, 此时调整两减数, 使被减数位数不少于减数
char *t=a;
a=b;
b=t;
}
len_a=strlen(a);
len_b=strlen(b);
for(i=len_a-1,j=len_b-1;i>=0&&j>=0;i--,j--)
{
temp[len_t++]=(a[i]-b[j]-borrow+10)%10;
if(a[i]-b[j]-borrow<0)
{
borrow=1;
}
else
{
borrow=0;
}
}
while(i>=0) //处理被减数位数不比减数的少的情况
{
temp[len_t++]=(a[i]-'0'-borrow+10)%10;
if(a[i]-'0'-borrow<0)
{
borrow=1;
}
else
{
borrow=0;
}
i--;
}
len_t--;
if(flag==1) //处理结果的符号
{
result[len_c++]='-';
}
while(temp[len_t]==0&&len_t>0) //处理结果前面多余无效0的情况
{
len_t--;
}
while(len_t>=0) //结果转换为字符串
{
result[len_c++]=temp[len_t--]+'0';
}
}
//高精度整数(含负数)加法
//参数(a,b: 字符串表示的加数; result: 字符串表示的结果)
//注: 传入result时最好将其初始化为0
void intadd(char *a,char *b,char *result)
{
if(a[0]=='-'&&b[0]!='-') //a负b正相加
{
minus(b,&a[1],result);
}
else if(a[0]!='-'&&b[0]=='-') //a正b负相加
{
minus(a,&b[1],result);
}
else if(a[0]!='-'&&b[0]!='-') //a正b正相加
{
add(a,b,result);
}
else //a负b负相加
{
add(&a[1],&b[1],result);
int lens=strlen(result);
for(int k=lens-1;k>=0;k--)
{
result[k+1]=result[k];
}
result[0]='-';
}
}
int main()
{
char a[LEN-1],b[LEN-1],result[LEN];
while(scanf("%s%s",a,b)!=EOF)
{
memset(result,0,sizeof(result)); //初始化result为0
intadd(a,b,result); //调用整数(含负数)的加法函数
printf("%s/n",result); //输出两数相加的结果
}
return 0;
}
//高精度整数(包括负数)加法 char读入
#include <stdio.h>
#include <string.h>
const int LEN=1000;
//高精度非负数加法, 作为函数intadd的子程序调用
//参数(a,b: 字符串表示的加数; result: 字符串表示的结果)
//注: 传入result时最好将其初始化为0
void add(char *a,char *b,char *result)
{
int temp[LEN]={0};
int i,j,carry=0,len_t=0,len_c=0;
int len_a=strlen(a);
int len_b=strlen(b);
for(i=len_a-1,j=len_b-1;i>=0&&j>=0;i--,j--)
{
temp[len_t++]=(a[i]-'0'+b[j]-'0'+carry)%10;
carry=(a[i]-'0'+b[j]-'0'+carry)/10;
}
while(i>=0) //处理a位数比b多的情况
{
temp[len_t++]=(a[i]-'0'+carry)%10;
carry=(a[i--]-'0'+carry)/10;
}
while(j>=0) //处理b位数比a多的情况
{
temp[len_t++]=(b[j]-'0'+carry)%10;
carry=(b[j--]-'0'+carry)/10;
}
if(carry>0) //处理最高位有进位的情况
{
temp[len_t++]=1;
}
len_t--;
while(len_t>=0) //将结果转换为字符串
{
result[len_c++]=temp[len_t--]+'0';
}
}
//高精度非负数减法, 作为函数intadd的子程序调用
//参数(a,b: 字符串表示的减数; result: 字符串表示的结果)
//注: 传入result时最好将其初始化为0
void minus(char *a,char *b,char *result)
{
int temp[LEN]={0};
int i,j,borrow=0,len_t=0,len_c=0,flag;
int len_a=strlen(a);
int len_b=strlen(b);
if((len_a>len_b)||((len_a==len_b)&&strcmp(a,b)>=0))
{
flag=0; //作为结果符号的判断, flag=0表示两数相减为非负数
}
else
{
flag=1; //flag=1表示两数相减的结果为负数, 此时调整两减数, 使被减数位数不少于减数
char *t=a;
a=b;
b=t;
}
len_a=strlen(a);
len_b=strlen(b);
for(i=len_a-1,j=len_b-1;i>=0&&j>=0;i--,j--)
{
temp[len_t++]=(a[i]-b[j]-borrow+10)%10;
if(a[i]-b[j]-borrow<0)
{
borrow=1;
}
else
{
borrow=0;
}
}
while(i>=0) //处理被减数位数不比减数的少的情况
{
temp[len_t++]=(a[i]-'0'-borrow+10)%10;
if(a[i]-'0'-borrow<0)
{
borrow=1;
}
else
{
borrow=0;
}
i--;
}
len_t--;
if(flag==1) //处理结果的符号
{
result[len_c++]='-';
}
while(temp[len_t]==0&&len_t>0) //处理结果前面多余无效0的情况
{
len_t--;
}
while(len_t>=0) //结果转换为字符串
{
result[len_c++]=temp[len_t--]+'0';
}
}
//高精度整数(含负数)加法
//参数(a,b: 字符串表示的加数; result: 字符串表示的结果)
//注: 传入result时最好将其初始化为0
void intadd(char *a,char *b,char *result)
{
if(a[0]=='-'&&b[0]!='-') //a负b正相加
{
minus(b,&a[1],result);
}
else if(a[0]!='-'&&b[0]=='-') //a正b负相加
{
minus(a,&b[1],result);
}
else if(a[0]!='-'&&b[0]!='-') //a正b正相加
{
add(a,b,result);
}
else //a负b负相加
{
add(&a[1],&b[1],result);
int lens=strlen(result);
for(int k=lens-1;k>=0;k--)
{
result[k+1]=result[k];
}
result[0]='-';
}
}
int main()
{
char a[LEN-1],b[LEN-1],result[LEN];
while(scanf("%s%s",a,b)!=EOF)
{
memset(result,0,sizeof(result)); //初始化result为0
intadd(a,b,result); //调用整数(含负数)的加法函数
printf("%s/n",result); //输出两数相加的结果
}
return 0;
}
相关文章推荐
- 无线OSS-高精度整数加法(加数可以为负数,应实现高精度加减法)
- uva 424(Integer Inquiry)高精度大整数加法
- C++的高精度整数加法运算算法
- 在文本框中输入数字(包括负数,0,正整数),如果为其他值,则显示空
- 2010年华为上机笔试二(高精度整数加法)
- c语言高精度大整数加法运算
- [编程题]无线OSS-高精度整数加法
- poj 1503 大整数高精度 加法
- POJ 1503(高精度整数加法) 解题报告
- 华为OJ------高精度整数加法
- 九度OJ-1198:a+b (高精度整数加法)
- 高精度整数加法
- 高精度整数加法(OJ)
- POJ 1503(高精度整数加法) 解题报告
- 高精度整数加法(大整数加法)
- 华为OJ(高精度整数加法)
- [原创]10^9进制高精度大整数加法(MMX版本)
- 高精度整数加法
- 十进制的正整数,负数, 小数转为二进制.八进制.十六进制的方法 包括原码,反码,补码的介绍
- 任意长度的高精度大整数加法