#纯新手,在解决计算任意输入的在10的九次方的范围内的数通过冰雹猜想的操作方式(冰雹猜想 是指:一个自然数x,如果是奇数就乘以3再加1,如果是偶数就析出偶数因数2ⁿ,这样经过若干个次数,最终回到1。)变成1所需的操作次数这一问题时,用long long类型进行运算。
虽然对987654321得到了和书中答案一样的操作数量180,但在检查运算过程中间值时,发现其中有一些数值为负。这个问题整体计算过程中不应该出现负值,所以我推测是数据溢出。但不太能理解原理是什么,毕竟理论上来讲long long类型的范围在10的18次方左右,而我手算负数出现的时候所在的步数的计算结果实际不超过100亿,不应该溢出。而且我是通过类似于冒泡算法的方式输出了计算中间值的最大值,但这个最大值又输出成一个负值,负数又是怎么在比较大小中比过正数的?
其次我使用的是devc++ 5.1.1,据说它应该不支持C99的内容,但我又可以顺利使用long long类型。这是为什么?在之后我又按照网上的方法尝试了一下在编译选项中添加“-std=c99”,以上问题也没有得到解决。
相关代码如下:
#include <stdio.h>
/int main ()
{
long long i=1,o,p,d;
int a,b=1;
for(;i!=987654321;i++)
{
o=i;
for(a=0;o!=1;a++)
{
if(o>d)
{
d=o;
}
if(o%2==0)
{
o=o/2;
}
else
{
o=3o+1;
}
}
if(a>b)
{
b=a;
p=i;
}
}
printf(" %d %d %d ",p,b,d);
}/
int main()
{
int n2,count=0;
scanf("%d",&n2);
long long n=n2,k=1;
while(n>1)
{
if(n%2==1)n=n3+1;
else n/=2;
count++;
if(n>k)
{
k=n;
printf("%d %d ",k,count);
}
}
printf("%d\n",count);
return 0;
}