描述
acmj最近发现在使用计算器计算高精度的大数加法时很不方便,于是他想着能不能写个程序把这个问题给解决了。
输入
包含多组测试数据
每组数据包含两个正数A,B(可能为小数且位数不大于400)
输出
每组输出数据占一行,输出A+B的结果,结果需要是最简的形式。
样例输入
1.9 0.1
0.1 0.9
1.23 2.1
3 4.0
样例输出
2
1
3.33
7
#include <stdio.h>
#include <string.h>
void ReverseStr(char []);
void add(const char str1[], const char str2[])
{
int len1 = 0,len2 = 0, len3 = 0,max,min;
int flag=0,n=0,flag1=0,flag2=0;
char str[512]={0};
char str3[512]={0};
char maxstr[512]={0};
char minstr[512]={0};
// printf("str1=%s,str2=%s\n", str1,str2);
while(str1[len1] != '.' && str1[len1] != '\0'){
len1++;
}
while(str2[len2] != '.' && str2[len2] != '\0'){
len2++;
}
//小数部分
bzero(str3, sizeof(str3));
//printf("len1=%d, len2=%d,strlen(str1)=%d, strlen(str2)=%d\n", len1, len2, strlen(str1), strlen(str2));
if(strlen(str1) == len1 && strlen(str2) == len2){
flag1=1;
}else if(strlen(str1) == len1 || strlen(str2) == len2){
flag2=1;
}else{
;//坑
}
if((strlen(str1)-len1) > (strlen(str2)-len2)){
len3 = (strlen(str1)-len1) - (strlen(str2)-len2)-flag2; //小数位相差位数
max = strlen(str1)-1;
min = strlen(str2)-1;
strcpy(maxstr,str1);
strcpy(minstr,str2);
}else{
len3 = (strlen(str2)-len2) - (strlen(str1)-len1)-flag2; //小数位相差位数
max = strlen(str2)-1;
min = strlen(str1)-1;
strcpy(minstr,str1);
strcpy(maxstr,str2);
}
//printf("str1=%s,str2=%s\n", str1,str2);
//printf("max=%d,min=%d,len3=%d\n", max, min, len3);
n=0;
while(len3--){
str3[n++] = maxstr[max--];
}
if(flag1 != 1){
flag=0;
while(maxstr[max] != '.'){
if(maxstr[max]+minstr[min]+flag-'0' > '9'){
str3[n++] = maxstr[max]+minstr[min]+flag-'0'-10;
flag = 1;
}else{
str3[n++] = maxstr[max]+minstr[min]+flag-'0';
flag = 0;
}
max--;
min--;
}
str[n]='\0';
ReverseStr(str3);
n=0;
len3 = strlen(str3)-1;
// printf("len3=%d\n", len3);
while(str3[len3] == '0'){
str3[len3--] = '\0';
}
}
// printf("str3:%s\n", str3);
//整数部分
// printf("len1=%d,len2=%d\n", len1, len2);
max=len1>len2?len1:len2;
min=len1>len2?len2:len1;
bzero(maxstr, sizeof(maxstr));
bzero(minstr, sizeof(minstr));
if(len1 > len2){
strncpy(maxstr, str1, len1);
strncpy(minstr, str2, len2);
}else{
strncpy(minstr, str1, len1);
strncpy(maxstr, str2, len2);
}
// printf("str1: %s,str2: %s\n", str1, str2);
// printf("strlen(str1)=%d, strlen(str2)=%d\n", strlen(str1), strlen(str2));
n=0;
while(min--){
max--;
if((maxstr[max]+minstr[min]+flag-'0') > '9'){
str[n++] = maxstr[max]+minstr[min]+flag-'0'-10;
flag=1;
}else{
str[n++] = maxstr[max]+minstr[min]+flag-'0';
flag=0;
}
// printf("max=%d,min=%d\n", max, min);
}
while(max--){
if((maxstr[max]+flag) > '9'){
str[n++] = maxstr[max]+flag-10;
flag=1;
}else{
str[n++] = maxstr[max]+flag;
flag=0;
}
// printf("max=%d\n", max);
}
// printf("str:%s\n", str);
if(1 == flag){
str[n++] = '1';
str[n] = '\0';
}else{
str[n]='\0';
}
ReverseStr(str);
//printf("flag1=%d,len3=%d\n", flag1, len3);
if(flag1 == 1 || len3 == -1){
printf("%s\n", str);
}else{
printf("%s.%s\n", str, str3);
}
}
void ReverseStr(char str[])
{
int len=strlen(str)/2;
int len1=strlen(str)-1;
int n=0;
char temp;
if(strlen(str) == 0){
return ;
}
while(len--){
temp = str[n];
str[n] = str[len1];
str[len1] = temp;
n++;
len1--;
// printf("str:%s\n", str);
}
}
int main(int argc, char **argv)
{
char str1[512]={0},str2[512]={0};
while(~scanf("%s%s", str1, str2)){
add(str1, str2);
bzero(str1, sizeof(str1));
bzero(str2, sizeof(str2));
}
return 0;
}