这是示例问题:
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。
我如何满足给定的限制?
答案 0 :(得分:0)
这是由于integer overflow:
在计算机编程中,当算术运算发生整数溢出 该操作尝试创建一个超出 可以用给定数字位数表示的范围– 大于最大代表值或小于最小代表值。
换句话说,您使用的数据类型不能存储大于特定值的数字。选择另一种类型来存储较大的数字(例如,用unsigned long long
代替int
)。还有一些库提供的类型可以存储任意数量的类型,通常以处理速度为代价。
您应使用某种无符号整数的另一个原因是,答案将永远不会是负数。这样就释放了表示数字符号的位,并使可以存储的值的正范围加倍。
答案 1 :(得分:0)
您选择的输入data-type
在很大程度上取决于范围。
所选的data-type
却有一个limit(在很大程度上取决于处理器和东西,但是此链接现在应该这样做),超过限制将最终导致溢出。
在您的情况下,范围为1 <= n <= 128
和1 <= k <= 30
,而对于最高可能输入for-loop
和n = 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。