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

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日

悬赏问题

  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥15 安装svn网络有问题怎么办