题目
猜想,对于任意大于1的自然数n,若n为奇数,则将n变为3n+1,否则变为n的一半,经过若干次这样的变换,一定会使n变为1。输入n,输出变化的次数,n <= 10^9
得到的提示:
- 当需要统计某种事物的个数时,可以用一个变量来充当计数器。
- 在无法找出错误时,可以使用输出中间结果的方式来找错
//version1.0
#include<stdio.h>
//当需要统计某种事物的个数时,可以用一个变量来充当计数器~
int main()
{
int n,count = 0;//定义整形变量count的同时初始化为0
//count的作用是计数器,由于最后输出的是变换的次数,所以需要一个变量来完成计数
//所以count的作用是一个计算while总共运行了多少次的变量
scanf("%d",&n);
while(n>1)
{
if(n % 2 == 1)n = n *3+1;
else n /= 2;
printf("%d\n",n);//输出中间的结果
count ++;
}
printf("%d\n",count);
}
在version1.0中输入接近10^9的数对于IDE中的int会溢出
#version2.0
#include<stdio.h>
int main()
{
int n1, count = 0;
scanf("%d",&n1);
long long n = n1;
while(n>1)
{
if(n % 2 == 1)n = n *3+1;
else n /= 2;
printf("%d\n",n);//在循环中放一个输出是为了查找错误
count ++;
}
printf("%d\n",count);
}
在这个例子中,int的上界太小了和10^9相比,所以需要更大的范围来控制n不溢出。
所以要考虑数据类型的取值
int整数类型在C99中只规定了至少是16位,并没有规定具体数值
在竞赛中int都是32位整数,范围是-2147483648~2147283647
所以用long long 类型的n才能不溢出