您的位置:首页 > 编程语言

华为上机-要求编程实现上述高精度的十进制加法。要求实现函数: void add (const char *num1, const char *num2, char *result)

2014-10-06 10:52 549 查看
/*
要求编程实现上述高精度的十进制加法。要求实现函数:
void add (const char *num1, const char *num2, char *result)
【输入】num1:字符串形式操作数1,如果操作数为负,则num1[0]为符号位'-'
num2:字符串形式操作数2,如果操作数为负,则num2[0]为符号位'-'
【输出】result:保存加法计算结果字符串,如果结果为负,则result[0]为符号位。
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N	1000

void add(const char *num1, const char *num2, char *result);

void two_positive(const char *positive1, const char *positive2, char *result);

void sub(const char *bigger, const char *smaller, char *result);

void two_positive_negtive(const char *positive, const char *negtive, char *result);

void reverse(char *src);

int main (int argc, char **argv)
{
char s1
= "\0";
char s2
= "\0";
char *dst = nullptr;
printf("输入操作数1:\n");
scanf("%s", s1);
printf("输入操作数2:\n");
scanf("%s", s2);

int len = 0;
len = strlen(s1) > strlen(s2)? strlen(s1):strlen(s2);
dst = (char *)malloc(sizeof(char)*(len+2));					//最高位的进位和最后的'\0'
memset(dst, 0, sizeof(char)*(len+2));

add(s1, s2, dst);
printf("result:%s\n", dst);

free(dst);
dst = nullptr;

system("pause");
return 0;
}

void add(const char *num1, const char *num2, char *result)
{
if (nullptr == num1 || nullptr == num2)
{
printf("输入错误\n");
return;
}
if (nullptr == result)
{
printf("输出错误\n");
return;
}

if ('-' != num1[0] && '-' != num2[0])				//两个都是正数
{
two_positive(num1, num2, result);
reverse(result);
}
else if ('-' == num1[0] && '-' == num2[0])			//两个都是负数
{
result[0] = '-';
two_positive(num1+1, num2+1, result+1);
reverse(result+1);
}
else if ('-' == num1[0] && '-' != num2[0])			//num1负,num2正
{
two_positive_negtive(num2, num1, result);
}
else if ('-' != num1[0] && '-' == num2[0])			//num1正,num2负
{
two_positive_negtive(num1, num2, result);
}
}

void two_positive(const char *positive1, const char *positive2, char *result)
{
int sum = 0, carry = 0;
int temp1 = 0, temp2 = 0;
int end1 = 0, end2 = 0;
int count = 0;

end1 = strlen(positive1)-1;
end2 = strlen(positive2)-1;

while (end1 >= 0 || end2 >= 0)
{
if (end1 >= 0)
{
temp1 = positive1[end1]-'0';
}
else
{
temp1 = 0;
}

if (end2 >= 0)
{
temp2 = positive2[end2]-'0';
}
else
{
temp2 = 0;
}

sum = (temp1+temp2+carry)%10;
carry = (temp1+temp2+carry)/10;
result[count++] = sum+'0';
end1 --;
end2 --;

if (end1 < 0 && end2 < 0)
{
if (0 != carry)
{
result[count++] = carry+'0';
}
else
{
}
}
}
result[count] = '\0';
}

void sub(const char *bigger, const char *smaller, char *result)
{
int temp1 = 0, temp2 = 0;
int diff = 0, borrow = 0;
int count = 0;

int t1 = strlen(bigger)-1;
int t2 = strlen(smaller)-1;

while (t1 >= 0 || t2 >= 0)
{
if (t1 >= 0)
{
temp1 = bigger[t1]-'0';
}
else
{
temp1 = 0;
}
if (t2 >= 0)
{
temp2 = smaller[t2]-'0';
}
else
{
temp2 = 0;
}

diff = temp1-temp2-borrow;
if (diff >= 0)
{
borrow = 0;
}
else
{
diff += 10;
borrow = 1;
}
result[count++] = diff+'0';
t1 --;
t2 --;
}

while ('0' == result[count-1] && 1 != count )
{
count --;
}
result[count] = '\0';
}

void two_positive_negtive(const char *positive, const char *negtive, char *result)
{
int len1 = strlen(positive);
int len2 = strlen(negtive+1);
if (len1 > len2)
{
sub(positive, negtive+1, result);
}
else if (len1 == len2)
{
if (strcmp(positive, negtive+1) >= 0)
{
sub(positive, negtive+1, result);
}
else
{
result[0] = '-';
sub(negtive+1, positive, result+1);
}
}
else if (len1 < len2)
{
result[0] = '-';
sub(negtive+1, positive, result+1);
}

if ('-' == result[0])
{
reverse(result+1);
}
else
{
reverse(result);
}
}

void reverse(char *src)
{
int len = strlen(src);
char temp = '\0';

for (int i = 0; i < (len+1)/2; i ++)
{
temp = *(src+i);
*(src+i) = *(src+len-1-i);
*(src+len-1-i) = temp;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐