鱼C论坛

 找回密码
 立即注册
查看: 1391|回复: 9

[已解决]s1e6 问题

[复制链接]
发表于 2019-7-27 16:09:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
#include <math.h>

int main()
{
        long long int sum=0;
        long long int temp;
        long long int weight;
        int i;
        for (i=0;i<64;i++)
        {
                temp=pow(2,i);
                sum = sum + temp;
        }

        weight = sum / 25000;

        printf("%llu\n",sum);
        printf("%llu\n",weight);
        return 0;
}

没有warming,为什么最后weight返回的是0,sum就没有问题
最佳答案
2019-7-27 18:08:47
jackz007 发表于 2019-7-27 16:34
楼主试试这个代码:

2的0次方 64位2进制表示就是 0000 ... 0001(0次方时这个1的位置是从右往左数第1个位置);
此时 sum = 0000 ... 0000 + 0000 ... 0001 = 0000 ... 0000;

2的1次方 64位2进制表示就是 0000 ... 0010(1次方时这个1的位置是从右往左数第2个位置);
此时 sum = 0000 ... 0001 + 0000 ... 0010 = 0000 ... 0011;


2的2次方 64位2进制表示就是 0000 ... 0100(2次方时这个1的位置是从右往左数第3个位置);
此时 sum = 0000 ... 0011 + 0000 ... 0100 = 0000 ... 0111;

.
.
.

2的63次方 64位2进制表示就是 1000 ... 0000(63次方时这个1的位置是从右往左数第64个位置);
此时 sum = 0111 ... 1111 + 1000 ... 0000 = 1111 ... 1111;

在long long int 中 1111 ... 1111 表示的值是 -1(这个去了解符数的2进制) ,  -1 / 25000 = 0(所以weight的值是0)

printf中 %llu是以unsigned long long的方式打印所以 sum 1111 ... 1111 在long long中是-1, 在unsigned long long中就变成了2的64次方, weight本身就是0 从long long转换成 unsigned long long 还是0

(希望能对你有帮助)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-7-27 16:34:38 | 显示全部楼层
本帖最后由 jackz007 于 2019-7-27 16:52 编辑

      楼主试试这个代码:
#include <stdio.h>
#include <math.h>

int main(void)
{
        double sum , temp , weight                                ;
        int i                                                     ;
        for (i = 0 , sum = 0.0 ; i < 64 ; i ++) sum += pow(2 , i) ;
        weight = sum / 25000                                      ;
        printf("%.0lf\n" , sum)                                   ;
        printf("%.0lf\n" , weight)                                ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-27 16:56:05 | 显示全部楼层
jackz007 发表于 2019-7-27 16:34
楼主试试这个代码:

取不到64的,i<64最高i = 63
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-27 17:48:31 | 显示全部楼层
本帖最后由 jackz007 于 2019-7-27 17:49 编辑

    问题似乎出在 pow(2 , i) 上
    下面的代码在我这里运行正常,TDM-GCC 5.1.0 x32 , 楼主也可以试试
#include <stdio.h>

int main()
{
        unsigned long long  m , sum , temp , weight               ;
        int i , k                                                 ;
        for (i = 0 , sum = 0.0 ; i < 64 ; i ++) {
                for(k = 0 , m = 1 ; k < i ; k ++) m *= 2          ;
                sum += m                                          ;
        }
        weight = sum / 25000                                      ;
        printf("%I64u\n" , sum)                                   ;
        printf("%I64u\n" , weight)                                ;
}

      下面是运行实况:
C:\Bin>x1
18446744073709551615
737869762948382
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-27 18:08:47 | 显示全部楼层    本楼为最佳答案   
jackz007 发表于 2019-7-27 16:34
楼主试试这个代码:

2的0次方 64位2进制表示就是 0000 ... 0001(0次方时这个1的位置是从右往左数第1个位置);
此时 sum = 0000 ... 0000 + 0000 ... 0001 = 0000 ... 0000;

2的1次方 64位2进制表示就是 0000 ... 0010(1次方时这个1的位置是从右往左数第2个位置);
此时 sum = 0000 ... 0001 + 0000 ... 0010 = 0000 ... 0011;


2的2次方 64位2进制表示就是 0000 ... 0100(2次方时这个1的位置是从右往左数第3个位置);
此时 sum = 0000 ... 0011 + 0000 ... 0100 = 0000 ... 0111;

.
.
.

2的63次方 64位2进制表示就是 1000 ... 0000(63次方时这个1的位置是从右往左数第64个位置);
此时 sum = 0111 ... 1111 + 1000 ... 0000 = 1111 ... 1111;

在long long int 中 1111 ... 1111 表示的值是 -1(这个去了解符数的2进制) ,  -1 / 25000 = 0(所以weight的值是0)

printf中 %llu是以unsigned long long的方式打印所以 sum 1111 ... 1111 在long long中是-1, 在unsigned long long中就变成了2的64次方, weight本身就是0 从long long转换成 unsigned long long 还是0

(希望能对你有帮助)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-27 18:09:51 | 显示全部楼层
Neverturnback 发表于 2019-7-27 18:08
2的0次方 64位2进制表示就是 0000 ... 0001(0次方时这个1的位置是从右往左数第1个位置);
此时 sum = 000 ...

第一个sum = 0000 ... 0000 + 0000 ... 0001 = 0000 ... 0001这边手误打错了 0-0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-27 18:12:38 | 显示全部楼层
Neverturnback 发表于 2019-7-27 18:09
第一个sum = 0000 ... 0000 + 0000 ... 0001 = 0000 ... 0001这边手误打错了 0-0

下面的"符数" = "负数"!!!我的手残程度max0 -0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-27 18:13:07 | 显示全部楼层
        long long int sum=0;
. . . . . .
        int i;
        for (i=0;i<64;i++)
        {
                temp=pow(2,i);
                sum = sum + temp;
        }
        这块代码折腾半天,其实就是为了得到一个 unsigned long long 所能表达的最大值 sum = 2 ^ 64 - 1 = 0xFFFFFFFFFFFFFFFF = 18446744073709551615,直接赋值就可以了。,

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
非黑莫白 + 5 + 5 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-7-27 18:14:46 | 显示全部楼层
你把printf里面的%llu换成%lld就能很容易的找到问题的所在了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-27 18:19:59 | 显示全部楼层
Neverturnback 发表于 2019-7-27 18:08
2的0次方 64位2进制表示就是 0000 ... 0001(0次方时这个1的位置是从右往左数第1个位置);
此时 sum = 000 ...

这里说错了 1111 ... 1111 是2的64次方 - 1 不是 2 的64次方qwq
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-4 01:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表