sgu111高精度开方

10 篇文章 0 订阅

题目

111. Very simple problem

time limit per test: 0.25 sec. 
memory limit per test: 4096 KB

You are given natural number X. Find such maximum integer number that it square is not greater than X.

Input

Input file contains number X (1≤X≤101000).

Output

Write answer in output file.

Sample Input

16

Sample Output

4

题解:

高精度开方加压位(压七位)+二分法  PS:直接高精度二分会TLE

压位打法好!!!!!


附上代码

#include <cstdio>
#include <cstring>
#define L 10000000
using namespace std;
struct node
{
	int len;
	long long num[1500];
}st = {0};
char s[1500] = {'\0'};
void init()
{
	scanf("%s", s);
	int l = strlen(s), tens[8] = {0, 1, 10, 100, 1000, 10000, 100000, 1000000};
	st.len = (l - 1) / 7 + 1;
	for (int i = l - 1, j = 1, k = 1; i >= 0; i--, j++)
	{
		if (j == 8) j = 1, k++;
		st.num[k] += tens[j] * (s[i] - '0');
	}
}
void outp(struct node a)
{
	printf("%lld", a.num[a.len]);
	for (int i = a.len - 1; i >= 1; i--)
	{
		if (a.num[i] < 1000000) printf("0");
		if (a.num[i] < 100000) printf("0");
		if (a.num[i] < 10000) printf("0");
		if (a.num[i] < 1000) printf("0");
		if (a.num[i] < 100) printf("0");
		if (a.num[i] < 10) printf("0");
		printf("%lld", a.num[i]);
	}
	printf("\n");
}
bool smaller(struct node a, struct node b)
{
	if (a.len > b.len) return false;
	if (a.len < b.len) return true;
	for (int 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;
}
bool same(struct node a, struct node b)
{
	if (a.len != b.len) return false;
	for (int i = 1; i <= a.len; i++)
		if (a.num[i] != b.num[i])
			return false;
	return true;
}
struct node add(struct node a, struct node b)
{struct node sum = {0};
	sum.len = a.len;
	if (b.len > sum.len) sum.len = b.len;
	for (int i = 1; i <= sum.len; i++) sum.num[i] = a.num[i] + b.num[i];
	for (int i = 1; i <= sum.len; i++)
	{
		sum.num[i + 1] += sum.num[i] / L;
		sum.num[i] %= L;
	}
	if (sum.num[sum.len + 1] > 0) sum.len++;
	while (sum.num[sum.len] == 0) sum.len--;
	if (sum.len < 1) sum.len = 1;
	return sum;
}
struct node ave(struct node a, struct node b)
{struct node sum = {0};
	sum = add(a, b);
	for (int i = sum.len; i >= 1; i--)
	{
		if (i != 1 && sum.num[i] % 2 != 0)
		{
			sum.num[i - 1] += L;
			sum.num[i] --;
		}
		sum.num[i] /= 2;
	}
	while (sum.num[sum.len] == 0) sum.len--;
	if (sum.len < 1) sum.len = 1;
	return sum;
}
struct node cheng(struct node a, struct node b)
{struct node sum = {0};
	sum.len = a.len + b.len - 1;
	for (int i = 1; i <= a.len; i++)
		for (int j = 1; j <= b.len; j++)
			sum.num[i + j - 1] += a.num[i] * b.num[j];
	for (int i = 1; i <= sum.len; i++)
	{
		sum.num[i + 1] += sum.num[i] / L;
		sum.num[i] %= L;
	}
	if (sum.num[sum.len + 1] > 0) sum.len++;
	while (sum.num[sum.len] == 0) sum.len--;
	if (sum.len < 1) sum.len = 1;
	return sum;
}
void work()
{struct node l = {0}, r = st, middle, last;
	l.len = 1;
	while (smaller(l, r))
	{
		middle = ave(l, r);
		if (same(l, middle))
		{
			middle.num[1]++;
			for (int i = 1; middle.num[i] >= L; i++)
			{
				middle.num[i + 1]++;
				middle.num[i] -= L;
			}
		}
		if (same(last, middle)) break;
		struct node ch = cheng(middle, middle);
		if (same(ch, st))
		{
			l = middle;
			break;
		}
		if (smaller(ch, st)) l = middle;
		else r = middle;
		last = middle;
	}
	outp(l);
}
int main()
{
	init();
	if (st.len == 1 && st.num[1] == 0) printf("0\n");
	else work();
	return 0;
}
代码丑陋不要见怪

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值