1

タイトルが説明しているように、これは 1 から 20 までの数の lcm を見つけるためのプログラムです。これを行うアルゴリズムを見つけました
ウェブページには、アルゴリズムをよりよく説明する Java アプレットがあります。

問題: コード コンパイラはエラーを表示しないと書きましたが、コードを実行するとプログラムが暴走します。無限ループの可能性があると思いますが、私の人生では理解できません。私はターボC ++ 4.5を使用しているので、基本的に誰かがコードを見て助けてくれれば、それは素晴らしいことです. 前もって感謝します

アルゴリズム:

2,6,8 の lcm を見つける必要があるとします。

最初に、シリーズの最小のものを見つけ、それに上の数を追加します。つまり、シリーズは次のようになります。

4,6,8

ここで、最小値を再度見つけて、列の初期値、つまり 2 を追加します。

6,6,8

したがって、次の反復は

8,6,8

8,12,8

10,12,8

10,12,16

12,12,16

14,12,16

14,18,16

16,18,16

18,18,16

18,18,24

20,18,24

20,24,24

22,24,24

24,24,24

ご覧のとおり、ある時点ですべての数値が等しくなり、これが lcm です

#include<iostream.h>
/*function to check if all the elements of an array are equal*/
int equl(int a[20], int n)
{
int i=0;

  while(n==1&&i<20)
 {
  if (a[i]==a[i+1])
        n=1;
  else
        n=0;
        i++;
  }
 return n;
}
/*function to calculate lcm and return that value to main function*/


int lcm()
{
int i,k,j,check=1,a[20],b[20];
/*loading both arrays with numbers from 1 to 20*/
for(i=0;i<20;i++)
{
    a[i]=i+1;
    b[i]=i+1;
}
check= equl(a,1);

/*actual implementation of the algorith*/
while(check==0)
 {
    k=a[0];                  /*looks for the least value in the array*/
    for(i=0;i<20;i++)
    {
        if(a[i+1]<k)
            {
                k=a[i+1];       /*find the least value*/

                j=i+1;          /*mark the position in array */

            }
        else
            continue;
    }
    a[j]=k+b[j];            /*adding the least value with its corresponding number*/

    check= equl(a,1);
 }

 return (a[0]); 

/*at this point all numbers in the array must be same thus any value gives us the lcm*/
}

void main()
{
 int l;
 l=lcm();
 cout<<l;
}
4

2 に答える 2

1

この行で:

a[j]=k+b[j];

使用しますjが、ユニタライズされているため、非常に大きな値であり、配列の境界外にあるため、セグメンテーション違反が発生します。

また、コードで奇妙なことが起こっています。void main()そして、あなたはcout何も言わずに、または同様のことをせずstd::coutusing namespace std;使用します。奇妙な習慣。

また、関数を作成する場合は、配列を引数として渡す必要があると思いませんlcm()か?それはint lcm(int a[], int b[]);です。

デバッガーの使用とコーディング慣行の改善も検討するかもしれません。デバッガーを使用してコードをコンパイラーに貼り付けてから30秒以内にこのエラーが見つかりました。

ループ条件は次のとおりです。

while(n==1&&i<20)

したがって、equlnが1の場合、ループは続行され、1を返すことはないため、関数が1を返すことはありません。ただし、プログラムは正しい結果を返すようには見えません。最小の要素を見つけるコードの一部を分割し、それをこれに置き換えてクリーンにすることができます。

int least(int a[], int size){
    int minPos = 0;

    for(int i=0; i<size ;i++){

        if (a[i] < a[minPos] ){
            minPos = i;
        }
    }

    return minPos;
}

次に、と言うことでそれを呼び出すことができますj = least(a, 20);。私はあなたのプログラムのさらなる仕事をあなたに任せます。変数を。の代わりに意味のあるものと呼ぶことを検討してくださいi,j,k,a,b

于 2012-05-18T05:23:56.227 に答える
0

equl関数は 0 ~ 20 の配列インデックスを使用していますが、配列には 1 ~ 19 しかありません

jlcm()最初の要素が最小の場合、inは初期化されません。while ループの先頭で 0 に設定する必要があります。

次のコードでは、i=19 の場合a[20]、配列の範囲外にある にアクセスしています。する必要がありますfor(i=0;i<19;i++)

for(i=0;i<20;i++) {
    if(a[i+1]<k)

stdの名前空間を実際に使用していませんcout。これはあるべきですstd::cout<<l

あなたが含まれてiostream.hいます。標準にはiostream.h がありません。これは、そのような古いコンパイラでは機能しない可能性があります。

どこでも 20 をハードコーディングする代わりに、#define. これはエラーではなく、スタイルの問題です。

次のコードは何もしません。これはデフォルトの動作です

else
    continue;
于 2012-05-18T05:40:17.427 に答える