10怎么会是yes呢?1! 2! 3! 4! 对应 1 2 6 24 怎么加都不会等于10
输入:
0
1
2
9
10
12
24
5040
-1
输出:
NO
YES
YES
YES
NO
NO
YES
YES
程序代码:
[ 本帖最后由 UserYuH 于 2009-11-13 03:58 编辑 ]
输入:
0
1
2
9
10
12
24
5040
-1
输出:
NO
YES
YES
YES
NO
NO
YES
YES
程序代码:#include <stdio.h>
long m;
int funsum(int len,long *a,long n) /*递归查找比对,查到反回 1,否则反回 0 */
{
int i;
if( m < 1 ) return 0;
if( m == *a ) return 1;
if( n == m ) return 1;
if( n > m ) return 0;
for(i=0;i<len;i++)
{
if(funsum(len-1,a+i+1,n+a[i])) return 1;
}
return 0;
}
int main(void)
{
int i,j,k,a_len,data_len; /*a_len记阶乘长度,data_len记输入数长度 */
long n,max=0,a[200]={0},getdata[50];
for(i=0;scanf("%ld",&n);i++) /* 循环输入数,输入-1或非法输入退出循环 */
{
if( n == -1 ) break;
getdata[i]=n;
if(max<n)max=n;
}
if(i==0) exit(0);
data_len=i; /*获输入数长度*/
for(j=1; ;j++) /* 算可用最大阶乘 */
{
for(k=1,n=1;k<=j;k++)
{
n*=k;
}
if( n > max ) break;
a[j-1]=n;
}
a_len=j-1; /* 阶乘长度 */
for(i=0;i<data_len;i++) /* 循环对每个输入数查找比对 */
{
for(j=a_len-1;j>=0;j--) /* 算该数可用到的阶乘长度,大于该数的阶乘不做计算,为了省时 */
if(getdata[i] >= a[j]) break;
m=getdata[i];
n=0;
if(funsum(j+1,a,n))
printf("YES\n");
else
printf("NO\n");
}
system("pause");
return 0;
}[ 本帖最后由 UserYuH 于 2009-11-13 03:58 编辑 ]

努力—前进—变老—退休—入土








