UVA.11636 Hello World! (思维题)

UVA.11636 Hello World! (思维题)

题意分析

这题挺水的,还是错了几发。 QWQ。
有一个同学打了一行hello world,现在他想打n行hello world,请问最少复制粘贴几次。

先说说我的XX想法。绝对是中了二进制的邪!样例给给打好呀,如果我想输出4个,那么复制一次,得到2个,再复制一次得到4个。然后就莫名其妙的和二进制连起来了。

十进制———-二进制
0————–00000000
1————–00000001
2————–00000010
3————–00000011
4————–00000100

然后十进制对应的2^n就是在这个次数下最多得到的次数,然后又莫名其妙的想到了昨天写的(s &(1<< n)。结果可想而知,就是错了。

还是说正解吧。

假设复制n次,最多的到的个数是2^n,这个是确定无疑的,因为每次都将个数乘2嘛。于是我们可以从小到大依次枚举,即依次乘2,什么时候超过了给定的n,那么就说明这个就是最小的复制次数。下举例说明:

1.n=3
第一次 1 * 2 = 2
第二次 2 * 2 = 4 结束。

实际的复制情况是
1 * 2 = 2 , 2+1 = 3。

2.n=5
第一次 1 * 2 = 2
第二次 2 * 2 = 4
第三次 4 * 2 = 8

3.n=100
第一次 1 * 2 = 2
第二次 2 * 2 = 4
第三次 4 * 2 = 8
第四次 8 * 2 = 16
第五次 16 * 2 = 32
第六次 32 * 2 = 64
第七次 64 * 2 = 128

然后每次乘2,可以用位运算来简化。
说到底还是有点二进制的色彩的。

代码总览

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
    int n,kase = 0;
    while(scanf("%d",&n)&&n>0){
        int ans = 0;
        while(1<<ans<n) ans++;  
        printf("Case %d: %d
",++kase,ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/pengwill/p/7367126.html