我手上有个问题,我想不通,因为我对C编程还很陌生问题是找出所有100到999之间的整数,它们可以用(a^2+b^2)的形式表示。
我试过的是:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n,i,j,soln;
for (n=100;n<1000;++n) {
soln=0;
for (i=0;i<100;++i) {
for (j=i;j<100;++j) {
if ((i^2 + j^2)==n) {
soln=1;
} else {
soln=0;
}
}
}
if (soln==1) printf("%d is a solution.\n",n);
}
return EXIT_SUCCESS;
}
谢谢你们!
最佳答案
代码有两个问题:
1。使用*
来平方一个数,而不是a^
要在C中平方一个数字,不要使用^
运算符(这是按位异或运算符)。改用*
运算符:
if ((i*i + j*j)==n) {
soln=1;
} else {
soln=0;
}
2。在内部循环中移动
if
条件代码的另一个问题是覆盖
soln
值。您应该将条件移动到内部循环中:for (n=100;n<1000;++n) {
soln=0;
for (i=0;i<100;++i) {
for (j=i;j<100;++j) {
if ((i*i + j*j)==n) {
soln=1;
} else {
soln=0;
}
// Condition here. When it was in the outer loop level,
// the soln=1 would be overwritten to the 0 in the next iteration
// and printf() wouldn't be called.
if (soln==1) {
printf("%d is a solution.\n",n);
// To avoid printing multiple times for the same n,
// break from the loop (loop for 'j').
// If you would want to print for every i,j pair that meets
// the criteria, remove this 'if' block, get rid of 'soln'
// and print in the if above (where you square the numbers).
break;
}
}
// We need to break the two loops, for i and j. This one is for
// the outer loop ('i').
if (soln == 1) break;
}
}
如您所见,您可以在两个稍有不同的变体中实现这一点:
你只关心
n
-如果你不需要知道一个解的组成部分是什么,你可以通过不打印每一个可能的解,只打印满足它的n
来加快算法的速度。在这种情况下,一旦你找到一个i
和j
的值,当平方时,给你n
,就断开两个循环。你可以这样做,因为对于那个n
我们知道存在满足条件的i
/j
对。你关心解方程的
n
和精确的i
/j
变量,在这种情况下,去掉soln
变量,只打印解决方案,而不是将soln
设置为1。