C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で長さと幅の差が最小になる長方形の辺を求める方法

長方形の面積が入力として与えられたとき、長さと幅の差が最小になるような長方形の辺(縦と横)を見つけるのが本記事の目的です。

長方形の面積 = 長さ × 幅

入力 − 面積 = 100

出力 − 差が最小の長方形の辺:

長さ = 10、幅 = 10

説明 − 面積が100になる辺の組み合わせは「2×50」「4×25」「5×20」「10×10」です。この中で差が最小なのは「10×10」で、その差は0です。正方形とはすべての辺の長さが等しい長方形のことなので、この結果は自然ですね。

入力 − 面積 = 254

出力 − 差が最小の長方形の辺:

長さ = 127、幅 = 2

説明 − 254 = 2 × 127 であり、これ以外に約数の組み合わせが存在しないため、面積254の長方形を作れる最小差の辺は「127」と「2」のみです。

プログラムで用いるアプローチ

ここでは、まず面積の平方根を求め、そこから1に向かって降順に探索していきます。平方根に近い約数のペアほど長さと幅の差が小さくなるため、条件を満たす約数が見つかった時点でそれが答えとなります。

  • 整数変数 Area として面積を入力として受け取ります。

  • 関数 rectangleSides(int area1) は area1 を受け取り、長さと幅の差が最小になる長方形の辺を出力します。

  • 整数型の length、breadth、tmp1 を宣言します。

  • tmp1 = ceil(sqrt(area1)) を設定します。

  • forループ(int i = tmp1; i > 0; i--)で探索を行います。

  • (area1 % i == 0)が成立した場合、length = area / i、breadth = i を設定します。

  • break文でループを終了します。

  • length と breadth の値を出力します。

コード例

#include <bits/stdc++.h>
using namespace std;
void rectangleSides(int area1){
    int length, breadth;
    int tmp1 = ceil(sqrt(area1));
    for (int i = tmp1; i > 0; i--) {
       if (area1 % i == 0) {

           length = ceil(area1 / i);
           breadth = i;
           break;
       }
   }
   cout<<"Sides of Rectangle with minimum difference :"<<endl;
   cout << "Length = " << length << ", Breadth = "    << breadth << endl;
}
int main(){
   int Area = 140;
   rectangleSides(Area);
   return 0;
}

出力

上記のコードを実行すると、以下の出力が得られます。

Sides of Rectangle with minimum difference :
Length = 14, Breadth = 10
  1. 【C++】前置インクリメント「++i」と後置インクリメント「i++」の違いとは?

    C++のインクリメント演算子「++」には、前置(prefix)と後置(postfix)の2つの形式があり、それぞれ動作に大きな違いがあります。前置インクリメント(++i):変数 i の値を先に1増やし、その増加後の新しい値が式の値になります。つまり、「まず増加してから値を返す」動作です。後置インクリメント(i++):変数 i の値は1増やされますが、式の値としては増加前の元の値が使われます。つまり、「まず値を返してから増加する」動作です。サンプルコード実際のコードを見ながら、その違いを詳しく確認してみましょう。#include<iostream> using namespace s

  2. C++におけるドット演算子(.)とアロー演算子(->)の違いを徹底解説

    C++では、ドット演算子(.)とアロー演算子(->)はどちらもクラスのメンバーにアクセスするために使用されますが、それぞれ使用される場面が異なります。C++において、class、struct、unionとして宣言された型はすべて「クラスタイプ」とみなされるため、以下の説明はこれら3つすべてに当てはまります。基本的な使い分けa.b は、b がオブジェクト a(またはオブジェクトへの参照[1])のメンバーである場合にのみ使用できます。つまり、a.b の形式では、a は常にクラスの実際のオブジェクト(またはその参照)でなければなりません。a->b は、本質的に (*a).b の省略記法で