415. 字符串相加

地址:

力扣icon-default.png?t=M0H8https://leetcode-cn.com/problems/add-strings/

题目:

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。

你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。

示例 1:

输入:num1 = "11", num2 = "123"
输出:"134"


示例 2:

输入:num1 = "456", num2 = "77"
输出:"533"


示例 3:

输入:num1 = "0", num2 = "0"
输出:"0"

提示:

1 <= num1.length, num2.length <= 104
num1 和num2 都只包含数字 0-9
num1 和num2 都不包含任何前导零

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:

题目限定不能把字符串转换为整数,但没有说不能把其中每个字符转为数字

字符与对应数字是存在关系的,ASCII 关系

字符十进制数
048
149
250
351
452
553
654
755
856
957

比如字符 '5',可以通过 '5' - '0' 等于十进制 53 - 48 = 5

同理数字转字符则 + '0' 即可

处理完字符与数字的问题,剩下的就是竖式计算加法,需要考虑进位问题

比如: 987 + 25 = 1012

个位 7 + 5 + 进位 0 = 12, 结果个位 12 % 10 = 2, 进位 12 / 10 = 1

十位 8 + 2 + 进位 1 = 11, 结果十位 11 % 10 =1,进位 11 / 10 = 1

百位 9 + 0 + 进位 1 = 10,结果百位 10 % 10 = 0,进位  10 / 10 = 1

千位 0 + 0 + 进位 1 = 1,结果千位 1 % 10 = 1, 进位 1 /10 = 0

(竖式相加如果对应位没有字符,表示该数完成,对应位加法相当于加 0)

这样就得到了 1012

在 C 语言中没有其他语言那样可以直接类似 str.appand 依次将个位,十位直接拷贝到数组末

所以我们要多做一次反向字符串操作

另外两个数长度不一定相同,考虑进位情况,新的字符串长度为 输入的两个数组其中较长哪个的长度 + 1(进位)

方法一、逐个字符加法

#define max(a, b) ((a) >= (b) ? (a) : (b))

void swap(char *x, char *y)
{
	*x = (*x)^(*y);
	*y = (*x)^(*y);
	*x = (*x)^(*y);
}

void swapString(char *s)
{
	int sLen = strlen(s);
	int mid = sLen/2;
	int i;
	
	for(i=0; i<mid; i++)
		swap(&s[i], &s[sLen-i-1]);
}

char * addStrings(char * num1, char * num2){
	int sLen1 = strlen(num1);
	int sLen2 = strlen(num2);
	int sLen = max(sLen1, sLen2) + 1;

	char *ret = (char *)malloc(sizeof(char) * sLen + 1);
	int i,j,k;
	int carry = 0;
	
	for(i=sLen1-1, j=sLen2-1, k=0; i>=0 || j>=0; i--, j--)
	{
		int a = i<0 ? 0 : num1[i] - '0';
		int b = j<0 ? 0 : num2[j] - '0';
		
		//printf("a=%d, b=%d, carry=%d\n", a, b, carry);
		
		char c = (a+b+carry)%10 + '0';
		ret[k++] = c;
		carry = (a+b+carry)/10;
	}
	
	if(carry != 0)
		ret[k++] = carry +'0';
	ret[k]='\0';
	
	swapString(ret);
	
	return ret;
}

查看更多刷题笔记

内容概要:本文档详细介绍了基于C++的大学志愿填报系统的设计与实现,涵盖了项目背景、目标、挑战、特点、应用领域及未来改进方向。系统旨在通过高效的数据处理和智能推荐算法,帮助考生科学合理地进行志愿填报,提升填报效率和录取成功率。系统采用分层架构,包括数据采集与预处理、考生成绩分析、院校与专业信息管理、智能推荐算法、风险评估及用户交互模块。推荐算法基于多条件加权评分模型,结合考生成绩、兴趣爱好和录取概率,生成个性化的志愿填报方案。系统还具备实时数据更新机制、模拟录取概率分析、用户体验优化设计、灵活的配置管理、强大的数据安全保障体系和良好的跨平台兼容性。适合人群:适用于高校招生管理人员、参与高考志愿填报的考生及其家长、从事教育信息化建设的研究人员和技术开发者。使用场景及目标:①高校招生管理部门进行数据统计与分析,优化招生计划;②考生和家长获取专业志愿填报指导和模拟分析服务;③教育主管部门进行政策研究和趋势分析,推动教育公平;④教育咨询机构提供数据支持和服务平台,提升志愿填报服务的专业性和效率。其他说明:系统未来将引入深度学习推荐模型、多源数据融合、移动端适配、自然语言处理辅助咨询、大数据分析与可视化深化、智能风险预警系统、系统性能优化、用户行为分析及多语言支持等功能,进一步提升智能化和服务能力。整体项目推动了高校招生信息化进程,促进教育资源合理配置,帮助考生科学规划未来学业路径,具有广泛应用前景和社会价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值