HDU 2568 前进 (递归+模拟两种方式)

来源:互联网 发布:java求50以内的质数 编辑:程序博客网 时间:2024/05/01 13:43

前进

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5959    Accepted Submission(s): 4617


Problem Description
轻松通过墓碑,进入古墓后,才发现里面别有洞天。
突然,Yifenfei发现自己周围是黑压压的一群蝙蝠,个个扇动翅膀正准备一起向他发起进攻!
形势十分危急!
好在此时的yifenfei已经不是以前那个经常被lemon抢走MM的菜鸟了!面对众多蝙蝠的嗜血狂攻,只见yifenfei使出轻灵的剑法,刷,刷,刷,瞬间搞定……
现已知yifenfei使用了2招(剑招A和剑招B):剑招A,一招能杀死一半的蝙蝠。但是如果当前的蝙蝠数为奇数,那么就必须先出一招剑招B杀死其中任意一个,使蝙蝠数为偶数,再出剑招A。
现在请问:杀死n只蝙蝠需要使出多少招剑招B?
 

Input
输入数据首先给出一个整数C,表示测试组数。
然后是C组数据,每组包含一个正整数n (n<2^31)。

 

Output
对应每组数据,请输出一个整数,表示yifenfei使用的剑招B的数目,每组输出占一行。
 

Sample Input
215
 

Sample Output
12
 

Author
yifenfei
 

Source
ACM程序设计期末考试081230

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2568


水题:两种思路
1 . 模拟.
2.  递归.

AC代码1,模拟:

#include <iostream>using namespace std;int main(){    int n,t;    cin>>t;    while(t--)    {        cin>>n;        int sum=0;        while(n)        {            if(n%2==0)                n/=2;            if(n&1)            {                sum++;                n--;            }        }        cout<<sum<<endl;    }    return 0;}

AC代码2,递归

#include <iostream>int fun(int n){    if(n==1) return 1;    if(n%2==0) return fun(n/2);    if(n&1) return 1+fun(n-1);}using namespace std;int main(){    int n,t;    cin>>t;    while(t--)    {        cin>>n;        cout<<fun(n)<<endl;    }    return 0;}



0 0
原创粉丝点击