当我运行以下代码时
/*Program to find the greatest common divisor of two nonnegative integer
values*/
#include <stdio.h>
int main(void){
printf(" n | n^2\n");
printf("-----------------\n");
for(int n = 1; n<11; n++){
int nSquared = n^2;
printf("%i %i\n",n,nSquared);
}
}
返回终端的表显示如下
n | n^2
-----------------
1 3
2 0
3 1
4 6
5 7
6 4
7 5
8 10
9 11
10 8
为什么“n ^ 2”侧产生错误的数字?有没有办法在C中编写上标和下标,所以我不必显示“n ^ 2”并且可以将列的那一侧显示为“n²”而不是?
答案 0 :(得分:6)
使用pow
中的math.h
功能。
^
是按位异或运算符,与幂函数无关。
答案 1 :(得分:2)
^是XOR操作。您要么使用math.h函数“pow”,要么自己编写。
答案 2 :(得分:0)
^
是按位xor运算符。您应该使用pow
标头中声明的math.h
函数。
#include <stdio.h>
#include <math.h>
int main(void) {
printf(" n | n^2\n");
printf("-----------------\n");
for(int n = 1; n < 11; n++){
int nSquared = pow(n, 2); // calculate n raised to 2
printf("%i %i\n", n, nSquared);
}
return 0;
}
通过标志-lm
包含数学库以进行gcc编译。
答案 3 :(得分:0)
正如其他人所指出的,问题是^
是按位xor运算符。 C没有取幂运算符。
建议您使用pow()
函数计算int
值的平方。
这可能有用(如果你小心),但这不是最好的方法。 pow
函数接受两个double
个参数并返回double
个结果。 (有powf
和powl
函数分别在float
和long double
上运行。)这意味着pow
必须能够处理任意浮动 - 点指数;例如,pow(2.0, 1.0/3.0)
将为您提供两个立方根的近似值。
与许多浮点运算一样,pow
可能会出现舍入错误的可能性。 pow(3.0, 2.0)
可能产生的结果略低于9.0
;将其转换为int
将为您提供8
而不是9
。即使你设法避免这个问题,从整数转换到浮点,执行昂贵的操作,然后转换回整数是大量的矫枉过正。 (实现可能使用整数指数优化对pow
的调用,但我不会指望它。)
有人说(略带夸张)过早优化是所有邪恶的根源,而进行额外计算所花费的时间不太可能引人注目。但在这种情况下,有一种方法可以做你想要的更简单,更有效的方法。而不是
int nSquared = n ^ 2;
不正确,或
int nSquared = pow(n, 2);
这是低效的,可能不可靠,只需写:
int nSquared = n * n;