あなたが探している情報は、この日記には記されていない可能性が高いです。(検索で来た人用)
にらどんは一杯500円。尚、出前は承っておりません。ご了承下さい。

Arrayクラスで作った配列にアクセスするにはArrayのメンバ関数を使わなきゃいけないらしいな。
そのせいでいろいろ出来なかったんだろう。
詳しくは忘れた。


仕事中もPrimeListのことが頭から離れない。
このはまり方はちょっとヤバイかもしれない。


before → if (value % division) return false;
after → if ((value % division) == 0) return false;
ここいじったら正常に動くようになった。
構文としておかしかったということですか?
だったら言ってくれよ。
ってコメントアウトしてた本来の文を戻したらエラーするし('A`)


ifの条件文に関数とか計算式とかを置くだけじゃダメなんだね。ちゃんと比較演算子使わないとうまくいかない。
ちょっと不便。


if (PowCount == 1) {
PrimeResult[ResCount] = PrimeList[count];
ResCount++;
}

// 現在の指数を格納する
CountIndex[ResCount] = PowCount;

同じ要素番号に格納したいのにResCount++;が間に挟まってるからズレが出来てる。
だからC版ではResCount++;を一つ上に置いてたんだ。
これもそういう風にするしかないな。


できた。

#include 
using namespace std;

class Prime {
private:
	int *PrimeList, *PrimeResult, *CountIndex;
	int ResCount, num ;
public:
	bool PrimeChecker(int);
	void PrimeGetter(int);
	void PrimeCalclator(int);
	void PrimeShow(int);
};

//
// 素数判定をし、bool型で真偽を返す
//
bool Prime::PrimeChecker(int value) {
	
	int division = 2;
	
	// 1と2の例外処理
	if (value == 1) return false;
	if (value == 2) return true;
	
	// 受け取った値ををその半分までの値で順番に割っていく
	// 割り切れた場合(素数でない場合)はfalseを返す
	do {
		if ((value % division) == 0) return false;
		division++;
	} while (value / 2 > division);
	
	// チェックに一度も引っかからなければtrueを返す
	return true;
}

//
// 受け取った値を最大値として素数リストをint配列型で生成する
//
void Prime::PrimeGetter(int Max) {
	int array = 1;
	num = 0;
	
	// array*100がMax/5を超えるまでarrayを増やす
	while ( (Max / 5) > (array * 100) ) array++;
	
	// その分だけメモリを確保、素数リスト用の配列とする
	PrimeList = new int[array * 100];
	
	// Maxの半分までの数値を一つずつ素数判定していく
	for (int i = 1; i <= Max / 2; i++) {
		
		// iがtrue(素数)なら素数リストのnum番目にiを代入する
		if ( Prime::PrimeChecker(i) ) {
			PrimeList[num] = i;
			num++;
		}
	}
}

//
// 素数リストを使い素因数分解をする
//
void Prime::PrimeCalclator(int value) {
	
	int count = 0, PowCount = 1;
	ResCount = 0;
	
	PrimeResult = new int[num / 2];	// 割れる数を格納する配列
	CountIndex = new int[num / 2];	// 割れる回数(指数)を格納する配列
	// valueが1になるまで割り続ける
	do {
		if ( value % PrimeList[count] == 0 ) {	// 値が素数で割り切れた場合
			
			// 初めて割る数はPrimeResultに格納する
			if (PowCount == 1) {
				if (count != 0) ResCount++;			//一番最初はインクリメントしない
				PrimeResult[ResCount] = PrimeList[count];
			}
			
			// 現在の指数を格納する
			CountIndex[ResCount] = PowCount;
			
			// 割られる数と指数の更新
			value /= PrimeList[count];
			PowCount++;
		}
		else {	// 割り切れなかった場合は指数を初期化し、カウンターを回す
			PowCount = 1;
			count++;
		}
	} while (value != 1);
}

//
// Primeクラスで取得した結果を表示する
//
void Prime::PrimeShow(int input){
	
	// 式にして表示
	// "input = PrimeResult[i]^CountIndex[i] * PrimeResult[i]..."
	cout << input << " = ";
	for (int i = 0; i <= ResCount; i++) {
		
		// i個目の割れる数を表示
		cout << PrimeResult[i];
		
		// i番目の指数が1でないなら表示
		if (CountIndex[i] != 1) cout << "^" << CountIndex[i];
		
		// ループの終わり(式の終わり)でないなら表示
		if (i != ResCount) cout << " * ";
	}
	cout << endl;	//改行
}

//
// メイン関数
//
void main() {
	Prime judgment;
	int input = 1;
	bool ender;
	
	cout << "素因数分解したい数値を入力してください:";
	cin >> input;
	
	// inputが素数ならここでプログラムを終わる
	ender = judgment.PrimeChecker(input);
	if (ender) {
		cout << input << "は素数です。" << endl;
		return;
	}
	
	// 素数リストの取得
	judgment.PrimeGetter(input);
	
	// 素因数分解
	judgment.PrimeCalclator(input);

	// 結果の表示
	judgment.PrimeShow(input);
}