1. 程式人生 > >C++程式設計:用二分法求方程解(以及解決VS 2017中'scanf':this function or variable may be unsafe.`問題)

C++程式設計:用二分法求方程解(以及解決VS 2017中'scanf':this function or variable may be unsafe.`問題)

前言

本文旨在用C++解決問題:“用二分法求方程的解。”以及解決VS 2017 中報錯問題:C4996 'scanf':this function or variable may be unsafe.

一、題目描述

給出等式8x4+7x3+2x2+3x+6=y,能在x屬於[0,100]之間找到方程的解嗎?

輸入的第一行包含一個整數T(1≤T≤100),表示測試用例的數目。接著有T行,每行有一個實數y |y|1e10)。
對於每組測試用例,如有解,則輸出解(實數),反之輸出“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即可。