C言語の問題でわからないものがあるので、お願いいたします。
問題
入力された正の整数を因数分解して表示するプログラムを作成し、実行結果を張り付けよ。
9桁以下のせいの指数ならばなんでも因数に分解できるようにせよ。
【実行例】実行時にキーボードから入力したのは051547というかずだけである。
---------------------------------------------------------------
因数に分解します。
2桁以上の整数を入力してください。(9桁以下にしてください):071504
71504= 2^4
*= 41^1
*= 109^1
--------------------------------------------------------------
このような実行例がのっています。
この入力する数字を「051547」へ変換してプログラムを組みたいと思うのですが、どなたか教えていただけませんでしょうか?
C言語の因数分解
Re:C言語の因数分解
それでは、最初に下で示すところまで作って、ソースを添付してください。
①標準入力から整数を入力する(nとしましょう)
②nを2で割り、割り切れるなら、商を新たなnにする。
③nを出力する。
ここまで作れますか?
①標準入力から整数を入力する(nとしましょう)
②nを2で割り、割り切れるなら、商を新たなnにする。
③nを出力する。
ここまで作れますか?
Re:C言語の因数分解
現在、クラスの作り方について勉強中です。
練習問題に使わせてもらいました。
先輩諸氏のクラスの作り方についてアドバイスがありましたら、お願いします。
例えば、一般的にはこんなクラスのメンバーがいいよとか・・・
なお、必要もないのにvectorも使ってみました。
練習問題に使わせてもらいました。
先輩諸氏のクラスの作り方についてアドバイスがありましたら、お願いします。
例えば、一般的にはこんなクラスのメンバーがいいよとか・・・
なお、必要もないのに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言語の因数分解
C++として気をつけることは
コンストラクタで初期化リストを使うこと
出力でfor_each()アルゴリズムを使うこと(こっちは必ずといったわけでもないですが)
ぐらいだと思います。
今回は気にしなくても問題はないですが、
Numクラスをコピー可能にする/しない
のどちらかにするかはあらかじめきちんと考えておいたほうがいいです。
状況によってはコピーコンストラクタを書く必要があったり
コピー不可にする必要がありますので。
あとはイテレーターが使えたらもっとC++らしいです。
コンストラクタで初期化リストを使うこと
出力でfor_each()アルゴリズムを使うこと(こっちは必ずといったわけでもないですが)
ぐらいだと思います。
今回は気にしなくても問題はないですが、
Numクラスをコピー可能にする/しない
のどちらかにするかはあらかじめきちんと考えておいたほうがいいです。
状況によってはコピーコンストラクタを書く必要があったり
コピー不可にする必要がありますので。
あとはイテレーターが使えたらもっとC++らしいです。
Re:C言語の因数分解
組木紙織様
ご指導ありがとうございます。
>コンストラクタで初期化リストを使うこと
>出力でfor_each()アルゴリズムを使うこと
この2点を考慮して、作り直しました。
コピーコントラクタとイテレータはもう少し勉強してから考えてみます。
ご指導ありがとうございます。
>コンストラクタで初期化リストを使うこと
>出力で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で行いました。
コピーコントラクタとイテレータはもう少し勉強してから考えてみます。