Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรมหาความต่างมุมน้อยที่สุดของสองส่วนของวงกลมใน C++

ในปัญหานี้ เราได้รับอาร์เรย์ที่แสดงชิ้นส่วนของวงกลมตามมุมของวงกลม งานของเราคือสร้าง โปรแกรมหาความต่างมุมน้อยที่สุดของสองส่วนของวงกลมที่กำหนดใน C++

คำอธิบายปัญหา – เราได้รับมุมของทุกชิ้นส่วนของวงกลมในอาร์เรย์ เราต้องรวมชิ้นส่วนเพื่อให้ได้สองชิ้นที่มีความต่างของมุมน้อยที่สุด

ตัวอย่างเพื่อความเข้าใจ

อินพุต

ang[] = {90, 45, 90, 135}

โปรแกรมหาความต่างมุมน้อยที่สุดของสองส่วนของวงกลมใน C++

เอาต์พุต

90

คำอธิบาย

รวมชิ้นที่ 1 และ 2 คือ 90 + 45 = 135

รวมชิ้นที่ 3 และ 4 คือ 90 + 135 = 225

ความต่าง = 225 - 135 = 90

วิธีแก้ปัญหา

ที่นี่เราต้องรวมทุกส่วนให้เป็นสองส่วน และต้องใช้ส่วนที่ติดกัน (ในตัวอย่างไม่สามารถเอา ang1 และ ang3 มารวมกันได้)

ให้มุมของส่วนที่ 1 เป็น A

มุมของส่วนที่ 2 จะเป็น 360 - A

ความต่างจะเป็น |A - (360 - A)| เราใช้ค่าสัมบูรณ์เพราะมุมมีแค่ค่าบวก

แก้สมการความต่างได้ 2 * |A - 180| ค่านี้ต้องเป็นค่าน้อยที่สุด เราจะลองรวมชิ้นส่วนที่เป็นไปได้ทั้งหมดและหาค่าต่ำสุดของ (2 * |A - 180|)

โปรแกรมตัวอย่างการทำงานของวิธีแก้

ตัวอย่าง

#include <iostream>
#include <math.h>
using namespace std;

int CalcSmallDiffAng(int ang[], int n) {
    int Left = 0, A = 0, minDiff = 360;
    for (int i = 0; i < n; i++) {
        A += ang[i];
        while (A >= 180) {
            minDiff = min(minDiff, 2 * abs(180 - A));
            A -= ang[Left];
            Left++;
        }
        minDiff = min(minDiff, 2 * abs(180 - A));
    }
    return minDiff;
}

int main() {
    int ang[] = { 90, 45, 90, 135 };
    int n = sizeof(ang) / sizeof(ang[0]);
    cout << "The smallest difference of angles of two parts of a given "
         << "circle is " << CalcSmallDiffAng(ang, n);
    return 0;
}

เอาต์พุต

The smallest difference of angles of two parts of a given circle is 90