初级
描述:输入一个数,输出小于(或等于)这个数根号值的最大整数
#include<iostream>
using namespace std;
int main()
{
int n = 0, m = 1;
cin >> n;
while (m*m <= n)
m++;
cout << m-1 << endl;
return 0;
}
进阶
描述:输入一个数,输出这个数根号值(差值小于0.001)
算法引用自如何算一个数的平方根? C++实现
这个算法中使用的是牛顿法进行根的求解,牛顿法求平方根的论证过程在:CC中,本文仅作简单讲解:牛顿法求平方根的思路是,一个数的根总是介于1(value)和他本身(num)之间的,所以每次迭代的去计算并调整范围总是能找到这个数的根(要求不能使用int型,不方便小数的计算)
列出计算36根号值的大致求解过程(保留一位小数,不严谨)
第一趟:value=(value+num/value)/2
=(1+36/1)/2=18.5
第二趟:value=(value+num/value)/2
=(18.5+36/18.5)/2=10.2
第三趟:value=(value+num/value)/2
=(10.2+36/10.2)/2=6.9
第四趟:value=(value+num/value)/2
=(6.9+36/6.9)/2=6.5
第五趟:value=(value+num/value)/2
=(6.5+36/6.9)/2=5.5
第六趟:value=(value+num/value)/2
=(5.5+36/5.5)/2=6
#include <iostream>
using namespace std;
/**
* @fn isGoodEnough
* @brief 这个值是否足够符合要求了
* @param double number 要求平方根的数
* @param double x 求出过程中的数
* @return bool
*/
bool isGoodEnough(double number, double x)
{
// 跟要求的数差距小于0.0000001才算足够好
if (abs(x * x - number) < 0.0000001)
{
return true;
}
else
{
return false;
}
}
/**
* @fn runTry
* @brief 不断尝试的过程
* @param double number 要求平方根的数
* @param double tryValue 尝试的数
* @return double // 足够好后返回的数 也就是求出的值
*/
double runTry(double number, double tryValue)
{
if (isGoodEnough(number, tryValue))
{
return tryValue;
}
else
{
double newTryValue = (tryValue + number / tryValue) / 2;
return runTry(number, newTryValue); // 递归求解
}
}
/**
* @fn mySqrt
* @brief 可供外部调用的函数
* @param double number [IN] 要求平方根的数
* @return double
*/
double mySqrt(double number)
{
double firstTryValue = 1;
double result = runTry(number, firstTryValue);
return result;
}
int main()
{
double test = mySqrt(36);
cout << test << endl;
return 0;
}