#include<stdio.h> int main() { long long i=2; long long n=1; while(n<=63) { printf("%lld\n",i); i=(i*2); n++; } return 0; }为啥我这个代码输出二的63次方的时候带个负号
时间: 2024-01-28 16:03:15 浏览: 9
这是因为你使用的是 long long 类型,而 long long 类型的范围是 -2^63 到 2^63-1,当 i 的值达到 2^63 时,超出了 long long 类型的正数范围,因此会出现负数。如果想要避免这种情况,可以使用 unsigned long long 类型,它的范围是 0 到 2^64-1,可以表示更大的正整数。
相关问题
#include<stdio.h> int main (){ long long n; int sum=0; scanf("%ld",&n); while(n>0){ int j; j=n%10; sum=sum+j; n=n/10; } printf("%ld",sum); return 0; }
这段代码有一些问题,我帮你改正一下:
1. 在第2行中,变量n的类型应该是long long而不是long。
2. 在第8行中,变量j应该先被定义为int类型。
3. 在第12行中,printf函数中的格式化字符串应该使用%lld而不是%ld。
以下是修改后的代码:
```
#include <stdio.h>
int main() {
long long n;
int sum = 0;
scanf("%lld", &n);
while (n > 0) {
int j = n % 10;
sum = sum + j;
n = n / 10;
}
printf("%d", sum);
return 0;
}
```
修改后的代码已经可以正确运行并输出结果了。
优化#include<stdio.h> #include<math.h> int main() { long long n; long long m; while(scanf("%lld %d",&n,&m)!=EOF) { int a,i=0; int k=0; while(pow(m,i)-1<n) { i++; k++; } long long j; j=(n-pow(m,k-1))*m+1; printf("%lld \n",j); } }使其耗时变短
可以尝试以下优化:
1. 将 `pow(m, k-1)` 提取出来,避免重复计算。
2. 将 `while` 循环改为 `for` 循环,避免重复计算。
3. 使用数组存储 `pow(m, i)` 的值,避免重复计算。
优化后的代码如下:
```c
#include <stdio.h>
#include <math.h>
#define MAX_N 1000000
int main() {
long long n, m;
long long pow_m[MAX_N];
int i, k;
while (scanf("%lld %lld", &n, &m) != EOF) {
i = 0;
k = 0;
pow_m[0] = 1;
while (pow_m[k] - 1 < n) {
i++;
k++;
pow_m[k] = pow_m[k-1] * m;
}
long long j = (n - pow_m[k-1] + 1) * m + 1;
printf("%lld\n", j);
}
return 0;
}
```
这样可以避免重复计算,提高代码效率。