【志銀】NYOJ《題目529》flip

題目:flip

題目連接:http://acm.nyist.net/JudgeOnline/problem.php?pid=529

吐槽Time:

因爲此題槽點太多,因此沒忍住...php

看到這題經過率出奇的高而後愉快的進來想水掉...but...
一開始狂百度找討論區也徹底看不懂題意啊,
還好後來經過這些零碎的線索補腦了下面的題意,
能AC但不很肯定484題目本意,但願對你們有幫助(話說這樣會不會幫倒忙啊^_^).ios

題目意思:

要經過x的二進制的任意位置上的數(0變爲1,或1變爲0)使十進制的x變爲x+1, 一次只能改變二進制的x的一位,求最少須要的次數.哈哈!算法

解題思路:

經過人工打草稿的方法加上手指和快速的心算在紙上(這算神馬算法0.0)算出了1~5的結果,過程簡單描述以下
1(0001)  ->0011->0010              ->2(0010)=>變2次
2(0010)  ->0011                        ->3(0011)=>變1
3(0011)  ->0111->0110->0100   ->4(0100)=>變3
4(0100)  ->0101                        ->5(0101)=>變1
5(0101)  ->0111->0110              ->6(0110)=>變2
哈哈,獲得規律:x的二進制數從1開始從右往左數第一個0的位置是幾就最少須要改變幾回。
(ps:話說這麼長的原理連本身都以爲有點像說了和沒說同樣)
(規律原理:最少改變次數爲x的二進制加1後包括進位所改變的位置數,二進制加1的進位改變中止於x的二進制數從右往左數第一個0的位置.)
我去,終於能夠寫代碼了..最近漫畫看多了,不知不覺吐了這麼多槽,這麼可貴不能浪費得寫到博客裏去,哈哈哈哈spa

//對於我這種單純boy來講仍是來段個人簡單走心的暴力法吧,超時什麼的咱不慫,哈哈,(提交後AC的說,嘿嘿).net

#include<iostream>
using namespace std;
int main() {
  int T, x, n;
  cin >> T;
  while(T--) {
    cin >> x;
    n = 0;
    int y = x%2;
     do {
      y = x%2;
      x /= 2;
      n++;
    } while(y != 0);
    cout << n << endl;
  }
}

 

開始寫於:2016.9.9  ----志銀

相關文章
相關標籤/搜索