C++入門練習(1)

10919 ワード

テーマはCourseraの「プログラム設計とアルゴリズム」課程の宿題問題から収集された.
タイトル
クリスタルデート
奇数の和
りんごと虫
象が水を飲む
整数の個数
1の個数
最高の点数
最大奇数と最小偶数の差の絶対値
整数の各ビットを分離
アレイ逆シーケンス再生
パリティソート
バブルソートの実現
クリスタルデート
注意:合計時間制限:1000 msメモリ制限:65536 kB
説明
晶晶の友达の贝贝は晶晶を约束して来周一绪に展覧会を见に行きますが、晶晶は毎周の1、3、5授业があって授业を受けなければなりません.できない場合はNOを出力します.
入力
一行を入力すると、貝貝貝は晶を展覧会に招待した日付を、月曜日から日曜日まで数字1から7で表した.
しゅつりょく
出力は1行あり,結晶がベイベイの招待を受けることができればYES,そうでなければNOを出力する.注意YESもNOも大文字!
サンプル入力:
   
1
   
2
   
3

サンプル出力:
   
NO
   
YES
   
NO

参考答案:
#include 
using namespace std;
int main() {
    int a;
    cin >> a;
    if (a == 1 || a == 3 || a == 5)
        cout << "NO" << endl;
    else
        cout << "YES" << endl;
    return 0;
}

奇数の和
注意:合計時間制限:1000 msメモリ制限:65536 kB
説明
正の整数mからn(mとnを含む)の間のすべての奇数の和を計算し、ここで、mはnより大きくなく、nは300より大きくない.例えば、m=3、n=12であり、その和は、3+5+7+9+11=35である
入力
2つの数mおよびnは、0<=m<=n<=300のスペース間隔である.
しゅつりょく
奇数の和
サンプル入力
   
7 15
   
0 1
   
3 3
   
100 100

サンプル出力
   
55
   
1
   
3
   
0

参考答案
#include 
using namespace std;
int main() {
    int m, n, result = 0;
    cin >> m >> n;
    while (m <= n) {
        //  m n       ,       ,            。       。
        if (m % 2 == 1)
            result += m;
        m++;
    }
    //    
    cout << result << endl;
    return 0;
}
//              ?

りんごと虫
注意:合計時間制限:1000 msメモリ制限:65536 kB
説明
あなたはりんごを1箱n個買ったが、残念なことに買った後、箱に虫が混入した.虫はx時間ごとに1つのリンゴを食べることができて、もし虫が1つのリンゴを食べ終わる前にもう1つを食べないとしたら、y時間を経てあなたはまだ何個の完全なリンゴがありますか?
入力
n,x,y(いずれも整数)を含む1行のみを入力します.
しゅつりょく
出力も1行、残りのリンゴ数
サンプル入力
   
10 4 9
   
10 4 36
   
10 4 100

サンプル出力
   
7
   
1
   
0

参考答案
#include 
using namespace std;

int main(){
	int n = 0, x = 0, y = 0;
	cin >> n >> x >> y;
	if (y / x >= n)
		cout << 0 << endl;
	else if (y % x == 0)
		cout << n - y / x << endl;
	else
		cout << n - y / x - 1 << endl;
        return 0;
}

象が水を飲む
注意:合計時間制限:1000 msメモリ制限:65536 kB
説明
1匹の象が喉が渇いて、20リットルの水を飲んでやっと喉の渇きを癒すことができて、しかし今ただ1つの深いhセンチメートルだけあって、底面の半径はrセンチメートルの小さいバケツ(hとrはすべて整数です).象に少なくともどのくらいのバケツの水を飲んで喉の渇きを癒すことができるかを聞いた.
入力
1行を入力します:行の2つの整数を包んで、1つのスペースで分けて、それぞれ小さいバケツの深いhと底面の半径rを表して、単位はすべてセンチメートルです.
しゅつりょく
象が少なくとも水を飲むバケツの数を表す整数を含む1行を出力します.
ヒント
バケツの深さがhセンチメートル、底面半径がrセンチメートルの場合、Pi*r*r*h立方センチメートルの水を入れることができます.(Pi=3.14159とする)
1リットル=1000 ml
1ミリリットル=1立方センチメートル
サンプル入力
   
23 11
   
1 1

サンプル出力
   
3
   
6367

参考答案
#include 
using namespace std;

int main(){
	int h = 0, r = 0;
	float cap = 0;
	cin >> h >> r;
	cap = 3.14159 * r*r*h;
	cout << (int)(20000 / cap) + 1 << endl;
        return 0;
}

整数の個数
注意:合計時間制限:1000 msメモリ制限:65536 kB
説明
与えられたk(1
入力
2行入力:最初の行には正の整数kが含まれ、2番目の行にはk個の正の整数が含まれ、2つの正の整数ごとに1つのスペースで区切られます.
しゅつりょく
出力は3行あり、第1行1が出現した回数、第2行5が出現した回数、第3行10が出現した回数である.
サンプル入力
   
5
1 5 8 10 5
   
5
2 2 2 2 2

サンプル出力
   
1
2
1
   
0
0
0

参考答案
#include 
using namespace std;
int main(){
    int k;
    cin>>k;
    int n1=0, n5=0, n10=0;
    for (int i=0;i>n;
        if (n == 1) n1++;
        else if (n == 5) n5++;
        else if (n == 10) n10++;
    }
    cout<

1の個数
注意:合計時間制限:1000 msメモリ制限:65536 kB
説明
10進数の整数Nを与えて、その対応する2進数の中の1の個数を求めます
入力
1番目の整数は、N組のテストデータを表し、その後、N行は対応するテストデータであり、動作ごとに1つの整数である.
しゅつりょく
N行、各行出力は1入力に対応します.
サンプル入力
5
2
100
1000
66
0

サンプル出力
1
3
6
2
0

参考答案
# include 
using namespace std;

int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        int x, ans = 0;
        cin >> x;
        while (x > 0) {
            ans += x % 2;
            x /= 2;
        }
        cout << ans << endl;
    }
    return 0;
}
//             2,     1  0。                ,      ,                    。

最高の点数
注意:合計時間制限:1000 msメモリ制限:65536 kB
説明
孫先生が講義した「計算概論」という授業は試験が終わったばかりで、試験で取った最高点数を知りたいと思っています.人数が多いので、彼はこのことをコンピューターに任せたほうが便利だと思っています.孫先生にこの問題を解決してもらえますか.
入力
2行入力、1行目の整数n(1<=n<100)は、今回の試験を受ける人数を表す.2行目はこのn人の学生の成績で、隣接する2つの数の間に1つのスペースで隔てられています.すべての成績は0から100の整数です.
しゅつりょく
整数、すなわち最高の成績を出力します.
サンプル入力
5
85 78 90 99 60

サンプル出力
99

参考答案
# include 
using namespace std;

int main() {
        int n = 0, score[100] = { 0 }, max = 0;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> score[i];
	}
	max = score[0];
	for (int i = 1; i < n; i++) {
		if (max < score[i])
			max = score[i];
	}
	cout << max << endl;
        return 0;
}

最大奇数と最小偶数の差の絶対値
注意:合計時間制限:1000 msメモリ制限:65536 kB
説明
6個の正の整数を入力し、6個の正の整数のうち少なくとも1個の奇数と1個の偶数が存在する.
この6つの正の整数の中で最大の奇数をaにして、最小の偶数をbにして、|a-b|の値を求めます
入力
1行に6個の正の整数を入力し、6個の正の整数はすべて100未満です.
入力保証この6つの数のうち少なくとも1つの奇数と1つの偶数が存在する
しゅつりょく
出力は1行で、最大の奇数と最小の偶数の差の絶対値を出力します
サンプル入力
   
1 2 3 4 5 6
   
1 6 3 8 5 10

サンプル出力
   
3
   
1

参考答案
#include 
using namespace std;

int main(){
        int nums[6] = { 0 };
	int maxOdd = 0, minEven = 100;
	for (int i = 0; i < 6; i++) {
		cin >> nums[i];
		if (nums[i] % 2 == 0 && nums[i] < minEven)
			minEven = nums[i];
		else if (nums[i] % 2 == 1 && nums[i] > maxOdd)
			maxOdd = nums[i];
	}
	cout << (maxOdd > minEven ? (maxOdd - minEven) : (minEven - maxOdd));*/
        return 0;
}

 
整数の各ビットを分離
注意:合計時間制限:1000 msメモリ制限:65536 kB
説明
キーボードから任意の3桁の整数を入力し、100桁、10桁、桁数を正確に分離し、それぞれ画面に出力し、出力は行ごとに1つの数を出力する方式で、他の記号を持たない.
入力
任意の3ビット整数
しゅつりょく
3桁の整数の各ビット
サンプル入力
123

サンプル出力
1
2
3

参考答案
#include 
using namespace std;

int main(){
        int n = 0;
	cin >> n;
	for (int i = 2; i >= 0; i--) {
		int temp = 1;
		for (int j = 0; j < i; j++)
			temp *= 10;
		cout << n / temp << endl;
		n %= temp;
	}
        return 0;
}

 
アレイ逆シーケンス再生
注意:合計時間制限:1000 msメモリ制限:65536 kB
説明
配列内の値を逆順序で再保存します.例えば,従来の順序は8,6,5,4,1であった.要求は1,4,5,6,8に変更された.
入力
2行として入力:1行目の配列の要素の個数n(1
しゅつりょく
出力は1行:逆シーケンス後の配列の整数を出力し、2つの整数ごとにスペースで区切ります.
サンプル入力
5
8 6 5 4 1

サンプル出力
1 4 5 6 8

参考答案
#include 
using namespace std;
int a[100];
int main() {
    int n;
    cin >> n;
    for (int i = 0; i> a[i];
    while (n--) { //         ,   while(n-->0)
        cout << a[n];
        if (n > 0) cout << " "; //                   
    }
    return 0;
}
//        ,                            ?

 
パリティソート
注意:合計時間制限:1000 msメモリ制限:65536 kB
説明
10個の整数を入力し、10個の整数を昇順に並べて出力し、奇数を前、偶数を後にします.
入力:10個の整数を入力
出力:パリティ順の10個の整数
サンプル入力:10 9 8 7 6 5 4 3 1
サンプル出力:1 3 5 7 9 2 4 8 10
参考答案:
方法1
#include 
    using namespace std;
    
    int main() {
      int a[10];
      for (int i = 0; i < 10; i++) {
        cin >> a[i];
      }
      //   ,           ,        
      int l = 0, r = 9; //              
      while (l <= r) {
        bool leftIsOdd = a[l] % 2 == 1;
        bool rightIsEven = a[r] % 2 == 0;
        if (leftIsOdd) {
          l++;
        } else if (rightIsEven) {
          r--;
        } else if (!leftIsOdd && !rightIsEven) {
          int temp = a[l];
          a[l] = a[r];
          a[r] = temp;
        }
      }
      //  l  (    )  ,          ,      ,     
      int start = 0, end = l;
      for (int i = start; i < end - 1; i++) {
        for (int j = start + 1; j < start + end - i; j++) {
          if (a[j - 1] > a[j]) {
            int temp = a[j];
            a[j] = a[j - 1];
            a[j - 1] = temp;
          }
        }
      }
      //  l  (    )  ,          ,      ,     
      start = l, end = 10;
      for (int i = start; i < end - 1; i++) {
        for (int j = start + 1; j < start + end - i; j++) {
          if (a[j - 1] > a[j]) {
            int temp = a[j];
            a[j] = a[j - 1];
            a[j - 1] = temp;
          }
        }
      }
      for (int i = 0; i < 10; i++) {
        cout << a[i] << ' ';
      }
      return 0;
    }

方法2:
 #include 
    using namespace std;
    
    int main() {
      int a[10];
      for (int i = 0; i < 10; i++) {
        cin >> a[i];
      }  
      //   ,          ,      ,     
      for (int i = 0; i < 9; i++) {
        for (int j = 1; j < 10 - i; j++) {      
      //           ,                 
      //         ,      ,         
      bool leftIsEven = a[j - 1] % 2 == 0;
      bool rightIsEven = a[j] % 2 == 0;
      if ((leftIsEven && !rightIsEven) ||
          (leftIsEven == rightIsEven && a[j - 1] > a[j])) {        
        int temp = a[j];        
        a[j] = a[j - 1];
        a[j - 1] = temp;
      }
    }
  }  
  for (int i = 0; i < 10; i++) {
    cout << a[i] << ' ';
  }  
  return 0;
}

 
バブルソートの実現
注意:合計時間制限:1000 msメモリ制限:65536 kB
説明
自分の理解に基づいてバブルソートアルゴリズムを作成してください.配列サイズは1000以内です.
入力:最初の行はnで、配列のサイズを表し、次にn行は配列のn要素です.
出力:ソート後の結果、要素1行
参考答案:
    #include 
    using namespace std;

    int main() {
        int n, a[1000]; //   n  ,n   1000。a       
        cin >> n;  
        //   n    
        for (int i = 0; i < n; i++) {
          cin >> a[i];
    }  
    //   ,          ,      ,     
    for (int i = 0; i < n - 1; i++) {
      for (int j = 1; j < n - i; j++) {      
        if (a[j - 1] > a[j]) {
          int temp = a[j];
          a[j] = a[j - 1];
          a[j - 1] = temp;
        }    
      }  
    }  
    //     
   for (int i = 0; i < n; i++) {
     cout << a[i] << endl;  
   }  
   return 0;
}