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日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效