编程论坛
注册
登录
编程论坛
→
C++教室
求解问题...
mylzy159
发布于 2010-04-19 07:26, 485 次点击
输入一个整数N,这个整数能被分解成若干个整数的阶层相加..如N=x!+y!+.....+n!
并且各个整数互不相等..输入N,求x+y+.....+n的值..
4 回复
#2
cnfarer
2010-04-19 09:16
几乎是算法问题!提供一个解题思路!
可以用递归来解决:写一个函数返回N的所包含的最大X的阶乘(如7是3!+1),然后以N-X!作为函数的参数,继续求解,依此类推,直到最后一个数正好是某数的阶乘为止!
#3
mywaylgh
2010-04-19 10:57
程序代码:
#include
<stdio.h>
#include
<stdlib.h>
#define
MAX 10000000
int
factorial(
int
*fa)
{
int
i=
1
;
int
p=
1
;
while
(
1
)
{
p = p*i;
if
(p>MAX)
break
;
fa[i++]=p;
}
return
i-
1
;
}
int
lit_n(
int
*pn,
int
*fa,
int
s)
{
int
i;
for
(i=
1
;i<s ;i++ )
if
(*pn>=fa[i] && *pn<fa[i+
1
])
{
*pn = *pn-fa[i];
return
i;
}
return
-
1
;
}
int
main()
{
int
fa[
100
];
int
pr[
100
];
int
s = factorial(fa);
int
n,cons_n,i=
0
,j;
scanf(
"
%d
"
,&n);
cons_n = n;
pr[
0
]=lit_n(&n,fa, s);
while
(n>
0
)
{
i++;
pr[i]=lit_n(&n,fa, pr[i-
1
]);
if
(pr[i]==-
1
)
break
;
}
if
(n==
0
)
{
printf(
"
%d = %d!
"
,cons_n,pr[
0
]);
for
(j=
1
;j<=i ;j++ )
printf(
"
+ %d!
"
,pr[j]);
printf(
"
\n
"
);
}
else
printf(
"
Can not decompose %d\n
"
,cons_n);
return
0
;
}
楼上算法,不过不是递归,做了小小的改进
晕,我发现我快成IT民工了
#4
mylzy159
2010-04-21 16:20
提供思路就行了...忘记说了..不好意思..
#5
mylzy159
2010-04-21 16:49
#include <iostream>
using namespace std;
void fun(int x,int sum)
{
int i,a,result=1;
for(i=1;i<=x;i++)
{
for(a=1;a<=i;a++)
result*=a;
if((x-result)==0)//判断整数的最后一个阶层
{
sum+=i;
cout<<sum;
exit(0);
}
if((x-result)<result)//判断是否是最大阶层
{
sum+=i;
fun(x-result,sum);
}
result=1;
}
}
main()
{
int sum=0,n;
cin>>n;
fun(n,sum);
}
貌似能行/..
1