历年noip普与组(c)完善程序题总结归纳
NOIP普和组复赛试题c版本

{
if(d[i+l1][j+l2]!=-1)
d[i+l1][j+l2]++;
}//边上八个位置旳格子不是雷则
数值加1
}
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
if(
d[i][j]==-1) cout<<'*';
else cout<<d[i][j];
cout<<endl;
-5-
参照程序
➢ #include <iostream>
➢ using namespace std;
➢ int main()
➢{
➢
long d[102][102];
➢
long n,m;
➢
cin>>n>>m;
➢
long i,j;
➢
char ch;
➢
for(i=0;i<=n;i++)
➢
{
➢
for(j=0;j<=m;j++)
➢
for(int i=1;i<=n;i++)
➢
{
- 16 -
BYE
温馨提醒: 先了解题目在看题解。
试题分析
The END
2017. 07. 28
➢ 请计算前K天里,骑士一共取得了多少金币。 ➢ 对于全部数据,1≤K≤10000。
➢ 【分析】K旳规模比较少,直接用模拟,一天一天发金币。 ➢ N天发N枚金币,N递增1,剩余天数K-N ➢ 估计时间15-25分钟
NOIP普及组历届试题分析

对于100%的数据,3 ≤ n ≤ 100 测验题给出的正整数大小不超过10,000。
试题分析
题意大意:给你n个数,在这n个数中,找 到满足A+B=C的C的个数,注意不是这个 等式的个数。
样例中,1,2,3,4有1+2=3,1+3=4两个。
由于本题数据规模n<=100,我们可以直接
枚举C, A, B,三层循环解决问题。
扫雷游戏 (noip2015普及组第二题)
输入样例 1 33 *?? ??? ?*? 输入样例 2 23 ?*? *??
输出样例 1 mine.out *10 221 1*1 输出样例 2 mine.out 2*1 *21
对于 100%的数据,1≤n≤100,1≤m≤100
问题分析:
本题也是简单的枚举类试题。 我们从雷区的第一行第一列(1,1)开始,判断它周围 有多少个地雷。 由于本题读入的是字符,读入时需要注意: readln(n,m); for i=1 to n do begin for j=1 to m do read(a[i][j]); readln; end;
比例简化 (noip2014普及组第二题)
在社交媒体上,经常会看到针对某一个观点同意与 否的民意调查以及结果。例如,对某 一观点表示 支持的有 1498 人,反对的有 902 人,那么赞同与 反对的比例可以简单的记为1498:902。 不过,如果把调查结果就以这种方式呈现出来,大 多数人肯定不会满意。因为这个比例的数值太大, 难以一眼看出它们的关系。对于上面这个例子,如 果把比例记为 5:3,虽然与 真实结果有一定的误差, 但依然能够较为准确地反映调查结果,同时也显得 比较直观。 现给出支持人数 A,反对人数 B,以及一个上限 L, 请你将 A 比 B 化简为 A’比 B’,要求在 A’和 B’均 不大于 L 且 A’和 B’互质(两个整数的最大公约数 是 1)的前提下,A’/B’ ≥ A/B 且 A’/B’ - A/B 的值 尽可能小。
信息学奥赛NOIP普和组历届试题分析报告

采药 (noip2005普及组第三题)
辰辰是个天资聪颖的孩子,他的梦想是成为世 界上最伟大的医师。为此,他想拜附近最有威 望的医师为师。医师为了判断他的资质,给他 出了一个难题。医师把他带到一个到处都是草 药的山洞里对他说:“孩子,这个山洞里有一 些不同的草药,采每一株都需要一些时间,每 一株也有它自身的价值。我会给你一段时间, 在这段时间里,你可以采到一些草药。如果你 是一个聪明的孩子,你应该可以让采到的草药 的总价值最大。”
试计算在区间1到n的所有整数中,数字x(0≤x≤9) 共出现了多少次? 例如,在1到11中,即在1、2、3、4、5、6、7、8、 9、10、11中,数字1出现了4次。
输入:
输入共1行,包含2个整数n、x,之间用一个空格隔 开。 输出:
输出共1行,包含一个整数,表示x出现的次数。 输入示例: 11 1 输出示例: 4 其他说明:
输入 输入共1行,一个整数N。
输出 输出共1行,一个整数,表示反转后的新数。
样例输入
123 样例输出
321
统计单词个数 (noip2011普及组第二题)
一般的文本编辑器都有查找单词的功能,该功 能可以快速定位特定单词在文章中的位置,有 的还能统计出特定单词在文章中出现的次数。 现在,请你编程实现这一功能,具体要求 是:给定一个单词,请你输出它在给定的文章 中出现的次数和第一次出现的位置。注意:匹 配单词时,不区分大小写,但要求完全匹配, 即给定单词必须与文章中的某一独立单词在不 区分大小写的情况下完全相同(参见样例1), 如果给定单词仅是文章中某一单词的一部分则 不算匹配(参见样例2)。
对于100%的数据,3 ≤ n ≤ 100 测验题给出的正整数大小不超过10,000。
历年noip普及组(c++)完善程序题总结归纳

完善程序题总结归纳By:七(6) yx一、【题目】(哥德巴赫猜想)哥德巴赫猜想是指,任一大于2的偶数都可写成两个质数之和。
迄今为止,这仍然是一个著名的世界难题,被誉为数学王冠上的明珠。
试编写程序,验证任一大于2且不超过n的偶数都能写成两个质数之和。
#include<iostream>using namespace std;int main(){const int SIZE=1000;int n,r,p[SIZE],i,j,k,ans;bool tmp;cin>>n;r=1;p[1]=2;for(i=3;i<=n;i++){①;for(j=1;j<=r;j++)if(i% ②==0){tmp=false;break;}if(tmp){r++;③;}}ans=0;for(i=2;i<=n/2;i++){tmp=false;for(j=1;j<=r;j++)for(k=j;k<=r;k++)if(i+i== ④ ){tmp=true;break;}if(tmp)ans++;}cout<<ans<<endl;return 0;}若输入n为2010,则输出⑤时表示验证成功,即大于2且不超过2010的偶数都满足哥德巴赫猜想。
【算法】先for一遍,找出质数,然后对每一个偶数进行一一匹配(2除外),效率O(n^3)【代码】1、tmp=1;2、p[j];3、p[r]=j;4、p[j]+p[k]5、1004【年份】2010年二、【题目】(过河问题) 在一个月黑风高的夜晚,有一群人在河的右岸,想通过唯一的一根独木桥走到河的左岸.在伸手不见五指的黑夜里,过桥时必须借照灯光来照明,不幸的是,他们只有一盏灯.另外,独木桥上最多能承受两个人同时经过,否则将会坍塌.每个人单独过独木桥都需要一定的时间,不同的人要的时间可能不同.两个人一起过独木桥时,由于只有一盏灯,所以需要的时间是较慢的那个人单独过桥所花费的时间.现在输入N(2<=N<1000)和这N个人单独过桥需要的时间,请计算总共最少需要多少时间,他们才能全部到达河左岸.例如,有3个人甲、乙、丙,他们单独过桥的时间分别为1、2、4,则总共最少需要的时间为7.具体方法是:甲、乙一起过桥到河的左岸,甲单独回到河的右岸将灯带回,然后甲、丙在一起过桥到河的左岸,总时间为2+1+4=7.#include<iostream>#include<cstring>using namespace std;const int size=100;const int infinity = 10000;const bool left=1;const bool right =0;const bool left_to_right=1;const bool right_to_left=0;int n,hour[size];bool pos[size];int max(int a,int b){return a>b?a:b;}int go(bool stage){int i,j,num,tmp,ans;if(stage==right_to_left){num=0;ans=0;for(i=1;i<=n;i++)if(pos[i]==right){num++;if( hour[i]>ans)ans=hour[i];}if( ① )return ans;ans=infinity;for(i=1;i<=n-1;i++)if(pos[i]==right)for(j=i+1;j<=n;j++)if(pos[j]==right){pos[i]=left;pos[j]=left;tmp=max(hour[i],hour[j])+ ②; if(tmp<ans)ans=tmp;pos[i]=right;pos[j]=right;}return ans;}if(stage==left_to_right){ans=infinity;for(i=1;i<=n;i++)if( ③ ){pos[i]=right;tmp= ④ ;if(tmp<ans)ans=tmp;⑤;}return ans;}return 0;}int main(){int i;cin>>n;for(i=1;i<=n;i++){cin>>hour[i];pos[i]=right;}cout<<go[right_to_left)<<endl;return 0;}【算法】利用深搜,左右交替寻找最优解(maybe是动态规划)【代码】1、num<=2;2、go[1];3、pos[j]==1;4、hour[i]+go[0];5、pos[i]=1;【年份】2010年三、【题目】(子矩阵)给输入一个n1*m1的矩阵a,和n2*m2的矩阵b,问a中是否存在子矩阵和b相等。
NOIP初赛普及组C题目及答案

第十九届全国青少年信息学奥林匹克联赛初赛普及组C++语言试题竞赛时间: 2013 年 10 月 13 日 14:30~16:30选手注意:试题纸共有9 页,答题纸共有 2 页,满分 100 分。
请在答题纸上作答,写在试题纸上的一律无效。
不得使用任何电子设备(如计算器、手机、电子词典等)或查阅任何书籍资料。
一、单项选择题(共20 题,每题 1.5 分,共计 30 分;每题有且仅有一个正确选项)1. 一个 32 位整型变量占用()个字节。
A. 4B. 8C. 32D. 1282. 二进制数 11.01 在十进制下是()。
A. 3.25B. 4.125C. 6.25D. 11.1253. 下面的故事与()算法有着异曲同工之妙。
从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事:从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事:‘从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事....’A. 枚举B. 递归C. 贪心D. 分治4. 逻辑表达式()的值与变量A 的真假无关。
A. (A ∨ B) ∧﹃AB. (A ∨ B) ∧﹃BC. (A ∧ B) ∨ (﹃ A ∧ B)D. (A ∨ B) ∧﹃A ∧ B5. 将( 2, 6, 10, 17)分别存储到某个地址区间为0~10 的哈希表中,如果哈希函数h(x) = (),将不会产生冲突,其中a mod b 表示 a 除以 b 的余数。
A. x mod 11B. x2 mod 11C. 2x mod 11D. |√2| mod 11 ,其中√X表示√X下取整6. 在十六进制表示法中,字母 A 相当于十进制中的()。
A. 9B. 10C. 15D. 167. 下图中所使用的数据结构是()。
A. 哈希表B. 栈C. 队列D. 二叉树8. 在 Windows 资源管理器中,用鼠标右键单击一个文件时,会出现一个名为“复制”的操作选项,它的意思是()。
A. 用剪切板中的文件替换该文件B. 在该文件所在文件夹中,将该文件克隆一份C. 将该文件复制到剪切板,并保留原文件D. 将该文件复制到剪切板,并删除原文件9. 已知一棵二叉树有10 个节点,则其中至多有()个节点有 2 个子节点。
NOIP2006普及组C 题目及答案

第十二届全国青少年信息学奥林匹克联赛初赛试题 2006(普及组C++ 语言二小时完成)●●全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●●一、单项选择题(共20题,每题1.5分,共计30分。
每题有且仅有一个正确答案.)1. 在下面各世界顶级的奖项中,为计算机科学与技术领域做出杰出贡献的科学家设立的奖项是()。
A. 沃尔夫奖B. 诺贝尔奖C. 菲尔兹奖D. 图灵奖2. 在下列各软件中,不属于NOIP竞赛(复赛)推荐使用的语言环境有()。
A. gcc/g++B. Turbo PascalC. RHIDED. free pascal3. 以下断电之后仍能保存数据的有()。
A. 寄存器B. ROMC. RAMD. 高速缓存4.Linux是一种( )。
A. 绘图软件B. 程序设计语言C. 操作系统D. 网络浏览器5. CPU是( )的简称。
A. 硬盘B. 中央处理器C. 高级程序语言D. 核心寄存器6. 在计算机中,防火墙的作用是()。
A. 防止火灾蔓延B.防止网络攻击C. 防止计算机死机D. 防止使用者误删除数据7. 在下列关于计算机语言的说法中,不正确的是()。
A. Pascal和C都是编译执行的高级语言B. 高级语言程序比汇编语言程序更容易从一种计算机移植到另一种计算机上C. C++是历史上的第一个支持面向对象的计算机语言D. 与汇编语言相比,高级语言程序更容易阅读8. 在下列关于计算机算法的说法中,不正确的是()。
A. 一个正确的算法至少要有一个输入B. 算法的改进,在很大程度上推动了计算机科学与技术的进步C. 判断一个算法的好坏的主要标准是算法的时间复杂性与空间复杂性D. 目前仍然存在许多涉及到国计民生的重大课题,还没有找到能够在计算机上实施的有效算法9. 在下列各种排序算法中,不是以“比较”作为主要操作的算法是()。
A. 选择排序B. 冒泡排序C. 插入排序D. 基数排序10.在编程时(使用任一种高级语言,不一定是C++),如果需要从磁盘文件中输入一个很大的二维数组(例如1000*1000的double型数组),按行读(即外层循环是关于行的)与按列读(即外层循环是关于列的)相比,在输入效率上()。
NOIP2006普及组C题目及答案

第十二届全国青青年信息学奥林匹克联赛初赛试题2006(普及组C++ 语言二小时完成)●●全数试题答案均要求写在答卷纸上,写在试卷纸上一概无效●●一、单项选择题(共20题,每题分,共计30分。
每题有且仅有一个正确答案.)1. 在下面各世界顶级的奖项中,为运算机科学与技术领域做出杰出奉献的科学家设立的奖项是()。
A. 沃尔夫奖B. 诺贝尔奖C. 菲尔兹奖D. 图灵奖2. 在以下各软件中,不属于NOIP竞赛(复赛)推荐利用的语言环境有()。
A. gcc/g++B. Turbo PascalC. RHIDED. free pascal3. 以下断电以后仍能保留数据的有()。
A. 寄放器B. ROMC. RAMD. 高速缓存4.Linux是一种( )。
A. 画图软件B. 程序设计语言C. 操作系统D. 网络阅读器5. CPU是( )的简称。
A. 硬盘B. 中央处置器C. 高级程序语言D. 核心寄放器6. 在运算机中,防火墙的作用是()。
A. 幸免火灾蔓延B.幸免网络解决C. 幸免运算机死机D. 幸免利用者误删除数据7. 在以下关于运算机语言的说法中,不正确的选项是()。
A. Pascal和C都是编译执行的高级语言B. 高级语言程序比汇编语言程序更易从一种运算机移植到另一种运算机上C. C++是历史上的第一个支持面向对象的运算机语言D. 与汇编语言相较,高级语言程序更易阅读8. 在以下关于运算机算法的说法中,不正确的选项是()。
A. 一个正确的算法至少要有一个输入B. 算法的改良,在专门大程度上推动了运算机科学与技术的进步C. 判定一个算法的好坏的要紧标准是算法的时刻复杂性与空间复杂性D. 目前仍然存在许多涉及到国计民生的重大课题,尚未找到能够在运算机上实施的有效算法9. 在以下各类排序算法中,不是以“比较”作为要紧操作的算法是()。
A. 选择排序B. 冒泡排序C. 插入排序D. 基数排序10.在编程时(利用任一种高级语言,没必要然是C++),假设是需要从磁盘文件中输入一个专门大的二维数组(例如1000*1000的double型数组),按行读(即外层循环是关于行的)与按列读(即外层循环是关于列的)相较,在输入效率上()。
NOIP普及组C题目及答案

第十届全国青少年信息学奥林匹克联赛初赛试题2005(普及组C 语言二小时完成)• •全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效•• 一.选择一个正确答案代码( A/B/C/D/E ),填入每题的括号内(每题1.5分,共30分)1. 在字符串"ababacbabcbdecced ”中出现次数最多的字母出现了()次。
A.6B.5C.4D.3E.2 2. 设全集 l={a,b,c,d,e,f,g,h} ()。
A.{c,e}B.{d,e}C.{e}D.{c,d,e}E.{d,f} 3. 和十进制数23的值相等的二进制数是()。
A.10110B.11011C.11011D.10111E.10011 4. 完全二叉树的结点个数为11,则它的叶结点个数为()。
A.4B.3C.5D.2E.6 5. 平面上有五个点A (5,3),B (3,5),C (2,1),D (3,3),E (5,1)。
以这五点作为完全图 G 的顶点,每两点之间的 直线距离是图G 中对应边的权值。
以下哪条边不是图 G 的最小生成树中的边()。
A.AD6.Intel 的首颗16位处理器是()。
A.80887. 处理器A 每秒处理的指令数是处理器 B 的2倍。
某一特定程序 P 分别编译为处理器 A 和处理器B 的指令,编 译结果处理器A 的指令数是处理器B 的 4倍。
已知程序P 在处理器A 上执行需要1个小时,那么在输入相同的 情况下,程序P 在处理器B 上执行需要()小时。
A.4B.2C.1D.1/2E.1/4 8.以下哪个不是计算机的输出设备()。
A.音箱 B.显示器 C.打印机 D.扫描仪 E.绘图仪 9. 下列活动中不属于信息学奥赛的系列活动的是()。
A.NOIPB.NOIC.IOID.冬令营E.程序员等级考试 10. 以下断电之后仍能保存数据的是()。
A.硬盘B.寄存器C.显存D.内存E.高速缓存 11. 以下哪个软件不是即时通信软件()。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
完善程序题总结归纳By:七(6)yx一、【题目】(哥德巴赫猜想)哥德巴赫猜想是指,任一大于2的偶数都可写成两个质数之和。
迄今为止,这仍然是一个著名的世界难题,被誉为数学王冠上的明珠。
试编写程序,验证任一大于2且不超过n的偶数都能写成两个质数之和。
#include<iostream>using namespace std;int main(){const int SIZE=1000;int n,r,p[SIZE],i,j,k,ans;bool tmp;cin>>n;r=1;p[1]=2;for(i=3;i<=n;i++){①;for(j=1;j<=r;j++)if(i% ②==0){tmp=false;break;}if(tmp){r++;③;}}ans=0;for(i=2;i<=n/2;i++){tmp=false;for(j=1;j<=r;j++)for(k=j;k<=r;k++)if(i+i== ④){tmp=true;break;}if(tmp)ans++;}cout<<ans<<endl;return 0;}若输入n为2010,则输出⑤时表示验证成功,即大于2且不超过2010的偶数都满足哥德巴赫猜想。
【算法】先for一遍,找出质数,然后对每一个偶数进行一一匹配(2除外),效率O(n^3)【代码】1、tmp=1;2、p[j];3、p[r]=j;4、p[j]+p[k]5、1004 【年份】2010年二、【题目】(过河问题) 在一个月黑风高的夜晚,有一群人在河的右岸,想通过唯一的一根独木桥走到河的左岸.在伸手不见五指的黑夜里,过桥时必须借照灯光来照明,不幸的是,他们只有一盏灯.另外,独木桥上最多能承受两个人同时经过,否则将会坍塌.每个人单独过独木桥都需要一定的时间,不同的人要的时间可能不同.两个人一起过独木桥时,由于只有一盏灯,所以需要的时间是较慢的那个人单独过桥所花费的时间.现在输入N(2<=N<1000)和这N个人单独过桥需要的时间,请计算总共最少需要多少时间,他们才能全部到达河左岸.例如,有3个人甲、乙、丙,他们单独过桥的时间分别为1、2、4,则总共最少需要的时间为7.具体方法是:甲、乙一起过桥到河的左岸,甲单独回到河的右岸将灯带回,然后甲、丙在一起过桥到河的左岸,总时间为2+1+4=7.#include<iostream>#include<cstring>using namespace std;const int size=100;const int infinity = 10000;const bool left=1;const bool right =0;const bool left_to_right=1;const bool right_to_left=0;int n,hour[size];bool pos[size];int max(int a,int b){return a>b?a:b;}int go(bool stage){int i,j,num,tmp,ans;if(stage==right_to_left){num=0;ans=0;for(i=1;i<=n;i++)if(pos[i]==right){num++;if( hour[i]>ans)ans=hour[i];}if( ①)return ans;ans=infinity;for(i=1;i<=n-1;i++)if(pos[i]==right)for(j=i+1;j<=n;j++)if(pos[j]==right){pos[i]=left;pos[j]=left;tmp=max(hour[i],hour[j])+ ②;if(tmp<ans)ans=tmp;pos[i]=right;pos[j]=right;}return ans;}if(stage==left_to_right){ans=infinity;for(i=1;i<=n;i++)if( ③){pos[i]=right;tmp= ④;if(tmp<ans)ans=tmp;⑤;}return ans;}return 0;}int main(){int i;cin>>n;for(i=1;i<=n;i++){cin>>hour[i];pos[i]=right;}cout<<go[right_to_left)<<endl;return 0;}【算法】利用深搜,左右交替寻找最优解(maybe是动态规划)【代码】1、num<=2;2、go[1];3、pos[j]==1;4、hour[i]+go[0];5、pos[i]=1;【年份】2010年三、【题目】(子矩阵)给输入一个n1*m1的矩阵a,和n2*m2的矩阵b,问a中是否存在子矩阵和b相等。
若存在,输出所有子矩阵左上角的坐标:若不存在输出“There isno answer”。
#include<iostream>using namespace std;const int SIZE = 50;int n1,m1,n2,m2,a[SIZE][SIZE],b[SIZE][SIZE];int main(){int i,j,k1,k2;bool good,haveAns;cin>>n1>>m1;for(i=1;i<=n1;i++)for(j=1;j<=m1;j++)cin>>a[i][j];cin>>n2>>m2;for(i=1;i<=n2;i++)for(j=1;j<=m2;j++)①;haveAns=false;for(i=1;i<=n1-n2+1;i++)for(j=1;j<=②;j++){③;for(k1=1;k1<=n2;k1++)for(k2=1;k2<=④;k2++){if(a[i+k1-1][j+k2-1]!=b[k1][k2])good=false;}if(good){cout<<i<<' '<<j<<endl;⑤;}}if(!haveAns)cout<<"There is no answer"<<endl;return 0;}【算法】枚举每一条对角线,进行判断。
【代码】1、cin>>b[i][j];2、m1-m2+1;3、good=1;4、m2;5、haveAns=1;【年份】2011年四、【题目】(大整数开方)输入一个正整数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++)①+=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;elseans.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;elseans.len=b.len;for(i=1;i<=ans.len;i++){ans.num[i]+= ③;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]+=( ④)*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)⑤;return ans;}bool over(hugeint a,hugeint b)// 若大整数a>b则返回true,否则返回false {int i;if( ⑥)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]- ⑦;memset(left.num,0,sizeof(left.num));left.len=1;left.num[1]=1;right=target;do{middle=average(left,right);if(over( ⑧))right=middle;elseleft=middle;}while(!over(plustwo(left),right) );for(i=left.len;i>=1;i--)cout<<left.num[i];return 0;}【算法】每二分一次,就判断一下答案在哪个区间,然后在那个区间继续二分,避免不必要的计算。