C语言 毕达哥拉斯三胞胎到一个设定的限制

k7fdbhmy  于 2023-05-22  发布在  其他
关注(0)|答案(2)|浏览(129)

我有一个练习,其中所有的毕达哥拉斯三元组都应该被打印(a,b,c),直到c的最大值。c可以被定义,并且如果不是,则将其设置为100。用户的无效参数应打印并返回1;
下面是我的代码:

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
    if (argc>=3) {
        fprintf(stderr, "Superfluous argument was given! Only zero or one are allowed.\n");
        return 1;
    }
    char *end;
    long ende = strtol(argv[1], &end, 10);
  if (*end != '\0'){
      fprintf(stderr, "Given argument '%s' is no valid natural number!\n",argv[1]);
      return 1;
  }
   if (argc == 1) {ende = 100;}
int a,b,c;
     for(a=1;a<=ende;a++){
        for(b=a;b<=ende;b++){
            for(c=b;c<=ende;c++){
                if((c*c==a*a+b*b)&&(c<=ende)){
                    printf("%d %d %d\n",a,b,c);
                }
            }
        }
     }
 
 
return 0;
    
}

我似乎找不到我的错误,当输入没有值时,它不会打印任何东西。
我试图改变我的循环,但没有成功。

q5iwbnjs

q5iwbnjs1#

我似乎找不到我的错误,当输入没有值时,它不会打印任何东西。
在确定argv[1]指向字符串后使用strtol()。同样,当argc == 1时,代码尝试strtol(NULL, &end, 10);,这是 undefined behavior(UB)。
另外,给予ende一个默认值。

//   char *end;
//    long ende = strtol(argv[1], &end, 10);
//  if (*end != '\0'){
//      fprintf(stderr, "Given argument '%s' is no valid natural number!\n",argv[1]);
//      return 1;
//  }
//   if (argc == 1) {ende = 100;}
long ende = 100;
 if (argc > 1) {
   char *end;
   ende = strtol(argv[1], &end, 10);
   if (*end != '\0'){
     fprintf(stderr, "Given argument '%s' is no valid natural number!\n", argv[1]);
     return 1;
   }
 }

使用自动格式化程序。
循环改进。使用long(与ende相同)并考虑溢出。

for (long a = 1; a <= ende; a++) {
       long long aa = (long long)a * a;  
       for (long b = a; b <= ende; b++) {
         long long sum = aa + (long long)b * b;  
         for (long c = b; c <= ende; c++) {
           if (sum == (long long)c * c) {
             printf("%ld %ld %ld\n", a, b, c);
           }
         }
       }
     }

其他可能的改进。

8hhllhi2

8hhllhi22#

这不是一个完整的答案,但只是为了建立在chux的答案上,这里是一个不使用乘法的循环版本:

long long aa = 0;
  for (long a = 1; a <= ende - 2; a++) {
    aa += a + a - 1;
    long long bb = aa;
    for (long b = a + 1; b <= ende - 1; b++) {
      bb += b + b - 1;
      long long sum = aa + bb;
      long long cc = bb;
      for (long c = b + 1; c <= ende; c++) {
        cc += c + c - 1;
        if (sum == cc) {
          printf("%ld %ld %ld\n", a, b, c);
        }
      }
    }
  }

它通过对连续的奇数求和来计算平方。

相关问题