擦啊,把一个临时变量的初始化放在循环外面了,结果没有每次初始化为0,而在循环内不停自增。。程序一直崩溃。。坑死我了。。诶,还是太粗心了
本题也是大数的操作。。偷了个懒没有写大数减法,因为这题只用到了减1,挺简单的。想了想大数减法,真叫我写还不一定写的出来,挺麻烦的,算了。。以后有用到的法再考虑吧
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void reverse2371(char *s)
{
int len = strlen(s);
int i, j;
char c;
for (i = 0, j = len - 1; i < j; i++, j--)
{
c = *(s + i);
*(s + i) = *(s + j);
*(s + j) = c;
}
}
char *removeHeadZero2371(char *s)
{
char *r;
while (*s++ == '0')
;
r = --s;
return r;
}
char *multiplyThree(char *s1, int digit)
{
int i, res, prev = 0, len = strlen(s1);
char *r = malloc(len + 2);
if (!digit)
{
*r = '0';
*(r + 1) = '\0';
return r;
}
for (i = 0; i < len; i++)
{
res = (*(s1 + len - 1 - i) - '0') * digit + prev;
*(r + i) = res % 10 + '0';
prev = res / 10;
}
if (prev)
{
*(r + len) = prev + '0';
*(r + len + 1) = '\0';
}
else
*(r + len) = '\0';
reverse2371(r);
return r;
}
char *divide2371(char *s, int num, int *remain)
{
int i, rem = 0, len = strlen(s);
char *r = malloc(len + 1);
for (i = 0; i < len; i++)
{
rem = rem * 10 + *(s + i) - '0';
*(r + i) = rem / num + '0';
rem %= num;
}
*remain = rem;
*(r + len) = '\0';
r = removeHeadZero2371(r);
if (!strlen(r))
{
*r = '0';
*(r + 1) = '\0';
}
return r;
}
char *minusOne(char *s)
{
int l = strlen(s), i;
char *r = malloc(l + 1);
for (i = l - 1; i >= 0; i--)
if (*(s + i) == '0')
*(r + i) = '9';
else
{
*(r + i) = *(s + i) - 1;
i--;
break;
}
for (; i >= 0; i--)
*(r + i) = *(s + i);
*(r + l) = '\0';
return *r == '0' && *(r + 1) != '\0' ? r + 1 : r;
}
int main()
{
char *power3[65];
int i;
power3[0] = "1";
for (i = 1; i < 65; i++)
power3[i] = multiplyThree(power3[i - 1], 3);
char s[20];
while (scanf("%s", s),strcmp(s, "0"))
{
putchar('{');
char *t = minusOne(s);
int remain,index=0;
while (strcmp(t, "0"))
{
t = divide2371(t, 2, &remain);
if (remain)
{
printf(" %s", power3[index]);
putchar(strcmp(t, "0") ? ',' : ' ');
}
index++;
}
putchar('}');
putchar('\n');
}
return 0;
}