首页 > 编程语言 >c++高精度求平方根(保留整数)

c++高精度求平方根(保留整数)

时间:2024-09-20 16:52:49浏览次数:3  
标签:return 高精度 int hugeint len num c++ ans 平方根

#include<iostream>
#include<cstring>
using namespace std;
const int SIZE = 200;
struct hugeint {
	int len, num[SIZE];
};
hugeint times(hugeint a, hugeint b) {
	int i, j;
	hugeint ans;
	memset(ans.num, 0, sizeof(ans.num));
	for (i = 1; i <= a.len; i++)
		for (j = 1; j <= b.len; j++)
			ans.num[i + j - 1] += a.num[i] * b.num[j];
	for (i = 1; i <= a.len + b.len; i++) {
		ans.num[i + 1] += ans.num[i] / 10;
		ans.num[i] %= 10;
	}
	if (ans.num[a.len + b.len] > 0)
		ans.len = a.len + b.len;
	else
		ans.len = a.len + b.len - 1;
	return ans;
}
hugeint add(hugeint a, hugeint b) {
	int i;
	hugeint ans;
	memset(ans.num, 0, sizeof(ans.num));
	if (a.len > b.len)
		ans.len = a.len;
	else
		ans.len = b.len;
	for (i = 1; i <= ans.len; i++) {
		ans.num[i] += a.num[i] + b.num[i] ;
		ans.num[i + 1] += ans.num[i] / 10;
		ans.num[i] %= 10;
	}
	if (ans.num[ans.len + 1] > 0)
		ans.len++;
	return ans;
}
hugeint average(hugeint a, hugeint b) {
	int i;
	hugeint ans;
	ans = add(a, b);
	for (i = ans.len; i >= 2; i--) {
		ans.num[i - 1] += (ans.num[i] % 2) * 10;

		ans.num[i] /= 2;
	}
	ans.num[1] /= 2;
	if (ans.num[ans.len] == 0)
		ans.len--;
	return ans;
}
hugeint plustwo(hugeint a) {
	int i;
	hugeint ans;
	ans = a;
	ans.num[1] += 2;
	i = 1;
	while ((i <= ans.len) && (ans.num[i] >= 10)) {
		ans.num[i + 1] += ans.num[i] / 10;
		ans.num[i] %= 10;
		i++;
	}
	if (ans.num[ans.len + 1] > 0)
		ans.len++;
	return ans;
}
bool over(hugeint a, hugeint b) {
	int i;
	if (a.len < b.len)
		return false;
	if ( a.len > b.len )
		return true;
	for (i = a.len; i >= 1; i--) {
		if (a.num[i] < b.num[i])
			return false;
		if (a.num[i] > b.num[i])
			return true;
	}
	return false;
}
int main() {
	string s;
	int i;
	hugeint target, left, middle, right;
	cin >> s;
	memset(target.num, 0, sizeof(target.num));
	target.len = s.length();
	for (i = 1; i <= target.len; i++)
		target.num[i] = s[target.len - i] - '0';
	memset(left.num, 0, sizeof(left.num));
	left.len = 1;
	left.num[1] = 1;
	right = target;
	do {
		middle = average(left, right);
		if (over(times(middle, middle), target))
			right = middle;
		else
			left = middle;
	} while (!over(plustwo(left), right) );
	for (i = left.len; i >= 1; i--)
		cout << left.num[i];
	return 0;
}

标签:return,高精度,int,hugeint,len,num,c++,ans,平方根
From: https://blog.csdn.net/xhbqy/article/details/142390090

相关文章

  • 使用swig映射c++function
    swig可以自动生成从c++到其他语言如Java、Python等转换的中间语言,目前swig已经支持很多c++11的特性了,但是这次项目中发现function特性还没有支持,只能自己生成。从网上找了一份Java的java-HowtouseSWIGtowrapstd::functionobjects?-StackOverflow,我需要的c#的,故需要稍......
  • C++ | 多态
     前言本篇博客讲解c++中的继承......
  • 【C++二叉树】105.从前序与中序遍历序列构造二叉树
    105.从前序与中序遍历序列构造二叉树-力扣(LeetCode)根据前序遍历和中序遍历构建二叉树前序遍历访问方式:根-左子树-右子树中序遍历访问方式:左子树-根-右子树思路分析:前序+中序可以构建一颗二叉树:前序遍历可以确定根,中序遍历可以确定左子树的中序区间和右子树的中序区......
  • C++异常
    1.C语言传统的处理错误的方式传统的错误处理机制:1.终止程序,如assert,缺陷:用户难以接受。如发生内存错误,除0错误时就会终止程序。2.返回错误码,缺陷:需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误实际中C语言基本都是使用......
  • C++11
    1.C++11简介在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。......
  • C++模版
    文章目录一、函数模版1、模版的语法2、多个模版类型参数3、模版的实力化二、类模版1、using2、类模版解决问题一、函数模版1、模版的语法模版的关键字为template,后面跟<>尖括号,尖括号里面填类型,类型前面跟一个关键字typename,也可以用class模版生成的函数就......
  • C++类与对象(三)
    目录1.再谈构造函数1.1构造函数体赋值1.2初始化列表1.3explicit关键字2.STATIC成员2.1概念2.2特性3.C++中成员初始化的新玩法4.友元4.1友元函数4.2友元类5.内部类6.再次理解封装7.再次理解面向对象本次内容大纲:1.再谈构造函数1.1构造函数体赋值在......
  • C++扫盲--直接构造(Direct Initialization)
      在C++中,直接构造(DirectInitialization)是由一种对象构造的方式,它直接调用类的构造函数来初始化对象。这种方式通常用于创建对象时立即提供必要的参数。直接构造的语法如下:ClassNameobjectName(arguments);其中,ClassName是类的名称,objectName是要创建的对象的名称,argument......
  • C++20 模块化(Modules)
    C++20引入的模块化(Modules)是一个重大改进,旨在取代传统的头文件机制,提高编译速度、代码可维护性以及项目的可扩展性。模块化为C++提供了一种更现代化的代码组织方式,避免了头文件中常见的宏污染、重复编译和复杂的依赖管理问题。概念与背景在C++20之前,C++项目是通过头文......
  • VS(visual studio) C++ 封装dll,以及其隐式调用与显式调用(静态\动态)
    DLL介绍DLL(动态链接库,DynamicLinkLibrary)是一种可执行文件,它包含可以在其他程序中调用的函数和数据。他是Windows操作系统中的一个重要概念,用于代码共享和模块化。特点代码共享:多个程序可以同时使用同一个DLL文件,而不需要将其代码编译到每个程序中。这样可以节省磁盘空间和......