C语言程序设计:求第1500个只有2,3,5因子的数。数是从小到大排列,第一个数是1,1=2^0*3^0*5^0 20

不要百度的,求大神自己写,最好能详细说明一下,新手有些可能看不懂(不是C++,是C)... 不要百度的,求大神自己写,最好能详细说明一下,新手有些可能看不懂(不是C++,是C) 展开
 我来答
GTA小鸡
高粉答主

2017-04-14 · 醉心答题,欢迎关注
知道大有可为答主
回答量:2.6万
采纳率:78%
帮助的人:1.3亿
展开全部

这题可以用动态规划解

状态转移方程是F[n]=min(F[当前2的指数]*2,F[当前3的指数]*3,F[当前5的指数]*5)

即下一项的值等于当前2的指数项的值×2、当前3的指数项的值×3或当前5的指数项×5中最小的那个,同时将对应因子的指数加1

其中F[n]代表第n个只有2,3,5因子的数

#include<stdio.h>
double min(double index_2,double index_3,double index_5) //min函数返回三者中最小的一个
{
    double min_t=index_2;
    if(min_t>index_3) min_t=index_3;
    if(min_t>index_5) min_t=index_5;
    return min_t;
}
int main()
{
    double f[1500];
    int times_2=0; //将三个因子的次数都置为0
    int times_3=0;
    int times_5=0;
    f[0]=1; //将第一项置为1
    int i;
    for(i=1;i<1500;i++)
    {
        f[i]=min(f[times_2]*2,f[times_3]*3,f[times_5]*5); //第i项的值等于第times_2项*2、第times_3项*3、第times_5项*5中最小的一个,注意可能有相等的情况
        //同时将对应因子的次数加1,可能有相等的情况,因此必须逐一判断
        if(f[i]==f[times_2]*2) times_2++;
        if(f[i]==f[times_3]*3) times_3++;
        if(f[i]==f[times_5]*5) times_5++;
    }
    printf("%.0f",f[1499]); //输出第1500项的值
}
追问
没学过动态规划,完全看不懂
追答
那这个题对你来说太难了,你可以跳过
或者用你学过的穷举法解,不过这样一定会超时。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式