C++程式設計:用二分法求方程解(以及解決VS 2017中'scanf':this function or variable may be unsafe.`問題)
阿新 • • 發佈:2019-02-03
前言
本文旨在用C++解決問題:“用二分法求方程的解。”以及解決VS 2017 中報錯問題:C4996 'scanf':this function or variable may be unsafe.
一、題目描述
給出等式,能在x屬於[0,100]之間找到方程的解嗎?
輸入的第一行包含一個整數T(1≤T≤100),表示測試用例的數目。接著有T行,每行有一個實數y )。
對於每組測試用例,如有解,則輸出解(實數),反之輸出“no solution”。
二、解題思路
方程的等式左邊在[0,100]這個區間明顯是個單調遞增函式,即滿足二分的性質,所以直接用二分列舉x,即可求解。
三、C++原始碼
#include<iostream>
//#include<cstdlib> //這裡可有可無
using namespace std;
//cstdlib的本來面目是C語言中的庫stdlib.h 。在C++中,C語言中的一些庫被進行了重新命名,去掉了.h並在庫名前加c。比如: C語言
//中的stdlib.h在C++被重新命名為cstdlib C語言中的ctype.h在C++中被重新命名為cctype C語言中的stdio.h在C++中被重新命名為
//cstdio C語言中的time.h在C++中被重新命名為ctime。
//題目:給出一個等式,用二分法求方程的解。
const double precision = 1e-8; //這個表示還是很神奇的,表示10的-8次方。
//一個簡單函式:求方程左邊的式子的值
double func(double x) {
return (8 * x*x*x*x + 7 * x*x*x + 2 * x*x + 3 * x + 6);
}
int main() {
int num; //接受的測試用例數目
scanf("%d", &num);
double left, right, mid; //[0,100]的區間,所以left一開始是0,right是100. mid是用在二分法中的變數
double y; //方程等式右邊的y值,作為測試用例的輸入。
while (num--) { //對每個測試用例輸入進行求解。
left = 0;
right = 100; //初始化 區間的左右邊界值
scanf("%lf", &y);//接受輸入
if (y<func(0) || y>func(100)) { //因為等式左邊是個遞增函式,所以判斷是不是在上下界中,不在自然就無解。
printf("No solution!\n");
}
else { //這是有解的情況,進行二分法求解。
while (right - left > precision) {
mid = (right + left) / 2;
if ((func(mid) - y) > 0) { //如果是正值,自然是把right的值改成mid啦。
right = mid;
}
else {
left = mid; //反之讓left的值變成mid,不斷縮小區間,直到right和left的距離小於等於precision
}
}
printf("%.4lf\n", left);
}
}
system("pause");
return 0;
}
四、執行結果
五、總結
1)複習了一下二分法;
2)明白了cstdlib是什麼;
3)一開始的時候一直報錯:
C4996 'scanf':this function or variable may be unsafe.
解決方案:在程式的第一行加入程式碼#define _CRT_SECURE_NO_WARNINGS
即可。