ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

大整数开方

2020-12-12 12:04:37  阅读:205  来源: 互联网

标签:node 10 include return int register 整数 开方


题目

大整数开方,求整数部分,\(1 \le n \le 10^{400}\)

分析

二分即可
然后是高精基操

\(Code\)

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;

char s[10005];
struct node{
	int m[10005];
	void clear(){memset(m, 0, sizeof m);}
}A, L, R, M, ans, I;

node Plus(node a, node b)
{
	node c; c.clear();
	c.m[0] = max(a.m[0], b.m[0]);
	int g = 0;
	for(register int i = 1; i <= c.m[0]; i++)
	{
		c.m[i] = a.m[i] + b.m[i] + g;
		g = c.m[i] / 10, c.m[i] %= 10;
	}
	if (g) c.m[++c.m[0]] = g;
	return c;
}

node Sub(node a)
{
	--a.m[1];
	int i = 1;
	while (i <= a.m[0] && a.m[i] < 0) a.m[i] += 10 , a.m[++i] -= 1;
	if (a.m[a.m[0]] == 0) --a.m[0];
	return a;
}

node Mul(node a, node b)
{
	node c; c.clear();
	for(register int i = 1; i <= a.m[0]; i++)
	{
		int g = 0;
		for(register int j = 1; j <= b.m[0]; j++)
		{
			c.m[i + j - 1] += a.m[i] * b.m[j] + g;
			g = c.m[i + j - 1] / 10;
			c.m[i + j - 1] %= 10;
		}
		c.m[i + b.m[0]] += g;
	}
	c.m[0] = a.m[0] + b.m[0];
	while (c.m[c.m[0]] == 0 && c.m[0] > 1) c.m[0]--;
	return c;
}

node Div(node a)
{
	node c; c.clear();
	int g = 0;
	if (a.m[a.m[0]] > 1) c.m[0] = a.m[0];
	else c.m[0] = a.m[0] - 1, g = a.m[a.m[0]] * 10;
	for(register int i = c.m[0]; i; i--)
	{
		c.m[i] = (g + a.m[i]) / 2;
		g = (g + a.m[i]) & 1, g *= 10;
	}
	return c;
}

int check(node a, node b)
{
	if (a.m[0] < b.m[0]) return 1;
	if (a.m[0] > b.m[0]) return 0;
	for(register int i = a.m[0]; i; i--)
	if (a.m[i] < b.m[i]) return 1;
	else if (a.m[i] > b.m[i]) return 0;
	return 1;
}

int main()
{
	scanf("%s", s + 1);
	A.m[0] = strlen(s + 1);
	for(register int i = 1; i <= A.m[0]; i++) A.m[i] = s[A.m[0] - i + 1] - '0';
	I.m[I.m[0] = 1] = 1, L = I, R = A;
	while (check(L, R))
	{
		M = Div(Plus(L, R));
		if (check(Mul(M, M), A)) ans = M, L = Plus(M, I);
		else R = Sub(M);
	}
	for(register int i = ans.m[0]; i; i--) printf("%d", ans.m[i]);
}

标签:node,10,include,return,int,register,整数,开方
来源: https://www.cnblogs.com/leiyuanze/p/14124178.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有