我手上有个问题,我想不通,因为我对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来加快算法的速度。在这种情况下,一旦你找到一个ij的值,当平方时,给你n,就断开两个循环。你可以这样做,因为对于那个n我们知道存在满足条件的ij对。
你关心解方程的n和精确的i/j变量,在这种情况下,去掉soln变量,只打印解决方案,而不是将soln设置为1。

10-06 15:53