---------------
高精度算法
---------------
说明(以下情况均没做处理)
1.减数比被减数大
2.除数比被除数大
3.除数为0
点击(此处)折叠或打开
-
#include <stdio.h>
-
#include <string.h>
-
-
const int MAXSIZE = 100;
-
void Add(char *str1, char *str2, char *str3);
-
void Minus(char *str1, char *str2, char *str3);
-
void Mul(char *str1, char *str2, char *str3);
-
void Div(char *str1, char *str2, char *str3);
-
-
int main(void)
-
{
-
char str1[MAXSIZE], str2[MAXSIZE], str3[MAXSIZE];
-
while(scanf("%s %s", str1, str2) == 2)
-
{
-
if(strcmp(str1, "0"))
-
{
-
memset(str3 , '0', sizeof(str3));
-
Add(str1, str2, str3);
-
printf("Add: %sn", str3);
-
memset(str3 , '0', sizeof(str3));
-
Minus(str1, str2, str3);
-
printf("Sub: %sn", str3);
-
memset(str3 , '0', sizeof(str3));
-
Mul(str1, str2, str3);
-
printf("Mul: %sn", str3);
-
memset(str3 , '0', sizeof(str3));
-
Div(str1, str2, str3);
-
printf("Div: %sn", str3);
-
}
-
else
-
{
-
if (strcmp(str2, "0"))
-
{
-
printf("Add: %snSub: -%snMul: 0nDiv: 0n", str2, str2);
-
}
-
else
-
{
-
printf("Add: 0nSub: 0nMul: 0nDiv: 0n");
-
}
-
}
-
}
-
return 0;
-
}
-
-
void Add(char *str1, char *str2, char *str3)
-
{
-
int i, j, i1, i2, tmp, carry;
-
int len1 = strlen(str1), len2 = strlen(str2);
-
char ch;
-
i1 = len1 - 1;
-
i2 = len2 - 1;
-
j = carry = 0;
-
for(; i1>=0 && i2 >= 0; ++j, --i1, --i2)
-
{
-
tmp = str1[i1] - '0' + str2[i2] - '0' + carry;
-
carry = tmp / 10;
-
str3[j] = tmp % 10 + '0';
-
}
-
while(i1 >= 0)
-
{
-
tmp = str1[i1--] - '0' + carry;
-
carry = tmp / 10;
-
str3[j++] = tmp % 10 + '0';
-
}
-
while(i2 >= 0)
-
{
-
tmp = str2[i2--] - '0' + carry;
-
carry = tmp / 10;
-
str3[j++] = tmp % 10 + '0';
-
}
-
if(carry)
-
{
-
str3[j++] = carry + '0';
-
}
-
str3[j] = '';
-
for(i=0, --j; i<j; ++i, --j)
-
{
-
ch = str3[i];
-
str3[i] = str3[j];
-
str3[j] = ch;
-
}
-
}
-
-
void Minus(char *str1, char *str2, char *str3)
-
{
-
int i, j, i1, i2, tmp, carry;
-
int len1 = strlen(str1), len2 = strlen(str2);
-
char ch;
-
i1 = len1 - 1;
-
i2 = len2 - 1;
-
j = carry = 0;
-
while(i2 >= 0)
-
{
-
tmp = str1[i1] - str2[i2] - carry;
-
if (tmp < 0)
-
{
-
str3[j] = tmp + 10 + '0';
-
carry = 1;
-
}
-
else
-
{
-
str3[j] = tmp + '0';
-
carry = 0;
-
}
-
--i1;
-
--i2;
-
++j;
-
}
-
while(i1 >= 0)
-
{
-
tmp = str1[i1] - '0' - carry;
-
if (tmp < 0)
-
{
-
str3[j] = tmp + 10 + '0';
-
carry = 1;
-
}
-
else
-
{
-
str3[j] = tmp + '0';
-
carry = 0;
-
}
-
--i1;
-
++j;
-
}
-
--j;
-
while(str3[j] == '0' && j > 0)
-
{
-
--j;
-
}
-
str3[++j] = '';
-
for (i=0, --j; i<j; ++i, --j)
-
{
-
ch = str3[i];
-
str3[i] = str3[j];
-
str3[j] = ch;
-
}
-
}
-
-
void Mul(char *str1, char *str2, char *str3)
-
{
-
int i, j, i1, i2, tmp, carry, jj;
-
int len1 = strlen(str1), len2 = strlen(str2);
-
char ch;
-
jj = carry = 0;
-
for (i1=len1-1; i1>=0; --i1)
-
{
-
j = jj;
-
for (i2=len2-1; i2>=0; --i2,++j)
-
{
-
tmp = (str3[j] - '0') + (str1[i1] - '0') * (str2[i2] - '0') + carry;
-
if (tmp > 9)
-
{
-
carry = tmp / 10;
-
str3[j] = tmp % 10 + '0';
-
}
-
else
-
{
-
str3[j] = tmp + '0';
-
carry = 0;
-
}
-
}
-
if (carry)
-
{
-
str3[j] = carry + '0';
-
carry = 0;
-
++j;
-
}
-
++jj;
-
}
-
--j;
-
while(str3[j] == '0' && j > 0)
-
{
-
--j;
-
}
-
str3[++j] = '';
-
for(i=0, --j; i<j; ++i, --j)
-
{
-
ch = str3[i];
-
str3[i] = str3[j];
-
str3[j] = ch;
-
}
-
}
-
-
void Div(char *str1, char *str2, char *str3)
-
{
-
int i1, i2, i, j, jj, tag, carry, cf, c[MAXSIZE];
-
int len1 = strlen(str1), len2 = strlen(str2), lend;
-
char d[MAXSIZE];
-
memset(c, 0, sizeof(c));
-
memcpy(d, str1, len2);
-
lend = len2;
-
j = 0;
-
for(i1=len2-1; i1<len1; ++i1)
-
{
-
if(lend < len2)
-
{
-
d[lend] = str1[i1+1];
-
c[j] = 0;
-
++j;
-
++lend;
-
}
-
else if(lend == len2)
-
{
-
jj = 1;
-
for(i=0; i<lend; ++i)
-
{
-
if(d[i] > str2[i])
-
{
-
break;
-
}
-
else if(d[i] < str2[i])
-
{
-
jj = 0;
-
break;
-
}
-
}
-
if (0 == jj)
-
{
-
d[lend] = str1[i1+1];
-
c[j] = 0;
-
++j;
-
++lend;
-
continue;
-
}
-
}
-
if(1 == jj || lend > len2)
-
{
-
cf = jj = 0;
-
while(d[jj] <= '0' && jj < lend)
-
{
-
++jj;
-
}
-
if (lend-jj > len2)
-
{
-
cf = 1;
-
}
-
else if (lend-jj < len2)
-
{
-
cf = 0;
-
}
-
else
-
{
-
i2 = 0;
-
cf = 1;
-
for (i=jj; i<lend; ++i)
-
{
-
if (d[i] < str2[i2])
-
{
-
cf = 0;
-
break;
-
}
-
else if(d[i] > str2[i2])
-
{
-
break;
-
}
-
++i2;
-
}
-
}
-
while(cf)
-
{
-
i2 = len2 - 1;
-
cf = 0;
-
for(i=lend-1; i>=lend-len2; --i)
-
{
-
d[i] = d[i] - str2[i2] + '0';
-
if(d[i] < '0')
-
{
-
d[i] = d[i] + 10;
-
carry = 1;
-
--d[i-1];
-
}
-
else
-
{
-
carry = 0;
-
}
-
--i2;
-
}
-
++c[j];
-
jj = 0;
-
while(d[jj] <= '0' && jj < lend)
-
{
-
++jj;
-
}
-
if(lend-jj > len2)
-
{
-
cf = 1;
-
}
-
else if(lend-jj < len2)
-
{
-
cf = 0;
-
}
-
else
-
{
-
i2 = 0;
-
cf =1;
-
for (i=jj; i<lend; ++i)
-
{
-
if(d[i] < str2[i2])
-
{
-
cf = 0;
-
break;
-
}
-
else if(d[i] > str2[i2])
-
{
-
break;
-
}
-
++i2;
-
}
-
}
-
}
-
jj = 0;
-
while(d[jj] <= '0' && jj < lend)
-
{
-
++jj;
-
}
-
for(i=0; i<lend-jj; ++i)
-
{
-
d[i] = d[i+jj];
-
}
-
d[i] = str1[i1+1];
-
lend = i + 1;
-
++j;
-
}
-
}
-
i = tag = 0;
-
while(0 == c[i])
-
{
-
++i;
-
}
-
for(; i<j; ++i, ++tag)
-
{
-
str3[tag] = c[i] + '0';
-
}
-
str3[tag] = '';
- }
2011-05-06 16:08 发表于百度空间,今搬至CU。