| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 485 人关注过本帖
标题:求解问题...
只看楼主 加入收藏
mylzy159
Rank: 2
等 级:论坛游民
帖 子:61
专家分:23
注 册:2009-4-12
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:4 
求解问题...
输入一个整数N,这个整数能被分解成若干个整数的阶层相加..如N=x!+y!+.....+n!
并且各个整数互不相等..输入N,求x+y+.....+n的值..
搜索更多相关主题的帖子: 求解 
2010-04-19 07:26
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:10 
几乎是算法问题!提供一个解题思路!
可以用递归来解决:写一个函数返回N的所包含的最大X的阶乘(如7是3!+1),然后以N-X!作为函数的参数,继续求解,依此类推,直到最后一个数正好是某数的阶乘为止!

★★★★★为人民服务★★★★★
2010-04-19 09:16
mywaylgh
Rank: 8Rank: 8
来 自:厨房
等 级:蝙蝠侠
威 望:5
帖 子:188
专家分:729
注 册:2010-3-10
收藏
得分:10 
程序代码:
#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民工了

人生就像茶几 上面放着许多杯具

人生也像厨房 里面总有一些洗具
2010-04-19 10:57
mylzy159
Rank: 2
等 级:论坛游民
帖 子:61
专家分:23
注 册:2009-4-12
收藏
得分:0 
提供思路就行了...忘记说了..不好意思..
2010-04-21 16:20
mylzy159
Rank: 2
等 级:论坛游民
帖 子:61
专家分:23
注 册:2009-4-12
收藏
得分:0 
#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);
}
貌似能行/..
2010-04-21 16:49
快速回复:求解问题...
数据加载中...
 
   



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

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