C++で頭と脚の数から動物園の動物の数を求める方法
問題概要
動物園にいる動物の頭の総数と脚の総数が与えられ、その情報をもとに動物園にいる動物の数を計算するのが課題です。以下のプログラムでは、動物を「シカ」と「クジャク」の2種類と仮定して考えていきます。
入力:
heads = 60
legs = 200
出力:
シカの数:40
クジャクの数:20
解説:
シカの総数を x、クジャクの総数を y とおきます。
頭は動物1体につき1つしかないため、最初の式は次のようになります。
x + y = 60
シカの脚は4本、クジャクの脚は2本なので、2番目の式は次のようになります。
4x + 2y = 200
この連立方程式を解くと、
4(60 - y) + 2y = 200
240 - 4y + 2y = 200
y = 20(クジャクの総数)
x = 40(頭の総数 − クジャクの総数)
入力:
heads = 80
legs = 200
出力:
シカの数:20
クジャクの数:60
解説:
同様に、シカの総数を x、クジャクの総数を y とおきます。
頭の数に関する式は「x + y = 80」、脚の数に関する式は「4x + 2y = 200」となります。これを解くと、
4(80 - y) + 2y = 200
320 - 4y + 2y = 200
y = 60(クジャクの総数)
x = 20(頭の総数 − クジャクの総数)
プログラムのアプローチ
動物園の頭の総数と脚の総数を入力として受け取ります
シカの数を計算する関数を作成します
関数内で、count = ((脚の総数) − 2 × (頭の総数)) ÷ 2 を計算します
count の値を返します
クジャクの数は、「頭の総数 − シカの総数」で求めます
結果を出力します
計算式のポイント
すべての動物には最低でも脚が2本あるため、「脚の総数 − 2 × 頭の総数」で、シカがクジャクより多く持っている脚の本数(1匹あたり2本)の合計が求まります。これを2で割ることで、脚が4本のシカの数を算出できるという仕組みです。
サンプルコード
#include <bits/stdc++.h>
using namespace std;
// シカの数を計算する関数
int count(int heads, int legs){
int count = 0;
count = ((legs)-2 * (heads))/2;
return count;
}
int main(){
int heads = 80;
int legs = 200;
int deers = count(heads, legs);
int peacocks = heads - deers;
cout<<"シカの数:"<<deers<< endl;
cout<<"クジャクの数:" <<peacocks<< endl;
return 0;
}
実行結果
上記のコードを実行すると、次の出力が得られます。
シカの数:20
クジャクの数:60
-
C++で指定範囲内の最大ビットANDペアを求める方法
問題の概要範囲 [L, R] が与えられたとき、L ≤ X < Y ≤ R を満たす整数のペア (X, Y) の中から、ビットごとのAND(論理積)である X & Y が最大になる組み合わせを見つけ、その値を出力するのが課題です。具体例L = 1、R = 10 の場合を考えてみましょう。このとき最大のビットAND値は 8 となり、次のように求められます。1000 # 8 の2進数表現 & 1001 # 9 の2進数表現 ---- 1000 # 最終結果 = 8アプローチ最もシンプルな方法は、L から R までのすべての数値ペアを総当たりで調べることです。各ペア
-
C++で指定されたパスを生成するための最小停止点数を求める
本記事では、二次元平面上の移動経路から、その経路を実現するために最低限必要な停止点(ストップ)の数を求めるアルゴリズムを、C++のコード例とともに解説します。 問題の定義 二次元空間上に多数の点が存在し、それらを特定の順序で訪問する必要があります。 ある点から別の点への移動は常に最短経路が選ばれ、経路の各区間は必ずグリッド線(水平線・垂直線)に沿って進みます。 点を訪問するために選ばれた経路が文字列として与えられます。このとき、与えられた経路を生成するために必要な最小の停止点数を求めます。 アルゴリズム 1. 各停止点を訪問する際の移動パターンを観察することで、この問題を解決できる 2.