zoj1095 Humble Numbers(DP)

/*
 简单DP:每次将求得的值分别乘以2,3,4,7,然后利用插入排序插入到数据序列中
   保证数据的递增序,最终到达结束状态。
*/

ContractedBlock.gif ExpandedBlockStart.gif View Code
 1 #include <iostream>
2 #include <cstdlib>
3 #include <stdio.h>
4
5 using namespace std;
6
7 long long data[ 6000 ] = {0,1,2,3,5,7};
8
9 bool bs( int l, int h, long long key )
10 {
11 while ( l <= h ) {
12 int mid = (l+h)/2;
13 if ( data[ mid ] == key )
14 return true;
15 else if ( data[ mid ] > key )
16 h = mid-1;
17 else l = mid+1;
18 }
19 return false;
20 }
21
22 int main()
23 {
24 int save = 6,move = 2;
25 while ( move < save && save < 6000 ) {
26 for ( int i = 2 ; i <= move ; ++ i ) {
27 data[ save ] = data[ move ]*data[ i ];
28 if ( data[ save ] <= 2000000000 && !bs( 1, save-1, data[ save ] ) ) {
29 int now = save ++;
30 while ( data[ now ] < data[ now-1 ] ) {
31 swap( data[ now ], data[ now-1 ] );
32 -- now;
33 }
34 }
35 }
36 ++ move;
37 }
38 int n;
39 while ( scanf("%d",&n) && n ) {
40 cout << "The " << n;
41 if ( n%10 == 1 && n%100 != 11 )
42 cout << "st";
43 else if ( n%10 == 2 && n%100 != 12 )
44 cout << "nd";
45 else if ( n%10 == 3 && n%100 != 13 )
46 cout << "rd";
47 else
48 cout << "th";
49 cout << " humble number is " << data[ n ] << "." << endl;
50 }
51 return 0;
52 }

转载于:https://www.cnblogs.com/-xiaobai-/archive/2011/08/17/2143012.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值