| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1888 人关注过本帖, 1 人收藏
标题:求个算法
只看楼主 加入收藏
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:1 
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
程序代码:
#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 编辑 ]

努力—前进—变老—退休—入土
2009-11-13 03:39
banyou
Rank: 1
等 级:新手上路
帖 子:2
专家分:2
注 册:2009-11-10
收藏
得分:2 
给定一个数n(n<=1,000,000)(9!<1000000  10!>1000000)
这样的话
我可以解决(我也是大一的新手)
虽然长点,但很好理解哦
#include<stdio.h>
int o(int n)
{
    int i,sum=1;
    if(n==0)
        return 1;
    for(i=1;i<=n;i++)
        sum*=i;
    return sum;
}
void main()
{
    int x,i,j,k,l,m,n,flag;
    while(scanf("%d",&n)!=EOF && n!=-1)
    {
        x=0;
        flag=0;
        for(i=0;i<10;i++)
            x+=o(i);
        for(i=0;i<10;i++)
        {
            if(n==o(i)||(x-n)==o(i))
                flag=1;
            for(j=i+1;j<10;j++)
            {
                if(n==o(i)+o(j)||(x-n)==o(i)+o(j))
                    flag=1;
                for(k=j+1;k<10;k++)
                {
                    if(n==o(i)+o(j)+o(k)||(x-n)==o(i)+o(j)+o(k))
                        flag=1;
                    for(l=k+1;l<10;l++)
                    {
                        if(n==o(i)+o(j)+o(k)+o(l)||(x-n)==o(i)+o(j)+o(k)+o(l))
                            flag=1;
                        for(m=l+1;m<10;m++)
                            if(n==o(i)+o(j)+o(k)+o(m)+o(l)||(x-n)==o(i)+o(j)+o(k)+o(m)+o(l))
                                flag=1;
                    }
                }
            }
        }
        if(flag)
            printf("YES\n");
        else
            printf("NO\n");
    }
}


[ 本帖最后由 banyou 于 2009-11-13 11:46 编辑 ]
2009-11-13 11:41
banyou
Rank: 1
等 级:新手上路
帖 子:2
专家分:2
注 册:2009-11-10
收藏
得分:0 
回复 11楼 UserYuH
大哥
0!=1
2009-11-13 11:43
longlong89
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:小飞侠
威 望:6
帖 子:1043
专家分:2754
注 册:2009-8-18
收藏
得分:0 
本人也来个
算法分析:
此问题其实是求输入数与阶乘序列子序列阶乘和是否匹配
code如下:
程序代码:
#include <stdio.h>
#define N 9
long jc[N] = {1, 2, 6, 24, 120, 720, 5040, 40320, 362880};/* 此处可扩展,本人只列出6位数的 */
main ()
{
    long i, j, sum, num;
    while (scanf ("%ld",&num))
    {    
      for (i = 0; i < N; ++ i)
       {
        sum = 0;
        for (j = i; j < N; ++ j)
          {    sum += jc[j];
              if (num == sum)
               printf ("YES\t");
              else if (sum < jc[j])
                       break;
             }
           }
                 }
getch ();
return 0;
             } 
   

[ 本帖最后由 longlong89 于 2009-11-13 12:52 编辑 ]

想象力征服世界
2009-11-13 12:51
longlong89
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:小飞侠
威 望:6
帖 子:1043
专家分:2754
注 册:2009-8-18
收藏
得分:0 
顶递归!

想象力征服世界
2009-11-13 12:53
仰望者
Rank: 2
等 级:论坛游民
帖 子:57
专家分:86
注 册:2009-11-6
收藏
得分:0 
注意,这些数不一定是连续的,也不一定从1开始。
14#误解题意了。。。。
2009-11-13 13:08
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
收藏
得分:1 
超级无聊····0-1算法···10个嵌套循环···哈哈···应该不会超时哦~~~~~
程序代码:
#include<stdio.h>
int main(void)
{
    int num[10] = {1,1,2,6,24,120,720,5040,40320,362880};
    int num1, num2, num3, num4, num5, num6, num7, num8, num9, num10, N, flag;
    while(scanf("%d", &N) && N!=-1)
    {
        if(0 == N)
        {    printf("NO!\n");continue;   }
        flag = 0;
        for(num1=0; num1<2; num1++)
            for(num2=0; num2<2; num2++)
                for(num3=0; num3<2; num3++)
                    for(num4=0; num4<2; num4++)
                        for(num5=0; num5<2; num5++)
                            for(num6=0; num6<2; num6++)
                                for(num7=0; num7<2; num7++)
                                    for(num8=0; num8<2; num8++)
                                        for(num9=0; num9<2; num9++)
                                            for(num10=0; num10<2; num10++)
            if(N == num[0]*num1+num[1]*num2+num[2]*num3+num[3]*num4+num[4]*num5+num[5]*num6+
                num[6]*num7+num[7]*num8+num[8]*num9+num[9]*num10)    
            {  flag = 1; break;}
            if(!flag)
                printf("NO!\n");
            else
                printf("YES!\n");
    }    
    return 0;
}
2009-11-13 13:37
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
背包问题?
2009-11-13 14:56
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
恩,子集和问题和背包问题都是NP问题……

看来这题可以DP

专心编程………
飞燕算法初级群:3996098
我的Blog
2009-11-13 15:03
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
收藏
得分:0 
引起了大家无限遐想··~~~
2009-11-13 15:07
快速回复:求个算法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023675 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved