您的位置:首页 > 其它

大整数加减法

2015-03-06 17:21 197 查看
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void swap(char* a, char* b)
{
char tmp = *a;
*a = *b;
*b = tmp;
}

void reverse(char* a, int low, int high)
{
while (low < high)
{
swap(&a[low], &a[high]);
low++;
high--;
}
}

char* addition(char* a, char* b)
{
int n = strlen(a);
int m = strlen(b);
int len = n>m ? n:m;
int i = 0;
int flag = 0;
int a1;
int b1;
char* c;
int sum;

reverse(a, 0, n-1);
reverse(b, 0, m-1);

/*多分配一个字节*/
c = (char*)malloc(len+2);

while (i < len)
{
a1 = i<n ? (a[i]-'0'):0;
b1 = i<m ? (b[i]-'0'):0;
sum = (a1+b1+flag)%10;
flag = (a1+b1+flag)/10;
c[i] = sum+'0';
i++;
}

if (flag == 1)
{
c[i++] = '1';
}

c[i] = '\0';
reverse(c, 0, i-1);

return c;
}

int rmBlankZero(char* c, int n)
{
int i = n-1;

/*保证至少有一个0*/
while (i>0 && c[i]=='0')
i--;

return i+1;
}

/*只处理A > B*/
char* subtraction(char* a, char* b)
{
int n = strlen(a);
int m = strlen(b);
int len = n>m ? n:m;
int i = 0;
int flag = 0;
int a1;
int b1;
char* c;
int sum;

reverse(a, 0, n-1);
reverse(b, 0, m-1);

c = (char*)malloc(len);

while (i < len)
{
a1 = i<n ? (a[i]-'0'):0;
b1 = i<m ? (b[i]-'0'):0;
a1 -= flag;
flag = a1<b1 ? 1:0;
sum = (a1-b1+flag*10)%10;
c[i] = sum+'0';
i++;
}

c[i] = '\0';
len = rmBlankZero(c, i);
c[len] = '\0';
reverse(c, 0, len-1);

return c;
}

int main()
{
char a[] = "99999999";
char b[] = "11111111";
char* c;

c =  subtraction(a, b);

printf("%s\n", c);

return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: