任意のサイズの配列を入力してその配列の中身の最小公倍数を求めるプログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
po_po
記事: 38
登録日時: 8年前

任意のサイズの配列を入力してその配列の中身の最小公倍数を求めるプログラム

#1

投稿記事 by po_po » 8年前

キーボードから入力された整数をaをサイズとする中身がすべて自然数の配列を入力して、その最小公倍数を求めるプログラムを作ったのですが、配列のサイズが3つ以上だと結果がおかしなことになってしまいます。
ユークリッドの互除法を使って配列の先頭の2つの自然数の最小公倍数を求めて、次に3つ目の配列の要素と前に求めた最小公倍数との最小公倍数を求めて・・・と繰り返して全体の最小公倍数を求めようというプログラムです。
プログラムのどこが間違っているのか教えてください。

コード:

#include<stdio.h>
#include<stdlib.h>

int euclid(int a, int b){
  int r;
  int temp;
  if(b > a){
    temp = b;
    b = a;
    a = temp;
  }
  
  while(r!= 0){
    r = a % b;
    a = b;
    b = r;
  }
  
  return a;
}


int divisor(int s[], int x){

  int i;
  int r;
  for(i = 0; i <= x-2; i++){
   r =  euclid(s[i], s[i+1]);
   s[i+1] = r;
  }
  return r;
}

int main(){
  printf("配列のサイズを入力してください");
  int a;
  scanf("%d",&a);

  int *x;
  if(( x=( int* )malloc( sizeof( int ) ))== NULL){
    fprintf(stderr, "memory allocation fault.\n");
    exit(1);
  }

  int i;
  for(i = 0; i <= a-1; i++){
    printf("%dめの整数を入力してください", i+1);
    scanf("%d",&x[i]);
  }

  printf("入力された配列は{");
    int k;
  for(k = 0; k <= a-2; k++){
    printf("%d,",x[k]);
  }

  printf("%d}です。\n",x[a-1]);
  int r;
  printf("%d",divisor(x,a));
free(x);

}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 任意のサイズの配列を入力してその配列の中身の最小公倍数を求めるプログラム

#2

投稿記事 by みけCAT » 8年前

po_po さんが書きました:キーボードから入力された整数をaをサイズとする中身がすべて自然数の配列を入力して、その最小公倍数を求めるプログラムを作ったのですが、配列のサイズが3つ以上だと結果がおかしなことになってしまいます。
配列のサイズが2つ以下でも結果がおかしなことになりますね。
po_po さんが書きました:プログラムのどこが間違っているのか教えてください。
  • euclid関数について、
    • rが初期化されていないので、ループに入らないことがあります。
    • rを適切に初期化しても、これは最小公倍数ではなく最大公約数を求める関数です。
  • 配列のサイズが1のとき、divisor関数から未初期化のrの値が返ってしまいます。
例えば、以下のようにするといいでしょう。

コード:

int euclid(int a, int b){
  int aa = a, bb = b; /* 元の値を保存する */
  int r = 1; /* 適当な0でない値に初期化する */
  int temp;
  if(b > a){
    temp = b;
    b = a;
    a = temp;
  }
  
  while(r!= 0){
    r = a % b;
    a = b;
    b = r;
  }
  
  return aa / a * bb; /* 最小公倍数を計算して返す */
}

int divisor(int s[], int x){

  int i;
  int r;
  if (x <= 0) return -1; /* サイズが0以下の配列は考えられない */
  if (x == 1) return s[0]; /* サイズが1の配列に対しては、その最初の要素の値をそのまま返す */
  for(i = 0; i <= x-2; i++){
   r =  euclid(s[i], s[i+1]);
   s[i+1] = r;
  }
  return r;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

po_po
記事: 38
登録日時: 8年前

Re: 任意のサイズの配列を入力してその配列の中身の最小公倍数を求めるプログラム

#3

投稿記事 by po_po » 8年前

みけCATさん

ありがとうございます、解決しました。
rの初期化を忘れていました。
あと最小公倍数というのはこちらの書き間違いですすいません。


閉鎖

“C言語何でも質問掲示板” へ戻る