首页 > 试题广场 >

(大整数开方) 输入一个正整数n(1≤n≤10100),试

[填空题]
(大整数开方)  输入一个正整数n(1≤n≤10100),试用二分法计算它的平方根的整数部分。

#include<iostream>
#include<string>
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;
}

这道题你会答吗?花几分钟告诉大家答案吧!