NOI OJ 1.6 10:大整数加法 C语言

1168:大整数加法(a+b) 时间限制,内存限制 时间限制: 100010001000 ms 内存限制: 655366553665536 KB 题目描述 求两个不超过200200200位的非负整数的和。 输入 有两行,每行是一个不超过200200200位的非负整数,可能有多余的前导0。 输出 一行,即相加后的结果。结果里不能有多余的前导000,即如果结果是342342342,那么就不能输出为034203420342。 输入样例 22222222222222222222 33333333333333333333 输出样例 阅读详情
AI摘要

本文讲解如何用C语言处理超过200位的非负整数加法问题。由于整型变量无法存储如此大的数值,需采用字符串输入,再将字符逐位转换为数字存入数组,按低位到高位对齐后模拟手工加法(逢十进一),最后去除前导零输出结果。核心涉及字符串操作、数组逆序存储与高精度加法逻辑。

描述

求两个不超过200位的非负整数的和。

输入

有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。

输出

一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

有一说一我本人是不大想讲的,因为这个题考的就是你们的思路,算是oj上的第一大难点吧(事实上就是我懒,讲解一遍太费力了)。但是,我看很多同学都卡死在这道题,一筹莫展,我就感到十分的悲痛,宝贵的刷题时光就这样浪费了,多可惜。所以我写了这篇文章给那些想了很久但是真的没什么思路的同学(那些没想过的最好别看,因为这只是我的思路,说不定你能想到更好的,这篇文章只是帮助这些同学用我自认为比较“笨”方法来做出这道题,来拓展一下他们局限的思路)废话不多说了,我们正式开始。

难点1:本题之所以难就难在他给的数据太大了,远远超出了int 甚至long long的范围(仅限于c,python和java没有这方面的问题)所以第一步我们要知道如何输入数据

我是是用字符串的方式进行输入的,为什么用字符串不用数组呢

因为字符串输入很方便,直接一个%s,这一行的数据都可以直接输入了(也可以用gets,我本人喜欢用gets),我们可以很轻易的定义一个长度很大的字符串,这样就可以确保我们的数据都可以输入进去。

这个不是完整代码,只是讲输入的代码。我定义了一个长度为201的字符串(题目要求不超过长度200)

#include<stdio.h>
#include<string.h>
int main(){
    char x[201];
	char y[201];
    gets(x);
	gets(y);
    int len1=strlen(x),len2=strlen(y);  //用strlen函数来检测字符串长度
}

这里我们要测量出我们输入数据的长度(后面会讲解有什么用),使用strlen()函数要在前面加个#include<string.h>(和math.h一个道理)

strlen的作用:测量字符串的长度,比如我输入一个“1000000”的字符串,用strlen就可以测出它的长度为7。

 

难点2:我是用字符串的方式输入的,但是计算时用字符串会很麻烦,并且需要重新排序后才可以更方便的进行计算(加法有进一)。

所以我就把字符串内的数据转化成int的形式重新转入数组中(毕竟这章节要用数组,所以转回去也比较好解释)

    int a[201]={0};   //代表字符串x(全部初始化为0)
	int b[201]={0};   //代表字符串y
	int c[201]={0};   //这是我定义输出的数组c
    int len=201;    //因为我定义的数组大小为201,所以我这里定义一个长度为201的变量len
	for(int i=0;i<len1;i++){
		a[len-len1]=x[i]-'0';   //这里具体解释往下看(flag1)
		len++;
	}
	len=201;
	for(int i=0;i<len2;i++){
		b[len-len2]=y[i]-'0';
		len++;
	}

这里写了个伪代码来把字符串的数据代入数

flag1:这里讲解一下为什么我设一个len=200。我的想法是,从后往前排也就是我们平时见到数字排序的方法,这样的话比较直观好理解,所以我是这样一个个数字排进去的从最大位到最小位(见下表格)

假设我们输入一个1890,在数组中就是这样

数组序号193194195196197198199200201
输入数据00001890最后一位空着

 

这样在之后的计算中我们用同位的数组相加就行了,逢10进一,这就是我们下一步该干的事,这一步比较简单,我直接放出来了

if(len1>=len2){  //这里我把它分成了两种情况(等于的情况放在哪里都是可以的)
		for(int i=200;i>=200-len1;i--){  //分成两种情况的好处是可以知道最大的数据的长度,循环到比最大位多一位就行了(加法只能进一位)
			c[i]+=a[i]+b[i];           //我们把数组a+b的值放入数组c中
			if(c[i]>=10){            //逢10进一
				c[i]-=10;    
				c[i-1]+=1;
			}
		}
		int flag=0;              //这里定义一个flag方便之后的前面的清零,保证不会输出012这种情况
		for(int i=0;i<=200;i++){
			if(flag==0&&c[i]!=0){  //们从最初位往后排,直到不为0的最大项,我们就可以改变flag,让他之后(包括本身)的数据都能输出
				flag=1;
			}
			if(flag==1){
				printf("%d",c[i]);
			}
		} 
	}
	else{
		for(int i=200;i>=200-len2;i--){  //同上,只是数据最长值换了一下
			c[i]+=a[i]+b[i];
			if(c[i]>=10){
				c[i]-=10;
				c[i-1]+=1;
			}
		}
		int flag=0;
		for(int i=0;i<=200;i++){
			if(flag==0&&c[i]!=0){
				flag=1;
			}
			if(flag==1){
				printf("%d",c[i]);
			}
		} 
	}

以上就是我个人大整数加法的做法了,比较憨憨,希望大家能够理解吧。

下面把完整的代码发出来(如果你认为对你有用的话不妨点个赞)

#include<stdio.h>
#include<string.h>
int main(){
	char x[201];
	char y[201];
	int a[201]={0};
	int b[201]={0};
	int c[201]={0};
	gets(x);
	gets(y);
	int len1=strlen(x),len2=strlen(y);
	int len=201;
	for(int i=0;i<len1;i++){
		a[len-len1]=x[i]-'0';
		len++;
	}
	len=201;
	for(int i=0;i<len2;i++){
		b[len-len2]=y[i]-'0';
		len++;
	}
	if(len1==1&&len2==1){
		if(a[200]==0&&b[200]==0){
			printf("0");
			return 0;
		}
	}
	if(len1>=len2){
		for(int i=200;i>=200-len1;i--){
			c[i]+=a[i]+b[i];
			if(c[i]>=10){
				c[i]-=10;
				c[i-1]+=1;
			}
		}
		int flag=0;
		for(int i=0;i<=200;i++){
			if(flag==0&&c[i]!=0){
				flag=1;
			}
			if(flag==1){
				printf("%d",c[i]);
			}
		} 
	}
	else{
		for(int i=200;i>=200-len2;i--){
			c[i]+=a[i]+b[i];
			if(c[i]>=10){
				c[i]-=10;
				c[i-1]+=1;
			}
		}
		int flag=0;
		for(int i=0;i<=200;i++){
			if(flag==0&&c[i]!=0){
				flag=1;
			}
			if(flag==1){
				printf("%d",c[i]);
			}
		} 
	}
	return 0;
}

 

 

10:大整数加法(大整数阶乘) 来源 描述 求两个不超过200位的非负整数的和。 输入 有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。 输出 一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。 样例输入 22222222222222222222 33333333333333333333 样例输出 55555555555555555555 思路:... 阅读详情

相关推荐

NOI(OJ)编程基础篇

http://noi.openjudge.cn/ 输入输出 题目 解题 01 Hello, World! 02 输出第二个整数 03 对齐输出 04 输出保留3位小数的浮点数 05 输出保留12位小数的浮点数 06 空格分隔输出 07 输出浮点数 08 字符三角形 09 字符菱形 10 超级玛丽游戏 变量定义、赋值及转换 题目 解题 ...

lzx's blog 1万+

1168:大整数加法

1168:大整数加法 【题目描述】 求两个不超过200位的非负整数的和。 【输入】 有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。 【输出】 一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。 分析 注意结果前导0的处理。 代码 #include <iostream> using namespace std; const i...

hipoole的博客 1649

投入OJ的怀抱~~~~~~~~~~

OpenJudge C20182024信箱(1) 账号 修改设定 退出小组 管理员 frank  林舒  Dzx  someone  李文新 公告 11-05 程序设计与算法(大学先修课) 成员(61910)查看全部

Good good study Day day up~\(≧▽≦)/~ 1807

信息学奥赛一本通:1168:大整数加法

大整数加法

bjml_的博客 377

46、1168:大整数加法-2020-01-16(F).pdf

46、1168:大整数加法-2020-01-16(F) 46、1168:大整数加法-2020-01-16(F) 46、1168:大整数加法-2020-01-16(F)

Zynq UltraScale+ MPSoC-AMP(linux+裸机)

接着 Zynq UltraScale+ MPSoC-双核裸机AMP继续 平台工具:zcu106,vitis2020.2,petalinux2019.2 文章目录1.cpu1跑裸机2.cpu0跑linux2.1petalinux设置2.2 app3.生成BOOT.bin4.zcu106测试 1.cpu1跑裸机 参照Zynq UltraScale+ MPSoC-双核裸机AMP建立的工程进行修改。BSP中stdin与out修改为uart1,uart1给裸机用,uart0给linux用。 ddr空间裸机与linu

zhuxl24的博客 5195

【大数/高精度整数】OJ NOI 11:大整数减法

11:大整数减法总时间限制: 1000ms内存限制: 65536kB描述求两个大的正整数相减的差。输入共2行,第1行是被减数a,第2行是减数b(a &gt; b)。每个大整数不超过200位,不会有多余的前导零。输出一行,即所求的差。样例输入9999999999999999999999999999999999999 9999999999999样例输出9999999999999999999999990...

cym的博客 1550

Ubuntu HackRF One、GNU Radio、Gqrx相关环境搭建

本文介绍Ubuntu HackRF One、GNU Radio、Gqrx相关环境搭建方法。

无线通信实验室 1万+

大整数加法

描述 求两个不超过200位的非负整数的和。 输入 有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。 输出 一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。 样例输入 22222222222222222222 33333333333333333333 样例输出 55555555555555555555 #include<stdio....

lzx's blog 808

微软登录OAuth 2.0授权流程

OAuth 2.0是一个关于授权的开放网络标准,它允许第三方应用获取用户数据,是目前最流行的授权机制。微软身份平台支持OAuth 2.0授权码流程,使得客户端应用程序能够获得对受保护资源(如网络API)的授权访问。这一流程在保障用户数据安全的前提下,实现了应用的便捷登录与数据共享。当用户在一个支持OAuth 2.0的应用上,希望使用微软账号进行登录时,OAuth 2.0授权流程即被触发。

qq_36569837的博客 4091

Android Geckoview实战:5分钟搞定JS与原生交互(附完整Demo代码)

本文详细介绍了在Android应用中使用GeckoView替代系统WebView,构建稳定高效的JavaScript与原生代码交互桥梁的实战方法。通过WebExtension架构,文章提供了从环境配置、扩展开发到Android端集成的完整步骤,并附有可运行的Demo代码,帮助开发者快速解决混合应用中的兼容性问题。

u5v6w7的博客 936

NOI OJ 1.4 05:整数大小比较 C语言

描述 输入两个整数,比较它们的大小。 输入 一行,包含两个整数x和y,中间用单个空格隔开。 0 <= x < 2^32, -2^31 <= y < 2^31。 输出 一个字符。 若x > y,输出 > ; 若x = y,输出 = ; 若x < y,输出 < ; 这里我们两两比价,再引入一个中间数,将第一次比较的结果赋值给中间数,再进行一次比较。 这种思路比较简洁清晰,能较为方便的进行比较。 #include<stdio.h>

chdcb的博客 2962

SAP-ABAP:SAP HANA性能神器FDA:是极速查询的引擎,也是CPU过载的元凶

在SAP S/4HANA的世界里,有一个被ABAP开发者们既爱又怕的特性——Fast Data Access(FDA),它能将性能提升百倍,也能让CPU瞬间飙升。本文将带您全面解剖这一核心机制。

baidu_35680696的博客 849

大整数的因子

描述 已知正整数k满足2<=k<=9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k。 输入 一个非负整数c,c的位数<=30。 输出 若存在满足 c%k == 0 的k,从小到大输出所有这样的k,相邻两个数之间用单个空格隔开;若没有这样的k,则输出"none"。 样例输入 30 样例输出 2 3 5 6 #include<stdio.h> #inclu...

lzx's blog 407

5、数据计算与处理技巧全解析

本文深入解析了Tableau中的多种数据计算与处理技巧,涵盖LOD计算、日期与字符串处理、计数优化、数据混合限制及自定义总计等核心内容。通过实际案例和流程图,系统讲解了各技巧的应用场景、实现步骤与注意事项,并提供性能优化建议和常见问题解答,帮助用户提升数据分析效率与可视化精度。同时展望了未来数据计算技术的发展趋势,是Tableau用户进阶必备的全面指南。

peach的博客 82

【2026最新】3分钟Windows极速部署OpenClaw,完整可复制命令+全链路避坑指南

很多新手在Windows环境部署OpenClaw时,总会遇到各种玄学问题:WSL环境配置失败、Docker镜像拉取超时、容器启动后无法访问、权限报错、数据丢失……网上大量教程要么是Linux环境的,要么是早已过时的旧版本配置,照着操作不仅没法3分钟部署,反而要花几小时踩坑填坑。

2601_94871597的博客 494

【NOI OJ】一大波题正在飞来(ˉ▽ ̄~) 我才不是 Ctrl C + Ctrl V 的人呢

OpenJudge 登入注册 管理员 frank 林舒 Dzx someone 李文新 公告 11-05程序设计与算法(大学先修课) 成员(61647)查看全部 NOI(题库正在建设中,做题纪录有可能会被删除,请注意) 加入 欢迎选修MOOC课程程序设计与算法(大学先修课) 进度: 5...

and1403的博客 1372

易盾滑块的js逆向分析

基于易盾的滑块验证码进行逆向分析,最种实现全系列的验证码逆向,包括滑块、点选、推理拼图等多种类型。

shanf7921的博客 3万+

《信息学奥赛一本通 编程启蒙C++版》3446-3450(5题)

《信息学奥赛一本通 编程启蒙C++版》3446-3450(5题)

青少年趣味编程 1145

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

杭电OJ 1130(C++)

计算Catalan数,其第一项为1,递推公式为h(n)=h(n-1)*(4*n-2)/(n+1),需使用大数乘法和大数除法模板。 #include <iostream> using namespace std; const int N = 101; //Catalan数的数组,每一行第一个数S[i][0]是该行Catalan数的位数, //之后S[i][0]位是第i个Catal...

Intelligence1028的博客 330

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

牛客周赛 57(已补完)

牛客周赛 57(已补完)

双非 Acmer,分享每天的刷题记录 359

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

[OI笔记]每周刷题记录

一些题库: bzoj、uoj、luogu(洛谷)、CF、loj、hdu、poj、51nod 下面是一些近期的做题记录 省选爆炸…然后大概就先这样了,要回去读一段时间文化课,如果文化课还不错的话也许还会回来… 2018.2.25 ·【bzoj1257】余数之和-数学(根号求和) ·【loj6006】「网络流 24 题」试题库-最大流 ·【bz...

2590

信息学奥赛中的STL(标准模板库)---(2022.09.30--2024.12.31)

信息学奥赛中的STL(标准模板库)--2022.09.30

青少年趣味编程 4119

信息素养大赛C++循环真题解析:从阶乘求和到算法优化实战

循环结构是编程语言中的基础控制结构,用于重复执行特定代码块,其核心原理是通过循环变量控制迭代次数或条件终止。掌握循环不仅能提升代码效率,更是理解复杂算法的基础,在数据处理、模拟计算等场景中广泛应用。本文以信息素养大赛真题为例,深入剖析循环在阶乘求和问题中的实际应用,通过对比双重循环与单层递推两种方案,详解如何将时间复杂度从O(n²)优化至O(n),并自然融入边界条件处理与数据类型选择等关键热词,帮助读者构建解决同类循环问题的通用方法论。

weixin_30378623的博客 342
上一篇: NOI OJ 1.5 42:画矩形 C语言
下一篇: NOI OJ 1.8 23:二维数组回形遍历(多维数组的遍历) C语言
chd44
博客等级 码龄5年 279粉丝 45原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chd44

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值