ページ 11

C言語の因数分解

Posted: 2008年12月09日(火) 09:47
by ioio
C言語の問題でわからないものがあるので、お願いいたします。

問題
入力された正の整数を因数分解して表示するプログラムを作成し、実行結果を張り付けよ。
9桁以下のせいの指数ならばなんでも因数に分解できるようにせよ。

【実行例】実行時にキーボードから入力したのは051547というかずだけである。
---------------------------------------------------------------
因数に分解します。
2桁以上の整数を入力してください。(9桁以下にしてください):071504
71504= 2^4
*= 41^1
*= 109^1
--------------------------------------------------------------
このような実行例がのっています。
この入力する数字を「051547」へ変換してプログラムを組みたいと思うのですが、どなたか教えていただけませんでしょうか?

Re:C言語の因数分解

Posted: 2008年12月09日(火) 09:59
by non
素因数分解の方法にはいろんな方法があります。
ioioさんは、どんな方法で素因数分解をしますか?
プログラムでなく、筆算ではどうするかを示してください。

Re:C言語の因数分解

Posted: 2008年12月09日(火) 10:05
by ioio
いろいろ調べたところ、
素因数分解するのであれば、
割った余りがゼロかどうかを判別すればよいかと思います。

Re:C言語の因数分解

Posted: 2008年12月09日(火) 10:31
by non
それでは、最初に下で示すところまで作って、ソースを添付してください。

①標準入力から整数を入力する(nとしましょう)
②nを2で割り、割り切れるなら、商を新たなnにする。
③nを出力する。

ここまで作れますか?

Re:C言語の因数分解

Posted: 2008年12月09日(火) 13:02
by 組木紙織
過去ログに素因数分解するコードをあげた記憶があるので調べてみたらどうでしょうか。

#mixiにマルチポストされているようです。

Re:C言語の因数分解

Posted: 2008年12月09日(火) 15:30
by non
現在、クラスの作り方について勉強中です。
練習問題に使わせてもらいました。
先輩諸氏のクラスの作り方についてアドバイスがありましたら、お願いします。
例えば、一般的にはこんなクラスのメンバーがいいよとか・・・
なお、必要もないのにvectorも使ってみました。
#include <vector>
#include <iostream>
using namespace std;

class Num{
	int fact;
	int pow;
public:
	Num(int);
	void inc(void);
	void disp(void);
};
Num::Num(int f)
{
	fact=f;
	pow=0;
}
void Num::inc(void)
{
	++pow;
}
void Num::disp(void)
{
	cout << '=' << fact << '^' << pow <<endl;
}
int main(void)
{
	vector<Num> factor;
	int n,n0;
	unsigned int i,j;
	cout << "整数(9桁以内)=" ;
	cin >> n0 ;
	n=n0;
	i=2;j=0;
	while(n!=1){
		if(!(n % i)){
			Num f(i);
			do{
				f.inc();
				n=n/i;
			}while(!(n % i));
			factor.push_back(f);
			j=0;
		}
		else
			i++;
	}
	for(i=0;i<factor.size();++i){
		i==0?(cout << n0):(cout << '*');
		factor.disp();
	}
	return 0;
}

Re:C言語の因数分解

Posted: 2008年12月09日(火) 22:33
by 組木紙織
C++として気をつけることは
コンストラクタで初期化リストを使うこと
出力でfor_each()アルゴリズムを使うこと(こっちは必ずといったわけでもないですが)
ぐらいだと思います。

今回は気にしなくても問題はないですが、
Numクラスをコピー可能にする/しない
のどちらかにするかはあらかじめきちんと考えておいたほうがいいです。

状況によってはコピーコンストラクタを書く必要があったり
コピー不可にする必要がありますので。

あとはイテレーターが使えたらもっとC++らしいです。

Re:C言語の因数分解

Posted: 2008年12月10日(水) 12:09
by non
組木紙織様

ご指導ありがとうございます。

>コンストラクタで初期化リストを使うこと
>出力でfor_each()アルゴリズムを使うこと

この2点を考慮して、作り直しました。
#include <vector>
#include <iostream>
using namespace std;

class Num{
	int fact;
	int pow;
public:
	Num(int f):pow(0),fact(f){}
	void inc(void);
	void disp(void);
};
void Num::inc(void)
{
	++pow;
}
void Num::disp(void)
{
	cout << '=' << fact << '^' << pow <<endl;
}
int main(void)
{
	vector<Num> factor;
	int n,n0;
	unsigned int i;
	cout << "整数(9桁以内)=" ;
	cin >> n0 ;
	n=n0;
	i=2;
	while(n!=1){
		if(!(n % i)){
			Num f(i);
			do{
				f.inc();
				n=n/i;
			}while(!(n % i));
			factor.push_back(f);
		}
		else
			i++;
	}

	i=0;
	for each(Num f in factor){
		i++==0?(cout << n0):(cout << '*');
		f.disp();
	}
	
	return 0;
}
for each はBC++5.0では使えませんでしたのでVC++2008で行いました。
コピーコントラクタとイテレータはもう少し勉強してから考えてみます。