思路基本对,问题出在输出的分号,最后一次输出是不输出分号的;

解决思路:设置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和前面的;才是一组,至于第一组数据是分好判别失败所以没输