思路基本对,问题出在输出的分号,最后一次输出是不输出分号的;
解决思路:设置0 1,每次重新循环时候就归0,达到要求+1;两者互不影响,后者可以放在最后的循环里
解题思路:暴力解题,三个for循环,在最里面一层输出和判定;
缺点:不够优化,做了很多无用的计算
for(直角边i = 下限;i <= 上线;i++)
{
for(直角边j = a;j <= b;j++) 很明显当i是不会大于j的,三条边必有一个最小,一个最大;
{ 所以可以提高第二大的数j的起点-----------> j = i+1;为起点;
for(斜边c= a ;c<=b;c++) 同理,斜边也是c = j+1;
{
其实,斜边还可以再优化,因为有勾股定理,所以int
c =
sqrt
(i*i+j*j);
在最后判别c是否还在区间内即可;
#include <stdio.h> #include <math.h> int main() { int tp = 1; int a,b; while(scanf("%d%d",&a,&b)!= EOF) { printf("case %d:",tp); int i,j,gs = 0; for(i = a;i <= b;i++) for(j = i+1;j <= b;j++) { int c = sqrt(i*i+j*j); if(c <= b) { if(c*c == i*i+j*j) { if(gs != 0) printf(";"); //先输出分号在输出数据,也就是说;+数据这样的顺序才是一组 printf("%d,%d,%d",i,j,c); //那么最后一次不输出分号就是因为数据已经输完了, gs++; } } } if(gs == 0) //如果存在勾股数,gs必定大于0,反之则没有 printf("No pythagorean triple"); printf("\n"); tp++; } }
//最后一组数据12,16,20和前面的;才是一组,至于第一组数据是分好判别失败所以没输