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 编辑 ]
努力—前进—变老—退休—入土