P1601 A+B Problem(高精)

P1601 A+B Problem(高精)

题目

高精度加法,相当于 a+b problem,不用考虑负数

输入

分两行输入。a,b10500

输出

输出只有一行,代表 a+b 的值。

样例 1

输入

1
1

输出

2

样例 2

输入

1001
9099

输出

10100

提示

20% 的测试数据,0a,b109

40% 的测试数据,0a,b1018


思路一

根据题目描述,加数均超过 longlong 范围,因此需要使用高精度算法。将输入进来的字符转换为整型数组,并倒序存储。从低位到高位进行相加,如果当前位相加的结果大于 9,则向更高一位进位,当前的值为相加结果模 10 后的数。如果最高位也产生了进位,最终答案的长度增加一位。

代码

#include <bits/stdc++.h>

using namespace std;

char s1[505], s2[505];
int lena, lenb, lenc, a[505], b[505], c[505], x;

int main()
{
	cin >> s1 >> s2;
	lena = strlen(s1);
	lenb = strlen(s2);
	for (int i = 0; i < lena; i ++ )
		a[lena - i] = s1[i] - 48;
	for (int i = 0; i < lenb; i ++ )
		b[lenb - i] = s2[i] - 48;
	lenc = lena < lenb ? lenb : lena; // 两个数中的最长位数
	for (int i = 1; i <= lenc; i ++ )
	{
		c[i] = a[i] + b[i] + x; // x 表示上一次的进位
		x = c[i] / 10; // 计算给下一位的进位
		c[i] %= 10;
	}
	if (x != 0)
		c[++ lenc] = x;
	for (int i = lenc; i >= 1; i -- )
		cout << c[i]; // 输出
	return 0;
}

另外,高精度的写法中,使用结构体去表达数据、重载运算符取表达运算过程也比较常见,因此需要熟练掌握。相对于高精度数组写法而言,结构体重载运算符写法代码更长,但装封性和兼容性更佳。


思路二

  1. 结构体存储:结构体中 len 表示该数字的长度,数组 s 用来存储大整数的每一位。node() 为结构体构造函数,用来初始化。
struct node()
{
  int len, s[510];
  node()
  {
    len = 0;
    memset(s, 0, sizeof(s));
  }
}
  1. 读入方式:与数组写法对比,不一样的地方是将计算出来的数组赋值到结构体中,在函数里返回一个结构体变量。
node read()
{
  scanf("%s", str);
  int len = strlen(str);
  node a;
  a.len = len;
  for (int i = 0; i < len; i ++ )
    a.s[len - i] = str[i] - '0';
  return a;
}
  1. 重载运算符:重载加法运算符的方式是将两个结构体传入重载运算符函数,将加数的每一位进行相加赋值到一个新的结构体变量中,更新结构体变量的 s 数组及数字长度,最后返回结构体变量。
node operator + (const node &a, const node &b)
{
  node c;
  c.len = max(a.len, b.len);
  for (int i = 1; i <= c.len; i ++ )
  {
    c.s[i] += a.s[i] + b.s[i];
    c.s[i + 1] += c.s[i] / 10;
    c.s[i] %= 10;
  }
  if (c.s[c.len + 1])
    c.len ++;
}

代码

#include <bits/stdc++.h>

using namespace std;

char str[20010];

struct node
{
	int len, s[20010];
	node()
	{
		len = 0;
		memset(s, 0, sizeof(s));
	}
};

node operator + (const node & a, const node & b)
{
	node c;
	c.len = max(a.len, b.len);
	for (int i = 1; i <= c.len; i ++ )
	{
		c.s[i] += a.s[i] + b.s[i];
		c.s[i + 1] += c.s[i] / 10;
		c.s[i] %= 10;
	}
	if (c.s[c.len + 1])
		c.len ++;
	return c;
}

node read()
{
	scanf("%s", str);
	int len = strlen(str);
	node a;
	a.len = len;
	for (int i = 0; i < len; i ++ )
		a.s[len - i] = str[i] - '0';
	return a;
}

void print(node a)
{
	for (int i = a.len; i >= 1; i -- )
		printf("%d", a.s[i]);
}

int main()
{
	node a, b, c;
	a = read();
	b = read();
	c = a + b;
	print(c);
	return 0;
}
posted @   IronMan_PZX  阅读(65)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
Title
点击右上角即可分享
微信分享提示