C++ 计算一个数的根号值

初级
描述:输入一个数,输出小于(或等于)这个数根号值的最大整数

#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;
}
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值