我有一个练习,其中所有的毕达哥拉斯三元组都应该被打印(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;
}
我似乎找不到我的错误,当输入没有值时,它不会打印任何东西。
我试图改变我的循环,但没有成功。
2条答案
按热度按时间q5iwbnjs1#
我似乎找不到我的错误,当输入没有值时,它不会打印任何东西。
在确定
argv[1]
指向字符串后使用strtol()
。同样,当argc == 1
时,代码尝试strtol(NULL, &end, 10);
,这是 undefined behavior(UB)。另外,给予
ende
一个默认值。使用自动格式化程序。
循环改进。使用
long
(与ende
相同)并考虑溢出。其他可能的改进。
8hhllhi22#
这不是一个完整的答案,但只是为了建立在chux的答案上,这里是一个不使用乘法的循环版本:
它通过对连续的奇数求和来计算平方。