# Root Finding# Polynomial# Numerical Analysis# Brute Force

b893 - 勘根定理

🔗 前往 ZeroJudge 原題

題目描述

題目描述了勘根定理,並要求撰寫程式來找出一個五次多項式函數的所有實根,並輸出根所在的連續整數範圍。如果有多個根,則按升序輸出。如果沒有根,則輸出 "N0THING! >\<"。如果有多個根落在同一個整數點,則輸出兩次該整數。如果根的數量過多,則輸出 "Too many... = ="。

解題思路

題目要求找出多項式函數的根的範圍,可以使用勘根定理的原理,即在兩個整數 ab 之間,如果 f(a)f(b) 的符號不同,則說明在這個範圍內存在至少一個根。程式碼使用暴力搜尋的方法,遍歷從 -36 到 36 的整數,計算多項式函數的值。如果找到一個根(函數值為 0),則輸出該根兩次。如果找到兩個符號相反的函數值,則輸出這兩個整數作為根的範圍。

複雜度分析

  • 時間複雜度: O(n),其中 n 是搜尋的整數範圍的大小 (36 - (-36) + 1 = 73)。由於迴圈遍歷固定範圍內的整數,因此時間複雜度是線性的。
  • 空間複雜度: O(1),程式碼只使用了幾個變數來儲存中間結果,空間複雜度是常數級別。

程式碼

#include <iostream>
using namespace std;
int main(){
	long long int a,b,c,d,e,f;
	while(cin>>a>>b>>c>>d>>e>>f){
		if(!a&&!b&&!c&&!d&&!e&&!f){
			cout << "Too many... = =\"\n";
			continue;
		}
		bool ans=0;
		long long int tmp=0,tmp2=0;
		for(int x=-36;x<=36;++x){
			tmp=a*x*x*x*x*x+b*x*x*x*x+c*x*x*x+d*x*x+e*x+f;
			if(!tmp){
				cout << x << " " << x << "\n"; 
				ans=1;
			}
			else if(tmp2*tmp<0){
				cout << x-1 << " " << x << "\n";
				ans=1;
			}
			tmp2=tmp;
		}
		if(!ans)
			cout << "N0THING! >\\\\\\<\n";
	}
}

Discussion