hdu 3782 XXX定律 与位运算相关

xxx定律
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1648    Accepted Submission(s): 1312


Problem Description
对于一个数n,如果是偶数,就把n砍掉一半;如果是奇数,把n变成 3*n+ 1后砍掉一半,直到该数变为1为止。
请计算需要经过几步才能将n变到1,具体可见样例。
 

Input
测试包含多个用例,每个用例包含一个整数n,当n为0 时表示输入结束。(1<=n<=10000)
 

Output
对于每组测试用例请输出一个数,表示需要经过的步数,每组输出占一行。
 

Sample Input
3
1
0
 

Sample Output
5
0
 

Source
浙大计算机研究生复试上机考试-2009年
 

Recommend
notonlysuccess
 

法一:是利用位运算做的,表达式n=n/2 相当于 用位运算表达是n=n>>1  ,
原因是位运算是对储存的二进制位的操作,向右移动一位相当于处于2

#include "stdio.h"
#include "stdlib.h"
int main()
{int n,time;
while(scanf("%d",&n),n)
   {time=0;
    while(n!=1)
      {if(n&1)  //利用为运算的特点对n值进行奇偶数判定
      {n=3*n+1;
      n>>=1;  //相当于n=n/2;
      }
      else
      {n>>=1;
      }
      time++;
  }
  printf("%d ",time);
  }
  return 0;
  }


法二:是利用普通的方法对奇偶数进行判断的

#include "stdio.h"
int main()
{int n,time;
  while(scanf("%d",&n),n)
  { time=0;
    while(n!=1)
    {if(n%2==0)
      {n/=2;
      }
      else
      {n=3*n+1;
       n/=2;
      }
      time++;
    }
    printf("%d ",time);
   
      }
      return 0;
   }

原文地址:https://www.cnblogs.com/songmingtao/p/3230994.html