HDOJ 1058 Humble Numbers

239 篇文章 0 订阅

HDACM1058

此题有两个地方值得关注:
1.输出格式:由样品输出的格式我们可以看出 “st”, “nd”, “rd”, or “th” 有这4种后缀格式的,所以输出有4种情况:
①当n%10==1&&n%100!=11时,是以st为后缀
②当n%10==2&&n%100!=12时,是以nd为后缀
③当n%10==3&&n%100!=13时,是以rd为后缀
④其他情况时,是以th为后缀

2.如何提高效率:显然这一题采用动态规划来做,不然就Time Limit Exceeded
根据题意可知,第n个数它是由若干个2,3,5,7相乘得出的数。所以采用动态规划来做。
a=1,b=1,c=1,d=1;
第1个数是特殊的,是table[1]=1。
第2个数是2–>table[2] = table[1]*2; a++ a=2
第3个数是3–>table[3] = table[1]*3; b++ b=2
第4个数是4–>table[4] = table[2]*2; a++ a=3
第5个数是5–>table[5] = table[1]*5; c++ c=2
第6个数是6–>table[6] = table[a]*2 || table[b]*3;a++,b++
第7个数是7–>table[7] = table[1]*7;d++
第8个数是8–>table[8] = table[4]*2;a++
第9个数是9–>table[9] = table[3]*3;b++
第10个数是10–>table[10] = table[a]*2 || table[c]*5;a++,c++
第11个数是12–>table[11] = table[a]*2 || table[b]*3;a++,b++
其中a表示的是num=2+…+2(a个2)
其中b表示的是num=3+…+3(b个3)
其中c表示的是num=5+…+5(c个5)
其中d表示的是num=7+…+7(d个7)

import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        int table[] = new int[5843];//定义一个表
        makeTable(table);//给表初始化
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
            if (n==0) {
                break;
            }
            System.out.print("The "+n);
            if (n%10==1 && n%100 != 11) {
                System.out.print("st");
            }else if (n%10==2 && n%100 != 12) {
                System.out.print("nd");
            }else if (n%10==3 && n%100 != 13) {
                System.out.print("rd");
            }else {
                System.out.print("th");
            }
            System.out.println(" humble number is "+table[n]+".");
        }
    }

    private static void makeTable(int[] table) {
        table[1] = 1;
        int a=1,b=1,c=1,d=1;
        for (int i = 2; i < table.length; i++) {
            table[i] = min4(table[a]*2,table[b]*3,table[c]*5,table[d]*7);
            if (table[i]==table[a]*2) {
                a++;
            }
            if (table[i]==table[b]*3) {
                b++;
            }
            if (table[i]==table[c]*5) {
                c++;
            }
            if (table[i]==table[d]*7) {
                d++;
            }
        }
    }

    private static int min4(int i, int j, int k, int l) {
        return min(min(min(i,j),k),l);
    }

    private static int min(int i, int j) {
        if (i>j) {
            return j;
        }
        return i;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值