質問: ### 実現したいこと 三つ以上の整数の最大公約数を求める。 ### 問題点 ``` 最大公約数が違う答えになる。 ./kadai09 40 45 50 "最大公約数は0" ``` ### 追記5/21 私なりにいただいた助言をもとに考えなおしてみました。でもうまくいかないです。 ``` やりたいこととしては、まずargc[1]とargc[2]の最大公約数を求めて、その答えとargc[3]の最大公約数を求めるというのをどんどん繰り返していく、、、というかんじです。 ``` ### コード ``` #include #include int main(int argc,char* argv[]) { int maxk=0; int ans=0; int i,j,k; for(i=1;i0;j--){ if(std::atoi(argv[i])%j==0){ if(std::atoi(argv[i+1])%j==0){ ans=j; break; } } for(k=ans;k>0;k--){ if(ans%k==0){ if(std::atoi(argv[i+2])%k==0){ maxk=k; break; } } } } } std::cout<<"最大公約数は"<
回答: あまり美しくないし、例外処理もしていませんが、以下のようなコードでいかがでしょうか? ``` #include #include using namespace std; int main(int argc,char* argv[]) { int maxk=0; // 最大公約数 int i; int j; // プログラムを除き2つ以上の引数が与えられなかった場合 if (argc < 3) { cout << "2つ以上の整数を入力してください。" << endl; return -1; } // 以下、例外処理は省略 // 引数の最小値を求めつつ、配列に格納 int size = argc - 1; // コマンド以外の引数の数 int *num = new int[size]; num[0] = atoi(argv[1]); int min = num[0]; for(i=1;i num[i]) { min = num[i]; } } // 共通な数で割れるだけ割っていく for(i=min; i>0; i--) { bool flg = true; // すべて割り切れるか否か for(j=0; j