1以上100未満の任意の自然数を10回入力して,これらの数字を偶数が先,奇数が後である昇順に並び替えるプログラムを作りたいです.
以下のような形式で作りたいです.コードをどのように書けばいいでしょうか?教えてください.よろしくお願いします.
C++
1#include <iostream> 2using namespace std; 3 4void main() { 5 int num[10]; 6 int i; 7 for (i = 0; i < 10; i++) { 8 cin >> num[i]; 9 } 10 //偶数が先の昇順に並び替える 11 12 13 14 for (i = 0; i < 10; i++) { 15 cout << num[i] << endl; 16 } 17}
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
tiitoiさんのコードを参考にしながら、1以上100未満という条件を利用して、奇数なら100を足しておくという方法で書いてしました。
C++
1#include <iostream> 2#include <vector> 3#include <algorithm> 4 5int main() 6{ 7 std::vector<int> arr(10); 8 for (auto &v : arr) { 9 int n; 10 std::cin >> n; 11 v = n + 100 * (n % 2); 12 } 13 std::sort(arr.begin(), arr.end()); 14 for (const auto &v : arr) 15 std::cout << (v < 100 ? v : v - 100) << " "; 16 std::cout << std::endl; 17 return 0; 18}
O(n*log(n))の計算量になるソート部分が単純な比較だけになるので、数が多い場合に有利になるような気がします。気がするだけですけど。
投稿2020/02/06 14:00
総合スコア21739
0
comp.cpp
c
1#include <algorithm> 2using namespace std; 3 4void show_data(int * data, int size, string message) { 5 cout << message << endl; 6 for (int i = 0; i < size; i++) { 7 cout << data[i] << " "; 8 } 9 cout << endl; 10} 11 12int main() { 13 int nums[10]; 14 int pos[2] = {0, 0}; // 奇数と偶数の数を数える 15 16 for (int i = 0; i < 10; i++) { 17 cin >> nums[i]; 18 pos[nums[i] % 2]++; 19 } 20 show_data(nums, 10, "入力データ"); 21 22 // 単純にソートする 23 std::sort(std::begin(nums),std::end(nums)); 24 show_data(nums, 10, "単純ソート "); 25 26 // 偶数を前に集める。 27 int sorted_nums[10]; // 結果を保持する配列 28 pos[1] = pos[0]; // 偶数を保持する開始位置 29 pos[0] = 0; // 偶数を保持する開始位置 30 for (int i = 0; i < 10; i++) { 31 int m = nums[i] % 2; 32 sorted_nums[pos[m]] = nums[i]; 33 pos[m]++; 34 } 35 show_data(sorted_nums, 10, "最終結果"); 36 return 0; 37}
普通にソートしてから、その結果をあたまからなめていってデーの配置を変えていくという方法です。
for ループで、データの順番変更をかいていますが、
配列から偶数だけを抜き出す filter 結果 と 奇数だけを抜き出す filter 結果を 結合させるというように書くとスッキリします。
投稿2020/02/08 11:09
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
偶数を配列の前半に、奇数を配列の後半に読み込み、
それぞれをソートすればよいでしょう。
C++
1#include <iostream> // cin, cout, endl 2#include <algorithm> // sort 3using namespace std; 4 5int main() 6{ 7 int num[10], n, i = 0, j = 10; 8 while (i < j) { 9 cin >> n; 10 if (n & 1) num[--j] = n; 11 else num[i++] = n; 12 } 13 sort(num, num + i); 14 sort(num + j, num + 10); 15 for (i = 0; i < 10; i++) cout << num[i] << endl; 16}
投稿2020/02/06 16:14
総合スコア8224
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
偶数が先,奇数が後である昇順
とのことなので、ソートする際の条件式を以下のようにすればよいと思います。
- a, b の一方が偶数で、もう一方が奇数の場合、すなわち、
a % 2 != b % 2
の場合は、偶数を手前a % 2 < b % 2
にする。
※ x が偶数なら2で割った余り x % 2
は0、x が奇数なら2で割った余り x % 2
は1になることを利用
- a, b の両方が偶数または奇数、すなわち、
a % 2 == b % 2
の場合は、小さい数を手前a < b
にする。
ちなみに、C++ なら、C スタイルの配列ではなく、std::vector を使うことをおすすめします。
サンプルコード
cpp
1#include <algorithm> 2#include <iostream> 3#include <vector> 4 5void main() 6{ 7 std::vector<int> array(10); 8 for (auto &v : array) 9 std::cin >> v; 10 11 for (const auto v : array) 12 std::cout << v << " "; 13 std::cout << std::endl; 14 15 std::sort(array.begin(), array.end(), [](int a, int b) { 16 if (a % 2 != b % 2) 17 // a, b の一方が偶数で、もう一方が奇数の場合、偶数を手前にする。 18 // a=奇数、b=偶数なら、a % 2 == 1, b % 2 == 0 19 // a=偶数、b=奇数なら、a % 2 == 0, b % 2 == 1 20 return a % 2 < b % 2; 21 else 22 // a, b の両方が偶数または奇数の場合、昇順なので、小さい数を手前にする。 23 return a < b; 24 }); 25 26 std::cout << "after sort" << std::endl; 27 for (const auto v : array) 28 std::cout << v << " "; 29 std::cout << std::endl; 30} 31
1 2 3 4 5 6 7 8 9 10 after sort 2 4 6 8 10 1 3 5 7 9
投稿2020/02/06 10:26
編集2020/02/06 14:47総合スコア21956
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。