# 1. 循环输入,每输入一个正整数 n (n≤65535),输出 1 + 2 + 3 + ... + n 的值,并且多输出一个空行。当没有任何输入时,结束程序
【错误的】
#include<stdio.h>
int main(){
int n;
while(scanf("d%", &n) != EOF){
printf("d%\n", n*(n+1)/2);
}
return 0;
}
- n 取最大值 65535 时,n * (n + 1) = 65535 * 65536 = (2^16 - 1) * 2^16 = 2^32 - 2^16,而 int 能够表示的最大值为 2^31 - 1,所以产生了溢出。就变成了负数。
【正确的-循环枚举】
while(scanf("d%", &n) != EOF){
int sum = 0;
while(n){
sum += n;
n--;
}
printf("d%\n", sum)
}
【正确的-奇偶性判断】
while(scanf("d%", &n) != EOF){
if(n % 2 == 0){
printf("d%\n", n/2*(n+1))
} else {
printf("d%\n", (n+1)/2*n)
}
}
【正确的-无符号整型】
while(scanf("d%", &n) != EOF){
unsigned int sum = n * (n+1) / 2;
printf("d%\n", sum);
}
【正确的-64位整型】
while(scanf("d%", &n) != EOF){
long long sum = n * (n+1) / 2;
printf("d%\n", sum);
}
- long long是C语言中的64位整型,范围比int大了一个平方量级,在[−2^63, 2^63 − 1]
← TwoPoints-反转字符串 四则运算 →