Arrayクラスで作った配列にアクセスするにはArrayのメンバ関数を使わなきゃいけないらしいな。
そのせいでいろいろ出来なかったんだろう。
詳しくは忘れた。
仕事中もPrimeListのことが頭から離れない。
このはまり方はちょっとヤバイかもしれない。
before → if (value % division) return false;
after → if ((value % division) == 0) return false;
ここいじったら正常に動くようになった。
構文としておかしかったということですか?
だったら言ってくれよ。
ってコメントアウトしてた本来の文を戻したらエラーするし('A`)
ifの条件文に関数とか計算式とかを置くだけじゃダメなんだね。ちゃんと比較演算子使わないとうまくいかない。
ちょっと不便。
同じ要素番号に格納したいのにResCount++;が間に挟まってるからズレが出来てる。
if (PowCount == 1) {
PrimeResult[ResCount] = PrimeList[count];
ResCount++;
}// 現在の指数を格納する
CountIndex[ResCount] = PowCount;
だからC版ではResCount++;を一つ上に置いてたんだ。
これもそういう風にするしかないな。
できた。
#includeusing 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); }