满意答案
再对了...设定了20000位,应该够了,好麻烦..
#include
#include
#include
int m[20000] = {0};
int digit = 1;
int *result(int *a,int n);
void num(int n);
int main()
{
char a[1000] = {'\0'}, *p;
int s[50000], i, j = 0;
scanf("%s", a);
int size = (int)strlen(a);
while(1)
{
for(i = 0; i < size ; i++)
{
if(a[i] <= '1')
{
if(i == (size-1))
{
s[j] = int(a[i] - '0') % 2;
a[i] = '0';
j++;
break;
}
else
{
a[i+1] += ((a[i] - '0') % 2) * 10;
a[i] = '0';
continue;
}
}
if(i == (size-1))
{
s[j] = int(a[i] - '0') % 2;
j++;
a[i] = (int(a[i] - '0') / 2 + '0');
continue;
}
a[i+1] += ((a[i] - '0') % 2) * 10;
a[i] = ((a[i] -'0')/2 + '0');
}
a[size] = '\0';
p = a;
while(*p != '\0')
{
if( *p != '0')
break;
p++;
}
if( *p == '\0')
break;
}
for(int k = j - 1,f = 0; k >= 0; k--,f++)
{
if(s[k] != 0)
{
num(f);
}
}
for(i = digit - 1; i >= 0; i--)
printf("%d", m[i]);
printf("\n");
return 0;
}
int *result(int *a,int n)
{
int carry;
int i, k;
a[0] = 1;
int temp;
digit = 1;
for(i = 2,k = 1; k <= n; ++k)
{
carry = 0;
for(int j = 1; j <= digit; ++j)
{
temp = a[j-1] * i + carry;
a[j-1] = temp % 10;
carry = temp / 10;
}
while(carry)
{
a[++digit-1] = carry % 10;
carry /= 10;
}
}
return a;
}
void num(int n)
{
int *p;
p = new int[20000];
p = result(p,n);
for(int j = digit - 1; j>= 0; j--)
{
m[j] += p[j];
if((m[j] / 10) != 0)
{
m[j+1] += (m[j] / 10);
m[j] %= 10;
}
}
delete p;
}
00分享举报