C/C++ 凸多邊形求對(duì)角線交點(diǎn)的示例代碼
題目描述
對(duì)于一個(gè) n 個(gè)頂點(diǎn)的凸多邊形,它的任何三條對(duì)角線都不會(huì)交于一點(diǎn)。請(qǐng)求出圖形中對(duì)角線交點(diǎn)的個(gè)數(shù)。
例如,6 邊形:
這里可以注意到并沒有出現(xiàn)多條對(duì)角線交叉在一個(gè)點(diǎn)的情況。
輸入格式
輸入只有一行一個(gè)整數(shù) n,代表邊數(shù)。
輸出格式
輸出一行一個(gè)整數(shù)代表答案。
數(shù)據(jù)規(guī)模與約定
這里給出一個(gè)特別的例子
輸入是:
98765
輸出是:
3964374251598225115
特別注意,在這種情況下,答案的值已經(jīng)非常逼近longlong類型的最大表示范圍,所以在計(jì)算的過程當(dāng)中要特別注意,下面給出代碼
#include <iostream> using namespace std; int main() { long long int n = 0; cin >> n; long long int answer = 0; long long int temp = 1; while (temp < (n - 2)) { answer += temp * (n - temp - 2); temp++; } if (n % 4 == 0) { n /= 4; } else if (n % 2 == 0) { n /= 2; answer /= 2; } else { answer /= 4; } answer *= n; cout << answer << endl; return 0; }
先選擇一條對(duì)角線,將多邊形分為兩個(gè)部分,一邊是一個(gè)點(diǎn)的,另一邊是剩下的點(diǎn),兩邊的點(diǎn)相連形成的對(duì)角線與所選擇的對(duì)角線相交形成交點(diǎn)。
以此類推,現(xiàn)分為一邊是1個(gè)點(diǎn)的,然后這一邊的點(diǎn)逐漸增加,直到另外一邊也只剩下一個(gè)點(diǎn)為止。需要特別注意的是,這樣的每一組對(duì)角線都有n條,這樣重復(fù)計(jì)算了比如點(diǎn)a到點(diǎn)b和點(diǎn)b到點(diǎn)a,其實(shí)是同一條。再根據(jù)題意,每個(gè)交點(diǎn)是由兩個(gè)對(duì)角線形成的,而我們?cè)谟?jì)算點(diǎn)的時(shí)候用每條對(duì)角線都計(jì)算了一次,所以又重復(fù)計(jì)算了一遍。也就是說,這樣我們得到的answer是最終正確answer的四倍。
特別注意,我將乘n的操作挪到了外面,把除以4的操作提前了,避免在運(yùn)算的過程中出現(xiàn)數(shù)據(jù)上溢的情況。
到此這篇關(guān)于C/C++ 凸多邊形求對(duì)角線交點(diǎn)的文章就介紹到這了,更多相關(guān)C++ 凸多邊形求對(duì)角線交點(diǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
OpenCV實(shí)現(xiàn)視頻綠幕背景替換功能的示例代碼
這篇文章主要介紹了如何利用OpenCV實(shí)現(xiàn)視頻綠幕背景替換功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)OpenCV有一定的幫助,感興趣的可以學(xué)習(xí)一下2023-02-02C語(yǔ)言實(shí)現(xiàn)大數(shù)值金額大寫轉(zhuǎn)換的方法詳解
這篇文章主要為大家詳細(xì)介紹了如何利用C語(yǔ)言實(shí)現(xiàn)大數(shù)值金額大寫轉(zhuǎn)換的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-03-0310行C++代碼實(shí)現(xiàn)高性能HTTP服務(wù)
這篇文章主要介紹了10行C++代碼如何實(shí)現(xiàn)高性能HTTP服務(wù),幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下2021-04-04C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的停車場(chǎng)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的停車場(chǎng)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Qt數(shù)據(jù)庫(kù)應(yīng)用之實(shí)現(xiàn)數(shù)據(jù)打印到紙張
關(guān)于Qt打印內(nèi)容到紙張,網(wǎng)上的辦法非常多,比如有些直接用painter繪制,逐步控制分頁(yè)打印。本文介紹的方法則是將內(nèi)容作為html設(shè)置到文檔對(duì)象,再調(diào)用文檔對(duì)象的print方法傳入QPrinter對(duì)象打印,感興趣的同學(xué)可以了解一下2022-01-01C++ 構(gòu)造雙向鏈表的實(shí)現(xiàn)代碼
本篇文章是對(duì)C++中構(gòu)造雙向鏈表的實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C++17 使用 std::string_view避免字符串拷貝優(yōu)化程序性能
這篇文章主要介紹了C++17 使用 std::string_view避免字符串拷貝優(yōu)化程序性能,幫助大家提高程序運(yùn)行速度,感興趣的朋友可以了解下2020-10-10C++ 面向?qū)ο蟪绦蛟O(shè)計(jì)--內(nèi)存分區(qū)詳解
這篇文章主要介紹了剖析C++的面向?qū)ο缶幊趟枷?C++的面向?qū)ο筇匦允瞧鋵?duì)C語(yǔ)言的重要拓展之處,需要的朋友可以參考下,希望能夠給你帶來幫助2021-08-08