字符串需要优化代码

本文介绍了一个使用C++实现的算法,该算法能够处理两个由字符串存储的大整数的加法运算。通过逐位相加并处理进位,算法确保了即使在处理超出常规整数类型范围的数值时也能正确计算。文章详细解释了如何验证输入的有效性,如何计算字符串长度,以及如何执行字符级别的加法。
摘要由CSDN通过智能技术生成
// Integer addition.cpp : 定义控制台应用程序的入口点。
//请设计一个算法能够完成两个用字符串存储的整数进行相加操作,对非法的输入则返回error

#include "stdafx.h"

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
//判定是否是数字字符
bool isNumber(const char str)
{
	if (str >= '0'&& '9' >= str)
	{
		return true;
	}
	return false;
}
//判定指针是空
bool isNull(const void *p)
{
	if (NULL == p)
	{
		return true;
	}
	return false;
}
//计算字符长度,并将指针指向字符串的低端
int lenString(const char *&pStr)
{
	int lenStr = 0;
	for (pStr; *pStr != '\0'; pStr++)
	{
		if (isNumber(*pStr))
		{
			lenStr++;
		}
		else
		{
			return lenStr = 0;
		}
	}
	return lenStr;
}
//字符相加处理函数,前提是pdest 全部初始化了;
bool mergeNumberChar(char * const pdest , const int val , const int address)
{
	if (val > '9')
	{
		*(pdest + address - 1) = 1;
		if (*(pdest + address) == 1)
		{
			*(pdest + address) = val - 9;
		}
		else
		{
			*(pdest + address) = val - 10;
		}
	}
	else if (val == '9')
	{
		if (*(pdest + address) == 1)
		{
			*(pdest + address - 1) = 1;
			*(pdest + address) = '0';
		}
	}
	else
	{
		*(pdest + address) += val;
	}
	return true;
}

//数字字符相加处理函数
bool mergeNumberString(char *pdest, const char *pStr1, const char *pStr2)
{
	if (isNull(pdest) || isNull(pStr1) || isNull(pStr2))
	{
		return false;
	}

	int length = 0, tmp = 0;
	int lenStr1 = lenString(pStr1);
	int lenStr2 = lenString(pStr2);

	if (0 == lenStr1 || 0 == lenStr2)
	{
		printf("error");
		return false;
	}
	else
	{
		length = (lenStr1 > lenStr2) ? lenStr1 : lenStr2;
		memset(pdest, 0, length + 1);
	}

	while (length--)
	{
		if ( --lenStr1 >= 0 && --lenStr2 >= 0)
		{
			tmp = *--pStr1 + *--pStr2 - 48;
			mergeNumberChar(pdest, tmp, length);
		}
		else if (lenStr1 >= 0)
		{
			tmp = *--pStr1;
			mergeNumberChar(pdest, tmp, length);
		}
		else if (lenStr2 >= 0)
		{
			tmp = *--pStr2;
			mergeNumberChar(pdest, tmp, length);
		}
	}
	return true;
}

int main()
{
	char str1[200];
	char str2[200];
	char str3[200];
	int i = 0;
	scanf("%s%s", str1, str2);
	if (mergeNumberString(str3, str1, str2))
	{
		printf(str3);
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值