问题 3762 --大整数开方(完善程序)

3762: 大整数开方(完善程序)★★★

时间限制: 1 Sec  内存限制: 128 MB
提交: 162  解决: 113
[提交][状态][命题人:]

题目描述

输入一个正整数n,(1<=n<10^100),试用二分法计算它的平方根的整数部分

#include <bits/stdc++.h>
using namespace std;
 const int SIZE = 200;
struct hugeint
{
    int len, num[SIZE];
};
//其中len表示大数的位数
//num[1]表示个位,num[2]表示十位,以此类推 

hugeint times(hugeint a, hugeint b)
{
	//计算大整数a和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++)
            _____(1)______ += a.num[i] * b.num[j];
    for (i = 1; i <= a.len + b.len; i++)
    {
        ans.num[i + 1] += ans.num[i] / 10;
        ______(2)_______
    }
    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)
{
	//计算大整数a和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] += _____(3)________;
        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)
{
	//计算大整数a和b的平均数的整数部分 
    int i;
    hugeint ans;
    ans = add(a, b);
    for (i = ans.len; i >= 2; i--)
    {
        ans.num[i - 1] += (_____(4)_____) * 10;
        ans.num[i] /= 2;
    }
    ans.num[1] /= 2;
    if (ans.num[ans.len] == 0)
        ans.len--;
    return ans;
}
 
hugeint plustwo(hugeint a)
{
	//计算大整数a加2之后的结果 
    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)
        ______(5)_________ 
    return ans;
}
 
bool over(hugeint a, hugeint b)
{
	//若大整数a>b则返回true,否则返回false 
    int i;
    if (______(6)_______)
        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] - _____(7)_____;
    }
    memset(left.num, 0, sizeof(left.num));
    left.len = 1;
    left.num[1] = 1;
    right = target;
    do
    {
        middle = average(left, right);
        if (over(_____(8)_______)
            right = middle;
        else
            left = middle;
    } while (!over(plustwo(left), right));
    for (i = left.len; i >= 1; i--)
    {
        cout << left.num[i];
    }
    return 0;
}

输入

输出

提示

只需输出答案即可,一共8行,每行一个大写字母

来源

[提交][状态]