C言語の因数分解

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ioio

C言語の因数分解

#1

投稿記事 by ioio » 16年前

C言語の問題でわからないものがあるので、お願いいたします。

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

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

non

Re:C言語の因数分解

#2

投稿記事 by non » 16年前

素因数分解の方法にはいろんな方法があります。
ioioさんは、どんな方法で素因数分解をしますか?
プログラムでなく、筆算ではどうするかを示してください。

ioio

Re:C言語の因数分解

#3

投稿記事 by ioio » 16年前

いろいろ調べたところ、
素因数分解するのであれば、
割った余りがゼロかどうかを判別すればよいかと思います。

non

Re:C言語の因数分解

#4

投稿記事 by non » 16年前

それでは、最初に下で示すところまで作って、ソースを添付してください。

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

ここまで作れますか?

組木紙織

Re:C言語の因数分解

#5

投稿記事 by 組木紙織 » 16年前

過去ログに素因数分解するコードをあげた記憶があるので調べてみたらどうでしょうか。

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

non

Re:C言語の因数分解

#6

投稿記事 by non » 16年前

現在、クラスの作り方について勉強中です。
練習問題に使わせてもらいました。
先輩諸氏のクラスの作り方についてアドバイスがありましたら、お願いします。
例えば、一般的にはこんなクラスのメンバーがいいよとか・・・
なお、必要もないのに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言語の因数分解

#7

投稿記事 by 組木紙織 » 16年前

C++として気をつけることは
コンストラクタで初期化リストを使うこと
出力でfor_each()アルゴリズムを使うこと(こっちは必ずといったわけでもないですが)
ぐらいだと思います。

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

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

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

non

Re:C言語の因数分解

#8

投稿記事 by non » 16年前

組木紙織様

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

>コンストラクタで初期化リストを使うこと
>出力で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で行いました。
コピーコントラクタとイテレータはもう少し勉強してから考えてみます。

閉鎖

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