HDOJ1058 H数

DP。

思路:从{d[p2]*2,d[p3]*3,d[p5]*5,d[p7]*7}这四个数中取出最小值,即为新的d[i]。

其中,p2,p3,p5,p7为指针(不是变量类型是指针,而是作用相当于指针)

需要考虑d[p2]*2=d[p3]*3以及其它相等的情况。

#include "stdio.h"
int main(){
	int p2,p3,p5,p7,t2,t3,t5,t7;
	int i,j,k,mini;
	int d[6000];
	d[1]=1;
	p2=p3=p5=p7=1;
	for(i=2;i<=5843;i++){
		t2=d[p2]*2;
		t3=d[p3]*3;
		t5=d[p5]*5;
		t7=d[p7]*7;
		j=2;mini=t2;
		if(t3==mini){
			j+=20;
		}
		if(t3<mini){
			j=3;mini=t3;
		}
		if(t5==mini)j+=100;
		if(t5<mini){
			j=5;mini=t5;
		}
		if(t7==mini)j+=1000;
		if(t7<mini){
			j=7;mini=t7;
		}
		
		switch(j){
			case 2:p2++;break;
			case 3:p3++;break;
			case 5:p5++;break;
			case 22:p2++;p3++;break;
			case 7:p7++;break;
			case 102:p2++;p5++;break;
			case 1002:p2++;p7++;break;
			case 103:p3++;p5++;break;
			case 1003:p3++;p7++;break;
			case 122:p2++;p3++;p5++;break;
			case 1005:p5++;p7++;break;
			case 1022:p2++;p3++;p7++;break;
			case 1102:p2++;p5++;p7++;break;
			case 1103:p3++;p5++;p7++;break; 
			case 1122:p2++;p3++;p5++;p7++;break;
			default:break;
		}
		//printf("p2=%d, p3=%d, p5=%d, p7=%d\n",p2,p3,p5,p7);
		//printf("t2=%d, t3=%d, t5=%d, t7=%d, Number=%d\n",t2,t3,t5,t7,mini);
		//getchar();
		d[i]=mini;
	}	
	while(1){
		scanf("%d",&k);
		if(!k)break;
		printf("The %d",k);
		switch(k%10){
			case 1:
				if(k%100!=11)printf("st");else printf("th");
				break;
			case 2:
				if(k%100!=12)printf("nd");else printf("th");
				break;
			case 3:
				if(k%100!=13)
			printf("rd");
			else printf("th");
			break;
			default:printf("th");break;
		}
		printf(" humble number is %d.\n",d[k]);
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值