大数乘法加大数加法。。细节处理很恶心。由于不用考虑整数部分,还不算复杂,写的加乘法不通用,只针对本题的情况处理。。如有必要可写个通用的大数加乘法,搞的我都想用JAVA的BigDecimal了,那样的话估计几行代码就搞定了。。好吧,就当练练C的字符串处理了,还是不熟练啊,写了近两小时。。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char *addNumber(char *s1, char *s2)
{
int l1 = strlen(s1);
int l2 = strlen(s2);
int l = l1 > l2 ? l1 : l2;
int i, prev = 0;
char *r = malloc(l + 1);
for (i = l - 1; i > 1; i--)
{
int a = i < l1 ? *(s1 + i) - '0' : 0;
int b = i < l2 ? *(s2 + i) - '0' : 0;
int num = a + b + prev;
*(r + i) = num > 9 ? num - 10 + '0' : num + '0';
prev = num > 9 ? 1 : 0;
}
*(r + 1) = '.';
*r = '0';
*(r + l) = '\0';
return r;
}
char *digitMultiFloat(char *s, int digit)
{
if (digit == 1)
return s;
char *r = malloc(strlen(s) + 1);
int i, prev = 0, num;
for (i = strlen(s) - 1; i > 1; i--)
{
num = (*(s + i) - '0') * digit + prev;
*(r + i) = (num % 10) + '0';
prev = (num / 10);
}
*(r + 1) = '.';
*r = '0';
*(r + strlen(s)) = '\0';
return r;
}
char *addHeadZero(char *s, int zeros)
{
int rl = strlen(s) + zeros;
char *r = malloc(rl + 1);
int i;
for (i = 0; i < rl + 1; i++)
{
if (i < zeros)
*(r + i) = '0';
else
*(r + i) = *(s + i - zeros);
}
*(r + 1) = '.';
*(r + 1 + zeros) = '0';
return r;
}
char *divideEight(char *s)
{
char *one = addHeadZero(digitMultiFloat(s, 1), 1);
char *two = addHeadZero(digitMultiFloat(s, 2), 2);
char *five = addHeadZero(digitMultiFloat(s, 5), 3);
return addNumber(addNumber(one, two), five);
}
void removeTrailZero(char *s)
{
int i = strlen(s) - 1;
while (1)
{
if (*(s + i) == '0')
i--;
else
break;
}
*(s + i + 1) = '\0';
}
int main()
{
char s[100];
while (scanf("%s", s) != EOF)
{
char *sum = "0.0";
char *factor = "0.125";
int i;
for (i = 2; s[i] != '\0'; i++)
{
if (s[i] != '0')
{
sum = addNumber(sum, digitMultiFloat(factor, s[i] - '0'));
}
factor = divideEight(factor);
}
removeTrailZero(sum);
printf("%s [8] = %s [10]\n", s, sum);
}
return 0;
}