做考研政治真題的網站免費手機網站建站系統
【題目來源】
https://www.acwing.com/problem/content/792/
【題目描述】
給定一個浮點數 n,求它的三次方根。
【輸入格式】
共一行,包含一個浮點數 n。
【輸出格式】
共一行,包含一個浮點數,表示問題的解。
注意,結果保留 6 位小數。
【數據范圍】
?10000≤n≤10000
【輸入樣例】
1000.00
【輸出樣例】
10.000000
【算法分析】
二分查找,也稱為折半查找,是一種高效的查找方法。它基于分治策略,利用數據的有序性,每次將搜索范圍縮小一半,直至找到目標元素或搜索區(qū)間為空。二分查找要求必須采用順序存儲結構,且其中的元素按關鍵字有序排列。
整數二分的經典模板如下:
模板一(從大到小查找結論 ←):當我們將區(qū)間 [le, ri] 劃分成 [le, mid] 和 [mid+1, ri] 時,其更新操作是 ri=mid 或者 le=mid+1,計算 mid 時不需要加 1( 見下文代碼中的 int mid=(le+ri)>>1; )。
void BinarySearch(vector<int> v,int target) {int le=0;int ri=v.size();while(le<ri) {int mid=(le+ri)>>1;if(v[mid]<target) le=mid+1;else ri=mid;}
}
模板二(從小到大查找結論 →):當我們將區(qū)間 [le, ri] 劃分成 [le, mid-1] 和 [mid, ri] 時,其更新操作是 ri=mid-1 或者 le=mid,此時為了防止死循環(huán),計算 mid 時需要加 1( 見下文代碼中的 int mid=(le+ri+1)>>1; )。
int BinarySearch(vector<int> v,int target) {int le=0;int ri=v.size();while(le<ri) {int mid=(le+ri+1)>>1;if(v[mid]<target) le=mid;else ri=mid-1;}
}
浮點數二分的經典模板如本題代碼所示。
因為浮點數的精度很高,只需要逐漸逼近題目要求的精度就可以了。這里需要注意的是,需要預先設定一個閾值 eps,一般是比題目的精度還要高 2 位,比如題目要求的精度是1e-6,那么就可以設eps=1e-8。
【算法代碼】
#include <bits/stdc++.h>
using namespace std;double le=-100000;
double ri=100000;int main() {double x;cin>>x;while(ri-le>1e-8) {double mid=(le+ri)/2;if(mid*mid*mid<x) le=mid;else ri=mid;}printf("%.6f",ri);return 0;
}/*
in:1000.00
out:10.000000
*/
【參考文獻】
https://www.acwing.com/solution/content/17974/
https://www.acwing.com/video/232/
?