muhaihai 2021-09-19 00:34 采纳率: 66.7%
浏览 454
已结题

c语言long long类型数据溢出

#纯新手,在解决计算任意输入的在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=3
o+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=n
3+1;
else n/=2;
count++;
if(n>k)
{
k=n;
printf("%d %d ",k,count);
}
}
printf("%d\n",count);
return 0;
}

  • 写回答

3条回答 默认 最新

  • CSDN专家-sinJack 2021-09-19 00:35
    关注

    long long换成double类型试试

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 9月27日
  • 已采纳回答 9月19日
  • 创建了问题 9月19日

悬赏问题

  • ¥50 求fpga交通信号灯设计Verilog代码
  • ¥50 adb连接不到手机是怎么回事?
  • ¥20 抓取数据时发生错误: get_mooncake_data() missing 1 required positional argument: 'driver'的问题,怎么改出正确的爬虫代码?
  • ¥15 vs2022无法联网
  • ¥15 TCP的客户端和服务器的互联
  • ¥15 VB.NET操作免驱摄像头
  • ¥15 笔记本上移动热点开关状态查询
  • ¥85 类鸟群Boids——仿真鸟群避障的相关问题
  • ¥15 CFEDEM自带算例错误,如何解决?
  • ¥15 有没有会使用flac3d软件的家人