ajikan 发表于 2018-3-27 21:19:04

S1E6麦子问题程序疑惑

各位大佬好,这题目关于取值范围的要求我大概明白了。但是有个疑问。在编程时
#include<math.h>

int main()
{
        unsigned long long sum=0;
        unsigned long long temp;
        unsigned long long weight;
        int i;
       
        for (i=0;i<64;i++)
        {
        temp=pow(2,i);
        sum=temp+sum;/*这部分为什么不能偷懒写成sum=pow(2,i)+sum; 试了下结果是0*/
        };
       
       
        printf("sum=%llu\n",sum);
       
        return 0;
       
}

关于红字部分为什么不能写作sum=pow(2,i)+sum呀 或者请问这是那部分能学到的知识呢

Zmynx_2017 发表于 2018-3-27 21:40:25

是不是超出最大范围了,所以最终结果为0了,你可以试一下2的63次方,估计应该是正确的,

两种写法都可以,但是第二种计算方法出现奇怪问题的原因可能是存储位数的问题吧,并不太清楚。

你可以看一下这样增加几行代码的结果,或许你就明白了

#include<math.h>
#include<stdio.h>
int main()
{
      unsigned long long sum=0;
      unsigned long long sum1=0;
      unsigned long long temp;
      unsigned long long weight;
      int i;
      
      for (i=0;i<64;i++)
      {
      temp=pow(2,i);
      sum=temp+sum;/*这部分为什么不能偷懒写成sum=pow(2,i)+sum; 试了下结果是0*/
                printf("pow(2,%d)=%llu",i,pow(2,i)) ;
      sum1=pow(2,i)+sum1;
      printf("sum=%llu\n",sum1);
      };
      printf("sum=%llu\n",sum);   
      return 0;
      
}

ba21 发表于 2018-3-27 21:54:36

sum=(unsigned long long)(pow(2,i))+sum; // 因为pow返回的是double类型

Zmynx_2017 发表于 2018-3-27 23:20:41

上面   ba21   回答是正解。牛!!!o( ̄▽ ̄)d。

ajikan 发表于 2018-3-28 10:19:09

谢谢两位的答疑!继续学习争取完全搞明白!(关于返回值好像还没学到

ajikan 发表于 2018-3-28 10:23:47

我猜这个语句(unsigned long long)(pow(2,i))的意思是把pow(2,i)计算出的结果定义成一个unsigned long long 的数值 再进行sum=结果+sum的计算{:10_257:}
页: [1]
查看完整版本: S1E6麦子问题程序疑惑