俩个大正整数相加

这个题听说的华为的题目。

前提是正整数。思路不难,主要注意细节即可!

#include <iostream>
#include <algorithm>
#include <stdlib.h>
using namespace std;

void add_bigdata(char * first_char,char *second_char,char *result)
{
	int len_first = strlen(first_char);
	int len_second = strlen(second_char);
	int len_min,len_max;
	//先反转
	reverse(first_char,first_char+len_first);
	reverse(second_char,second_char+len_second);

	len_max = max(len_first,len_second);
	len_min = min(len_first,len_second);

	char carry = 0;
	for(int i = 0; i < len_min ; i++)//处理含公共长度
	{
		char temp_sum = first_char[i] +  second_char[i] - '0';//任然是字符
		if(temp_sum + carry > '9')//不要用'10' -- 》 为俩个字符!!!
		{
			result[i] = temp_sum + carry -10;
			carry = 1;
		}
		else
		{
			result[i] = temp_sum + carry ;
			carry = 0;
		}
	}
	//下面统一处理串长的。
	char *left ;
	if(first_char[len_min] != '\0' )
	{
		left = first_char;
	}
	else
	{
		left = second_char;
	}

	int j = len_min;
	for( ; j < len_max; j++)
	{
		char temp_sum = left[j];//任然是字符
		if(temp_sum + carry > '9')
		{
			result[j] = temp_sum + carry -10;
			carry = 1;
		}
		else
		{
			result[j] = temp_sum + carry ;
			carry = 0;
		}
	}
	//处理末尾进位
	if(carry == 1)//有进位
	{
		result[j] = '1';
		result[j+1] = '\0';
	}
	else
	{
		result[j] = '\0';
	}
	//转换顺序
	reverse(result,result+strlen(result));
}


int main()
{
	char first_char[100];
	char second_char[100];
	char result[101];//可能进位

	cout<<"first  data: ";
	cin>>first_char;
	cout<<"second data: ";
	cin>>second_char;
	cout<<endl;

	add_bigdata(first_char,second_char,result);

	cout<<result<<endl;

}


//注意下不要稀里糊涂的用‘10’,这个可能会犯错,当数字用!

//char 数组小端存储。

//另一种思路,是直接先相加,再反转。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于200位整数超出了C++内置数据类型的范围,我们需要使用字符串来表示这个大正整数。具体实现如下: ```c++ #include <iostream> #include <cstring> using namespace std; class LPInteger { private: char digits[201]; public: LPInteger() { memset(digits, '0', sizeof(digits)); } LPInteger(const char* str) { memset(digits, '0', sizeof(digits)); int len = strlen(str); for (int i = 0; i < len; i++) { digits[200 - len + i] = str[i]; // 从高位到低位存储 } } LPInteger operator+(const LPInteger& other) const { LPInteger result; int carry = 0; for (int i = 200; i >= 0; i--) { // 从低位到高位相加 int sum = digits[i] - '0' + other.digits[i] - '0' + carry; result.digits[i] = sum % 10 + '0'; carry = sum / 10; } return result; } void print() const { int i = 0; while (digits[i] == '0' && i < 200) i++; // 忽略前导0 cout << (i == 200 ? "0" : &digits[i]) << endl; // 如果是0,输出一个0,否则输出去掉前导0的数字串 } int length() const { int i = 0; while (digits[i] == '0' && i < 200) i++; // 忽略前导0 return 200 - i + 1; // 200减去去掉前导0的数字串的起始位置再加1就是位数 } }; int main() { char a[201], b[201]; cin >> a >> b; LPInteger x(a), y(b); (x + y).print(); cout << (x + y).length() << endl; return 0; } ``` 在这个实现中,我们使用一个长度为201的字符数组来存储大正整数。为了方便运算,我们把这个数组看成一个长度为200的数字串,从高位到低位存储。这样,我们就可以方便地实现加法运算。为了输出这个大正整数和位数,我们还实现了print和length两个成员函数,其中print用来输出去掉前导0的数字串,length用来计算位数。最后,我们在主函数中输入两个正整数,并输出它们的和以及位数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值