1028. Hanoi Tower Sequence (高精,除2)

来源:互联网 发布:淘宝店铺怎么改店名 编辑:程序博客网 时间:2024/05/01 00:22

思路:

设第n个数为k,则该序列的结构为:

。。。。。。。。。。。。。。。o。。。。。。。。。。。。。。

2^(k-1)-1个数                                 数字k                  2^(k-1)-1个数 

因此2^(k-1)-1+1=n,即

     2^(k-1)=n;

因此,输入n,只要判断n被2整除的次数,再+1即得结果.


第一次写复杂爆了,超时了,但是结果还是对的,忽略它吧

#include <iostream>#include <string>using namespace std;bool dividable(string s){int num=0;for(int j=0;j<s.length();j++){num=10*num+s[j]-'0';num%=2;}if(num==0) return true;else return false;}int main(){int t;cin>>t;for(int z=1;z<=t;z++){string s,temp="";cin>>s;if(s.length()==1){int a=s[0]-'0',c=0;while(a%2==0){c++;a/=2;}cout<<c+1<<endl;continue;}int count=0,num;while(dividable(s)){count++;temp.push_back(char((s[0]-'0')/2+'0'));num=(s[0]-'0')%2*10+s[1]-'0';for(int i=1;i<s.length()-1;i++){temp.push_back(char(num/2+'0'));num=(num%2)*10+s[i+1]-'0';if(i==s.length()-2) temp.push_back(char(num/2+'0'));}s=temp;temp="";}cout<<count+1<<endl;}return 0;}



第二次把字符串先转换为数字串,然后直接用原字符串保存数字,快了很多。

#include <iostream>#include <string>using namespace std;int main(){    int t;    cin>>t;    for(int z=1;z<=t;z++)    {        string s;        cin>>s;        for(int i=0;i<s.length();i++)            s[i]-='0';        int count=0;        while(1)        {            for(int i=0;i<s.length()-1;i++)            {                s[i+1]+=(s[i]%2)*10;                s[i]/=2;            }            if(s[s.length()-1]%2==1) break;            s[s.length()-1]/=2;            count++;        }        if(z!=1) cout<<endl;        cout<<"Case "<<z<<": "<<count+1<<endl;    }    return 0;}


原创粉丝点击