笔试题之sqrt函数重写

这篇博客主要介绍了如何手动实现sqrt函数,避免使用库函数,精度达到0.001。作者通过分析两种情况(平方数和非平方数),提出了使用折半查找的思想来确定范围,并给出了程序实现,包括整数部分和小数部分的处理。程序采用了超出int范围的数据处理,利用自定义的string继承类。
摘要由CSDN通过智能技术生成

sqrt函数重写加扩张

个人信息:就读于燕大本科软件工程专业 目前大三;

本人博客:google搜索“cqs_2012”即可;

个人爱好:酷爱数据结构和算法,希望将来搞科研为人民作出自己的贡献;

博客内容:笔试题之sqrt函数重写;

博客时间:2014-4-1

编程语言:C++

编程坏境:Windows

编程工具:vs2008

 

  • 引言

课很多,还得准备笔试面试的东西,只能说这样一句话了

很多事情需要你硬着头皮去做,提前准备总不会错。提升自己的执行力是至关重要的!

  • 题目

求一个正整数N的开方,不能用库函数sqrt,精度在0.001即可。

  • 思路

首先我分析题目,分以下情况

1: N == x^2

2:     N != x^2

对于第一种情况,我们怎么做?给一个N,然后找出某个整数x 使得 x^2 == N,不能用库sqrt函数,那就用暴力法?显然不行,那怎么办?

我们可以找出一个范围 使得 s<x<b; 然后 s^2 <= N and b^2 >= N,如果能找出这样一个范围就可以用折半查找了。

那么怎么去找出这么一个范围呢?这个就很简单了,很随意的,我的范围是这样查找的

(1,2) ->   (2,4)  ->  (4,16)  ->  (16,16^2)   ->  (16^4,16^8)  ->    ·······

相信你一看出规律了吧,是吧。(这种方法我已经实现了,当然还有更好的想法,下篇博客给出,敬请期待)

对于第二种情况,我们先可以找出 结果的整数部分,然后再求小数部分

整数部分按照情况一的方法就可以了,至于小数部分,每精确一位小数,其实就是在末尾加上一位0·9中的数字而已,是不是,这里也用到折半查找,嘿嘿

还有我附加一句,我的程序已处理的数据能力已经超出了int的表示范围,采用自己编写的string的继承类实现而成;

  • 实验

解释程序 :

第一行输入的是 N

第二行输入的是 小数的位数(如果输入的小于0 ,将异常抛出,重置为0 )

第三行输出的是 结果

  • 代码

mine_string.h

#include <iostream>
#include <string>
#include <limits>
using namespace std;

// extra the class of string
class String:public string
{
public:

	// function 1: mode the add of int( (-3) + (-3) ) = - 6
	// input: 两个字符串 a 和 b,里面放的都是整数;
	// output: 返回一个字符串,字符串里面是整数;
	// 功能: 实现参数两个整数的相加操作,结果存在返回的字符串里
	static string ADD_Int(string a,string b);



	// function 2: make a-b mode int a - b; 7 - (-3) = 10
	// input: 两个字符串 a 和 b,里面放的都是整数;
	// output: 返回一个字符串,字符串里面是整数;
	// 功能: 实现参数两个整数的相减操作,结果存在返回的字符串里
	static string MINUS_Int(string a,string b);

	// function 3: make a*b mode int a * b;
	// input: 两个字符串 a 和 b,里面放的都是整数;
	// output: 返回一个字符串,字符串里面是整数;
	// 功能: 实现参数两个整数的相乘操作,结果存在返回的字符串里
	static string MULT_Int(string a,string b);

	// function 4: mode the division a/b
	// input: 两个字符串 a 和 b,里面放的都是整数;
	// output: 返回一个字符串,字符串里面是整数;
	// 功能: 实现参数两个整数的相除操作,结果存在返回的字符串里
	static string DIV_Int(string a,string b);

	// function 5: pow number a^b
	// input: 两个字符串 a 和 b,里面放的都是整数;
	// output: 返回一个字符串,字符串里面是整数;
	// 功能: 实现参数两个整数的a^b操作,结果存在返回的字符串里
	static string Pow_Int(string a,string b);

	// function 6: int To string :"123" = 123
	// input: 一个int数 a;
	// output: 返回一个字符串,字符串里面是整数;
	// 功能: 将整数a转换成对应的字符串格式
	static string Int_To_String(int x);

	// function 7: static char division a/b : 4 / 3
	static string Division(string a,string b);

	// function 8: make a-b mode int a - b; 4 - 3
	static string MinusInt(string a,string b);

	// function 9: mode the add of int :3 + 4
	static string AddInt(string a,string b);

	// function 10: make char to the int number :'9' = 9
	static int CharToNumber(char c);

	// function 11: make int to the model char : 7 = '7'
	static string IntToChar(int i);

	// function 12: check whether the string is legal 
	static bool Check_all_number(string a);

	// function 13: compare string a and b
	// input: 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值