NOIP 普及组初赛 · NOIP 2011 普及组初赛试题 第 28 题

完善程序 · 答案 ans.num[i+j-1]ans.num[i]%=10a.num[i]+b.num[i]ans.num[i] % 2ans.len++a.len<b.len'0'48times(middle,middle),target · 考点:输入输出、位运算、分支结构、循环结构、字符串(string)、结构体(struct)、STL容器基础、高精度计算

← 整套速查表 NOIP 普及组初赛 全部真题

题目

完善程序 (大整数开方) 输入一个正整数 $n(1\leq n\leq 10^{100})$,试用二分法计算它的平方根的整数部分。

#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++)
            [      ①     ] +=a.num[i]*b.num[j];  
    for(i=1;i<=a.len+b.len;i++){
        ans.num[i+1]+=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)
//计算大整数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<=a

(本题为阅读程序 / 完善程序,完整题目与测试数据见平台)
答案:ans.num[i+j-1]ans.num[i]%=10a.num[i]+b.num[i]ans.num[i] % 2ans.len++a.len<b.len'0'48times(middle,middle),target

考点

输入输出位运算 讲解 →位运算 真题汇总 →分支结构循环结构字符串(string)结构体(struct)STL容器基础 讲解 →STL容器基础 真题汇总 →高精度计算 讲解 →高精度计算 真题汇总 →

解题思维

大数乘法下标为 i+j-1;字符串转数字需减'0';二分判定 mid*mid 与 target 大小。

常见错误

乘法下标易错写成 i+j;字符串转数字忘记减'0';二分更新区间时 over 判断写反。

详细解析(节选)

考点:大整数乘法|字符串转数字|二分查找

程序在做什么

输入字符串转大整数数组,用二分法求平方根整数部分,需完善大数乘、加、比及区间更新逻辑。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断