ページ 11

素因数分解

Posted: 2011年8月04日(木) 12:41
by しょしこ
素因数分解について質問があります。
C言語を今年の四月から始めた初心者なのですが、実は学校で課題が出て・・・もうお手上げ状態です。

コード:

 #include <stdio.h>
main()
{

int  n, d, q, i, k;
int  p[10], e[10];

/*
  ①
    整数2以上が入力されるまで入力を繰り返す。(n)
*/

/* 
  ②
    入力値を出力
*/

  d = 2;
  k = -1;

/*
  ③  
    n を素因数分解
    素因数を見つける度に出力する
    素数ならば、何も出力されない。

*/
/*
  ④
    k が-1 のままなら「prime number.」を出力
    それ以外の場合 「= X1 *  X2 * ・・・・・*  Xn」を出力

*/
} 

• 2 以上の整数が入力されるまで入力を繰り返す
• 入力値に関しては10 桁の幅で右寄せで出力
• 組み込み関数sqrt は使わないこと



このように指定されており、またコンパイルするとこのような結果になるようにしたいです。

コード:

 # ./a.exe 
Enter an integer (> 1) : 0 
Enter an integer (> 1) : -1 
Enter an integer (> 1) : 1 
Enter an integer (> 1) : 7
             7 = prime number.
# ./a.exe
Enter an integer (> 1) : 24 
           24 = 2 * 2 * 2 * 3
               = 2^3 *  3^1
# ./a.exe
Enter an integer (> 1) : 256 
          256 = 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2
                = 2^8
# ./a.exe
Enter an integer (> 1) : 1001 
        1001 = 7 * 11 * 13 
                = 2^8 * 11^1 * 13^1

見やすいように工夫したつもりですが見にくいようならすいません;;;
自分で、①と②はできたのですがそれ以外は、何度か試してはいるものの、上手く動作してくれないのです。
宜しくお願いします。

Re: 素因数分解

Posted: 2011年8月04日(木) 13:02
by non
>自分で、①と②はできたのですがそれ以外は、何度か試してはいるものの、上手く動作してくれないのです。
とりあえず、そのプログラムを載せましょう。

Re: 素因数分解

Posted: 2011年8月05日(金) 16:00
by しょしこ
出来ているのはここまでです。

コード:

 #include<stdio.h>
main ()
{

 int n,d,q,i,k;
 int p[10],e[10];

 do{
	printf("Enter an integer ( >1 ):");
	scanf("%d",&n);
}
 while (n<=1);
	printf ("  %8d = prime number ",n);

 

過程③のところで、つまずいてしまいました。

コード:

  
 d=2;
 k=-1;


 do{
	q=n/d;
	 if(q<d){
   	  if(d==2){
	     d=3;
  }
}

 else{
	d=d+2;
}

 if(k==-1){
 	k=k+1;
 	p[k]=d;
 	e[k]=1;
	n=q;
	printf(" %d *",d);

}

 else{
	e[k]=e[k]+1;
	n=q;
	printf(" %d *",d);
}

 if(d==2){
    d=3;    
}

 else{
	d=d+2;
}

}while();

}

}while();←の条件式がわからず、何度も無限ループに入ってしまいます。

Re: 素因数分解

Posted: 2011年8月05日(金) 17:20
by bitter_fox
しょしこ さんが書きました:出来ているのはここまでです。

コード:

 #include<stdio.h>
main ()
{

 int n,d,q,i,k;
 int p[10],e[10];

 do{
	printf("Enter an integer ( >1 ):");
	scanf("%d",&n);
}
 while (n<=1);
	printf ("  %8d = prime number ",n);

 
インデントが壊滅的ですね。
オートインデント機能の無いエディタでプログラムを組まれているのでしたらオートインデント機能のある他のエディタを使用することをお勧めします。

参考のためにインデントを付けておきます。

コード:


#include<stdio.h>

main()
{
	int n,d,q,i,k;
	int p[10],e[10];

	do{
		printf("Enter an integer ( >1 ):");
		scanf("%d",&n);
	}
	while (n<=1);
	printf ("  %8d = prime number ",n);

	d=2;
	k=-1;

	do{
		q=n/d;
		if(q<d){
			if(d==2){
				d=3;
			}
		}
		else{
			d=d+2;
		}

		if(k==-1){
			k=k+1;
			p[k]=d;
			e[k]=1;
			n=q;
			printf(" %d *",d);
		}
		else{
			e[k]=e[k]+1;
			n=q;
			printf(" %d *",d);
		}

		if(d==2){
			d=3;
		}
		else{
			d=d+2;
		}
	}while();
}
さて、実際の素因数分解は素数で分解するはずですが、このコードでは2と3以上の奇数で分解しようとしているように見えます。
まず、nまでの素数を求めることは出来ますか?

Re: 素因数分解

Posted: 2011年8月05日(金) 18:11
by non
各変数は使用目的が課題として与えられているのでしょうか?
int p[10],e[10];
pやeの配列は何に使うのか決められていますか?
また、
k=-1;
これも決められているのですね。

さて、素因数分解は素数で割った方が効率は良いので最終的には素数を先に求めて、配列に入れておき、それで割るようにした方が
良いとは思いますが、まずは、全体像をつかむために素因数はどうやったら求められるか考えてみましょう。

元の数をnとしましょう。
これを2から順番に割っていきます。(dで割ります)
割り切れた時には、nはその商にします。(割り切れたかどうかは if ( n % d == 0) のように余りをみます)
その時の除数をとりあえず出力しましょう。後で配列に格納することを考えます。
2で割り切れる間はずっと2で割ります。
2で割れなくなったら次は3にしましょう。
これをずっと繰り返します。
さて、いつまで続ければよいかというと、いずれ、nは絶対に1になります。
ですからwhile(n!=1)です。

ここまでをプログラムしてみてください。
[編集]
除数と被除数を間違えていましたので訂正しました。