回 帖 发 新 帖 刷新版面

主题:[讨论]此程序哪里出错了,求指教!

#include<stdio.h>
#define MAX 200
void main()
{
    int i,j,k=0,n=0;

    for(i=1; i<=MAX; i++)
        for(j=1; j<i; j++)
    {   
            if(k>=j) break;
            for(k=i; k>=j; k--)
            {
                if(i*i == j*j + k*k)
                {
                    printf("%4d",i);
                    n++;
            break;
                }
            }
    }
    if(n)
        printf("%d",n);
    else
        printf("N\n");
}
输出200以内的所有完全平方数C ( c的平方 = a的平方 + b的平方)及个数?
问题:是不是break用错了??

回复列表 (共6个回复)

沙发

单说这两句似乎就有冲突了:
if(k>=j) break;
for(k=i; k>=j; k--)
{
}
如果 k>=j 那么就退出外层循环了,那么你下面的这个以 k>=j 为条件的循环就永远不可能执行到了,你先把这个问题解决了吧,然后再看看有没有更高效的循环方法。

板凳

“如果 k>=j 那么就退出外层循环了,那么你下面的这个以 k>=j 为条件的循环就永远不可能执行到了”  但在两个k>=j之间k是重新赋值的啊,不是吗?怎么会有矛盾呢?

3 楼

去掉if(k>=j) break;
这句话就可以了;
其实二楼的兄弟说的没错,你仔细看一下程序
for(i=1; i<=MAX; i++)               
        for(j=1; j<i; j++)

{   
            if(k>=j) break;
            for(k=i; k>=j; k--)       /*这个循环执行完K的值=j-1;再就跑到if(k>=j),无论怎样后面的语句都执行不到了  */          
           {
                if(i*i == j*j + k*k)
                {
                    printf("%4d",i);
                    n++;
            break;
                }
            }
    }

4 楼

说说为什么加 if(k>=j) break;?

5 楼


不加的话输出的完全平方数是有重复的,不是吗?

6 楼

那就给i加个标记
#include<stdio.h>
#define MAX 200
void main()
{
    int i,j,k=0,n=0;

    int flag=1;
    for(i=1; i<=MAX; i++)
    {
        for(j=1; j<i; j++)
        {   
            //  if(k>=j) break;
            for(k=i; k>=j; k--)
            {
                if((i*i == j*j + k*k) && flag)
                {
                    printf("%4d\n",i);
                    n++;
                    flag=0;
                    break;
                }
            }
        }
        flag=1;
    }
        if(n)
            printf("%d",n);
        else
            printf("N\n");
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册