HDU 1058(Humble Numbers)动态规划

本文介绍了一种使用动态规划方法求解特定数学序列——谦数的问题。通过递推公式,利用已知的最小质数2、3、5、7来生成序列中的每一个数,并避免重复计算。代码实现中详细展示了如何更新指针并记录每个谦数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数学题目,感觉用数学应该可以解,应该有规律吧,打个表输出下?

动态规划就是用前面算出来的数去算后面的,这些数无非是2,3,5,7的倍数

dp[1]=1,

dp[count]=Min(Min(dp[i]*2,arry[j]*3),Min(dp[k]*5,dp[l]*7));

if(dp[count]==dp[i]*2) i++;
        if(
dp[count]==dp[j]*3) j++;
        if(
dp[count]==dp[k]*5) k++;
        if(
dp[count]==dp[l]*7) l++;

全部判断一遍是使重叠部分(例如6,15,14这种)都往上进1.

代码:

#include<stdio.h>
#include<string.h>

int arry[6000];

int Min(int x,int y)
{
    return x<=y?x:y;
}

int main()
{
    int i,j,k,l;
    int a,b,c,d;
    int count,n,ans;
    i=1,j=1,k=1,l=1;
    arry[1]=1;
    count=2;
    //memset(arry,0,sizeof(arry));
    while(count<=5842)
    {
        arry[count]=Min(Min(arry[i]*2,arry[j]*3),Min(arry[k]*5,arry[l]*7));
        if(arry[count]==arry[i]*2) i++;
        if(arry[count]==arry[j]*3) j++;
        if(arry[count]==arry[k]*5) k++;
        if(arry[count]==arry[l]*7) l++;
        count++;
    }
    while(scanf("%d",&n)!=EOF && n!=0)
    {
        if(n%10==1 && n%100!=11) printf("The %dst humble number is %d.\n",n,arry[n]);
        else if(n%10==2 && n%100!=12) printf("The %dnd humble number is %d.\n",n,arry[n]);
        else if(n%10==3 && n%100!=13) printf("The %drd humble number is %d.\n",n,arry[n]);
        else printf("The %dth humble number is %d.\n",n,arry[n]);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值