Bootstrap

中间溢出

例题2-2 3n+1问题   猜想:对于任意大于1的自然数n,若n为奇数,则将n变成3n+1,否则变成一半  
经过若干次这样的变换,一定会使n变成1.例如3->10->5->16->8->4->2->1 输入n,输出变换的次数。n≤10^9.
 样例输入:3  样例输出:7  

这里写图片描述
粗看没有问题。
int假设是32位,那么最大可取到2^31+1=2147483649,也就是21亿4千7百48万3千6百49,而10^9刚好是10亿,也就是说输入范围没有问题
关键是中间结果 n*3+1可能会溢出

怎么办呢?
1.n用long long存储
2.一个临时的解决方案是:因为n为奇数事3*n+1一定是偶数,下一步将其立刻除以2.如果将两次操作一起做,可以在一定程度上缓解这个问题。

现使用第二种方法

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  unsigned  n, count = 0;
  scanf("%d", &n);
  while(n > 1)
  {
     if(n % 2 == 1)  { n = n + (n+1)/2; count += 2; continue;}
     else n >>= 1 ;
     count++;
  }
  printf("%d\n", count);

  system("PAUSE");  
  return 0;
}
;