程序仅适用于少量数字

时间:2018-10-05 03:56:39

标签: c

这是示例问题:

Lili是社交媒体平台GI上的名人。她在3周内已经拥有100万关注者。 Bibi也想 有很多追随者,然后比比问莉莉。比比从莉莉那里得到建议后,她的追随者每天都翻一番。 现在,Bibi想知道,如果Bibi今天有N个关注者,那么从现在起K天之后她将拥有多少关注者。

约束: 1 <= N <= 128; 1 <= K <= 30;

到目前为止,这是我的代码:

#include<stdio.h>

int main(){
    int n,k,temp;
    scanf("%d %d",&n,&k);

    for(temp = 1; temp <= k; temp++){
        n = n * 2;
    }

    printf("%d\n",n);

    return(0);
}

问题是此代码仅适用于较小的数字。当我尝试输入N为2和K为30时,结果最终为负。尝试使用N和K的更大组合,我得到0。我确实用较小的数字(例如7和3)获得了预期的结果,所以我认为这是可变大小的问题,但是使用unsigned long也不起作用。 N = 2,K = 30仍为-2147483648。

我如何满足给定的限制?

2 个答案:

答案 0 :(得分:0)

这是由于integer overflow

  

在计算机编程中,当算术运算发生整数溢出   该操作尝试创建一个超出   可以用给定数字位数表示的范围–   大于最大代表值或小于最小代表值。

换句话说,您使用的数据类型不能存储大于特定值的数字。选择另一种类型来存储较大的数字(例如,用unsigned long long代替int)。还有一些库提供的类型可以存储任意数量的类型,通常以处理速度为代价。

您应使用某种无符号整数的另一个原因是,答案将永远不会是负数。这样就释放了表示数字符号的位,并使可以存储的值的正范围加倍。

答案 1 :(得分:0)

您选择的输入data-type在很大程度上取决于范围。 所选的data-type却有一个limit(在很大程度上取决于处理器和东西,但是此链接现在应该这样做),超过限制将最终导致溢出。

在您的情况下,范围为1 <= n <= 1281 <= k <= 30,而对于最高可能输入for-loopn = 28的{​​{1}}得出

k = 38

从上方得到的n = 128*(2 pow 0) + 128*(2 pow 1) + 128*(2 pow 2) + 128*(2 pow 3) + .. + 128*(2 pow 29) 的结果值比n所能容纳的最大值int高出很多,结果您遇到了integer overflow