`
xitong
  • 浏览: 6401822 次
文章分类
社区版块
存档分类
最新评论

大数乘法--蓝桥杯

 
阅读更多

简述

这是2012年蓝桥杯全国软件大赛预赛(C++本科组)第6题,有图片可知是个简单的大数计算的问题。

推荐链接:《2012蓝桥杯软件大赛预赛题目汇总》

题目描述

对于32位字长的机器,大约超过20亿,用int类型就无法表示了,我们可以选择int64类型,但无论怎样扩展,固定的整数类型总是有表达的极限!如果对超级大整数进行精确运算呢?一个简单的办法是:仅仅使用现有类型,但是把大整数的运算化解为若干小整数的运算,即所谓:“分块法”。
如图【1.jpg】表示了分块乘法的原理。可以把大数分成多段(此处为2段)小数,然后用小数的多次运算组合表示一个大数。可以根据int的承载能力规定小块的大小,比如要把int分成2段,则小块可取10000为上限值。注意,小块在进行纵向累加后,需要进行进位校正。
大数乘法原理图
以下代码示意了分块乘法的原理(乘数、被乘数都分为2段)。

void bigmul(int x, int y, int r[])
{
	int base = 10000;
	int x2 = x / base;
	int x1 = x % base; 
	int y2 = y / base;
	int y1 = y % base; 

	int n1 = x1 * y1; 
	int n2 = x1 * y2;
	int n3 = x2 * y1;
	int n4 = x2 * y2;

	r[3] = n1 % base;
	r[2] = n1 / base + n2 % base + n3 % base;
	r[1] = ____________________________________________; // 填空
	r[0] = n4 / base;
	
	r[1] += _______________________;  // 填空
	r[2] = r[2] % base;
	r[0] += r[1] / base;
	r[1] = r[1] % base;
}


int main(int argc, char* argv[])
{
	int x[] = {0,0,0,0};

	bigmul(87654321, 12345678, x);

	printf("%d%d%d%d\n", x[0],x[1],x[2],x[3]);

	return 0;
}

请分析代码逻辑,并推测划线处的代码。
答案写在 “解答.txt” 文件中
注意:只写划线处应该填的内容,划线前后的内容不要抄写。

分析

这也许是预赛10个题里最简单的一个题,简单的说就是十进制数的进位问题。

源代码

# include <stdio.h>
void bigmul(int x, int y, int r[])
{
	int base = 10000;
	int x2 = x / base;
	int x1 = x % base; 
	int y2 = y / base;
	int y1 = y % base; 

	int n1 = x1 * y1; 
	int n2 = x1 * y2;
	int n3 = x2 * y1;
	int n4 = x2 * y2;

	r[3] = n1 % base;
	r[2] = n1 / base + n2 % base + n3 % base;
	r[1] = n2 / base + n3 / base + n4 % base; // 填空
	r[0] = n4 / base;
	
	r[1] += r[2] / base;  // 填空
	r[2] = r[2] % base;
	r[0] += r[1] / base;
	r[1] = r[1] % base;
}


int main(int argc, char* argv[])
{
	int x[] = {0,0,0,0};

	bigmul(87654321, 12345678, x);

	printf("%d%d%d%d\n", x[0],x[1],x[2],x[3]);

	return 0;
}

最后答案

n2 / base + n3 / base + n4 % base
r[2] / base
分享到:
评论

相关推荐

    蓝桥杯练习题

    - 分治策略:快速选择、大数乘法、归并排序等。 4. **字符串处理**: - KMP算法:快速查找子串在主串中的位置。 - Rabin-Karp算法:基于哈希的字符串匹配。 - 字符串的模式匹配问题,如Boyer-Moore算法。 5. *...

    lanqiaobei.rar_lanqiaobei_蓝桥杯java

    1. **大数乘法**:这是计算理论的基础部分,涉及到如何高效地处理超出常规整型范围的大数值运算。在Java中,可以使用`BigInteger`类来处理大数乘法,它提供了各种大数运算的方法。理解大数乘法算法,如Karatsuba算法...

    蓝桥杯练习题库3算法训练之VIP题

    - 类似于高精度乘法,使用数组来模拟大数的存储和计算。 - 逐位进行加法运算,并处理进位。 **知识点2:实现步骤** 1. **初始化:** 创建两个数组 A 和 B 分别用来存储两个输入的大数 a 和 b。 2. **对齐处理:**...

    蓝桥杯特训视频经典案例

    1_1罗马数字逆向解法 .mp4 1_2罗马数字逆向解法 .mp4 ...6_3大数乘法1.mp4 6_3大数乘法2.mp4 6_4动态1.mp4 6_4动态2.mp4 7_1连通性.mp4 7_2迷宫问题1.mp4 7_2迷宫问题2.mp4 7_3分酒问题1.mp4 7_3分酒问题2.mp4

    蓝桥杯部分真题及解答.pdf

    - 最短路、矩阵乘法、字符串统计、Anagrams问题等:要求熟悉图论、动态规划、字符串处理等更高级的算法。 3. 算法训练:这部分包含更为复杂的算法题目,需要参赛者深入掌握算法设计和优化方法。例如: - 区间k...

    第十五届蓝桥杯Java A组参赛总结

    ### 第十五届蓝桥杯Java A组参赛总结 #### 知识点一:比赛规则与流程 - **考试流程**:参赛者需首先下载题目,使用官方提供的解压密码解压试题包。整个考试时长为4小时。 - **提交方式**: - 在考试过程中,参赛...

    蓝桥杯学习资料大全-题目参考代码-斐波那契.zip

    在蓝桥杯这类编程竞赛中,可能要求参赛者优化算法,解决特定条件下的斐波那契问题,例如求解大数的斐波那契数、求解第n个斐波那契数的奇偶性、找出序列中的某一项等。 此外,斐波那契序列还与其他数学和计算机科学...

    2012“蓝桥杯”全国软件专业人才设计与创业大赛题目

    - 实现大数乘法。 - 使用分块法将大数运算转换为小数运算。 **解析:** - 分块法的基本思想是将大数分割成多个较小的部分。 - 对这些小部分进行单独的运算,然后将结果合并。 - 在实际编程中,可以通过循环和递归...

    2021“蓝桥杯”全国软件专业人才设计与创业大赛题目-预赛借鉴.pdf

    大数乘法是计算机科学中的一个重要话题,尤其是在处理超出基本数据类型范围的数值时。分块法是一种常见的解决方案,它将大数分解成较小的部分,然后逐个进行乘法运算,最后进行进位处理。代码示例展示了如何使用这种...

    LanQiaoBei.rar_lanqiaobei_程序试题_蓝桥杯

    3. **大数乘法.cpp**:大数运算在算法竞赛中是常见主题,通常需要实现快速乘法算法,如Karatsuba或FFT(快速傅里叶变换)。这道题目要求参赛者能高效地处理超过常规整型范围的大数乘法。 4. **奇怪的比赛.cpp**:这...

    Lanqiao.zip_蓝桥杯

    10. **2012年大数乘法.cpp**:大数运算在计算机科学中是基础但又重要的一部分,可能需要实现大整数的乘法运算,涉及位运算或Karatsuba算法等高级技巧。 通过分析这些源代码,不仅可以熟悉编程竞赛的常见题型,还能...

    蓝桥杯大题总结(历届比赛共40多大题).docx

    - 大数处理:由于最终的数值非常大,需要考虑如何高效地存储和处理这些大数。 #### 七、猜生日 - **题目背景**:一个简单的日期处理题目,旨在考察基础的日期格式化能力。 - **核心知识点**: - 日期格式化:理解...

    蓝桥杯基础考点.docx

    这份文档是一份算法和技术概念的概述,主要针对蓝桥杯编程比赛的准备。文档内容涵盖了多种算法和数据结构,包括但不限于: **排序算法**:包括冒泡排序、选择排序、插入排序和归并排序,每种算法都有其特定的应用...

    2014年蓝桥杯JAVA本科A组试题

    而分治法可以应用于快速排序、大数乘法等场景。理解并熟练掌握这些算法,能有效提升解题效率。 再者,面向对象编程思想的运用不容忽视。试题可能要求设计和实现类,理解继承、封装和多态的概念。例如,创建一个具有...

    2019年第十届蓝桥杯省赛题解(全)

    3. **矩阵快速幂**:此算法是对递推关系的一种优化,特别是当递推公式可以通过矩阵乘法来表达时,矩阵快速幂可以显著减少运算次数,适用于求解大数情况下的递推数列。 4. **广度优先搜索(BFS)**:在迷宫问题中,...

    蓝桥杯 Java A组 历年真题加测试

    可以使用循环来逐步增加幂的次数,并利用复数乘法规则\(a + bi\)和\(c + di\)相乘的结果为\((ac - bd) + (ad + bc)i\)。由于结果非常大,需要确保数据类型能够存储这些大数值。 **代码实现**: ```java import java...

    第四届蓝桥杯真题及答案.docx

    【第四届蓝桥杯真题及答案】 这道题目涉及到日期计算和数学推理。问题的核心是通过高斯日记中的数字推算出他获得博士学位的具体日期。首先,我们需要知道高斯获得博士学位那天日记上标注的数字是8113,而1778年不是...

    Java实现 蓝桥杯 历届试题 斐波那契

    在代码实现上,需要特别注意大数运算中模运算的性质,即模运算不满足交换律,但是满足结合律。因此,在进行矩阵乘法时,应先计算乘积再取模,而不是先对每个元素取模再做乘法。 整个程序的流程包括读取输入的n、m和...

    经典算法题大全

    7. **分治策略**:快速排序、归并排序、大数乘法等。 8. **数学问题**:模运算、数论、组合数学等在算法中的应用。 这些算法不仅适用于蓝桥杯比赛,也适用于ACM/ICPC等其他编程竞赛,同时也是软件工程师日常工作中...

    ACM算法模板.pdf

    这些算法模板是为了帮助解决ACM、CSP等竞赛中常见的问题而设计的,它们是参加PAT、CSP、ACM、蓝桥杯等算法竞赛的重要参考资料。下面详细介绍各个算法模板的知识点: 1. 埃拉托斯特尼筛法(Sieve of Eratosthenes)...

Global site tag (gtag.js) - Google Analytics