首页 > 其他分享 >P1604 B进制星球

P1604 B进制星球

时间:2024-04-13 16:00:44浏览次数:23  
标签:node 进制 int P1604 s1 len 55 星球

P1604 B进制星球

题目描述

话说有一天,小 Z 乘坐宇宙飞船,飞到一个美丽的星球。因为历史的原因,科技在这个美丽的星球上并不很发达,星球上人们普遍采用 \(B\ (2 \le B \le 36)\) 进制计数。星球上的人们用美味的食物招待了小 Z,作为回报,小 Z 希望送一个能够完成 \(B\) 进制加法的计算器给他们。现在小 Z 希望你可以帮助他,编写实现 \(B\) 进制加法的程序。

输入格式

数据数据共三行。

第一行,一个十进制的整数,表示进制 \(B\);

第二行和第三行,每行一个 \(B\) 进制数正整数。数字的每一位属于 \(\{\tt 0,1,2,3,4,5,6,7,8,9,A,B\cdots\}\)。

输出格式

一个 \(B\) 进制数,表示输入的两个数的和。

样例

输入

4
123
321

输出

1110

提示

数据范围及约定

记 \(n,m\) 分别表示两个 \(B\) 进制数字的长度。

对于全部数据,\(1\le n,m\le 2000\)。


思路

根据题目,每个数字长度小于等于 \(2000\),超过正常的整型数据范围,容易得出:\(B\) 进制的加法计算类似高精度的方法,即竖式相加的过程。不一样的地方是:

  1. 输入的字符中可能含有字母“\(A,B, \cdots\)”,需要将其转换成数字。可以参考 \(\operatorname{ASCII}\) 表,字母“\(A\)”的 \(\operatorname{ASCII}\) 码为 \(65\),对应的数字是 \(10\),相差 \(55\)。因此输入的字符减去“\(55\)”得到的整数存入高精度加数数组中。
  2. 当进制大于 \(9\) 时,计算出来的数字超过 \(9\),需要使用“\(A,B,\cdots\)”表达,则输出的数字加上“\(55\)”得到的整数强制转换为字符类型输出即可。

代码一:数组方式

#include <bits/stdc++.h>

using namespace std;

char s1[2010], s2[2010];
int lena, lenb, lenc, a[2010], b[2010], c[2010], base;

int main()
{
	scanf("%d %s %s", &base, s1, s2);
	lena = strlen(s1);
	lenb = strlen(s2);
	for (int i = 0; i < lena; i ++ )
	{
		if (s1[i] >= 'A')
			a[lena - i] = s1[i] - 55;
		else
			a[lena - i] = s1[i] - '0';
	}
	for (int i = 0; i < lenb; i ++ )
	{
		if (s2[i] >= 'A')
			b[lenb - i] = s2[i] - 55;
		else
			b[lenb - i] = s2[i] - '0';
	}
	lenc = max(lena, lenb);
	for (int i = 1; i <= lenc; i ++ )
	{
		c[i] += a[i] + b[i];
		c[i + 1] = c[i] / base;
		c[i] = c[i] % base;
	}
	if (c[lenc + 1] > 0)
		lenc ++;
	for (int i = lenc; i >= 1; i -- )
	{
		if (c[i] < 10)
			printf("%d", c[i]);
		else
			printf("%c", char(c[i] + 55));
	}
	return 0;
}

代码二:结构体重载运算符

#include <bits/stdc++.h>

using namespace std;

int base, lenx, leny;
char x[20010], y[20010];

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

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] / base;
		c.s[i] %= base;
	}
	if (c.s[c.len + 1])
		c.len ++;
	return c;
}

void print(node a)
{
	for (int i = a.len; i >= 1; i -- )
	{
		if (a.s[i] >= 10)
			printf("%c", char(a.s[i] + 55));
		else
			printf("%d", a.s[i]);
	}
}

int main()
{
	scanf("%d %s %s", &base, x + 1, y + 1);
	lenx = strlen(x + 1);
	leny = strlen(y + 1);
	a.len = lenx;
	for (int i = 1; i <= lenx; i ++ )
	{
		if (x[i] >= 'A')
			a.s[lenx - i + 1] = x[i] - 55;
		else
			a.s[lenx - i + 1] = x[i] - '0';
	}
	b.len = leny;
	for (int i = 1; i <= leny; i ++ )
	{
		if (y[i] >= 'A')
			b.s[leny - i + 1] = y[i] - 55;
		else
			b.s[leny - i + 1] = y[i] - '0';
	}
	c = a + b;
	print(c);
	return 0;
}

标签:node,进制,int,P1604,s1,len,55,星球
From: https://www.cnblogs.com/IronMan-PZX/p/18132984

相关文章

  • 海洋信息管理系统:守护蓝色星球,促进海洋经济新发展
    海洋,覆盖地球表面超过七成的广阔水域,是生命之源,也是经济发展的重要空间。然而,随着人类活动的增加,海洋生态环境面临严峻挑战,海洋资源的可持续利用成为全球关注的焦点。在这样的背景下,构建一个全面、高效、智能的海洋信息管理系统显得尤为重要。项目背景海洋是全球......
  • Sql Server对等复制中将截断字符串或二进制数据。 (源: MSSQLServer,错误号: 8152)
    近期发现好好的复制突然出现了报错,导致备份库数据不一致的问题,如下 一直以为是发布数据库进行了DDL操作没有同步到这边来,导致数据同步时长度不够导致的,结果把表都检查了一遍也没发现啥不对劲最后只好去找相关资料,结果找到了官方资料(目前老项目用的14版本) 这边有几个......
  • 用于显著提高检索速度和降低成本的二进制和标量嵌入量化
    我们引入了嵌入量化的概念,并展示了它们对检索速度、内存使用、磁盘空间和成本的影响。我们将讨论理论上和实践中如何对嵌入进行量化,然后介绍一个演示,展示了4100万维基百科文本的真实检索场景。目录为什么使用嵌入?嵌入可能难以扩展提高可扩展性二进制量化SentenceT......
  • 【Azure Power BI】在Power BI中获取十进制随机数后,转换十六进制作为颜色值示例
    问题描述在使用PowerBIDesktop做报表,用到了其中一个图标组件(CardBrowser),可以做出比较漂亮的图片和带颜色的卡片效果:但是,在自己的数据源中,并没有颜色值。所以颜色值为0-255的十进制转换为00-FF的十六进制数据,想到了生成随机数,然后转换为颜色值。数据源格式示例:Title Coun......
  • java代码将16进制字符串转换为图片,jdbc入库blob字段,解决ORA-01704,PLS-00172,ORA-06550,
    从Oracle导出SQL文件中的insert语句包含blob字段,语句HEXTORAW函数将16进制的字符串入库,由于字符串太长,insert失败下面的代码读取完整的insert语句,将HEXTORAW函数连同16进制的字符串替换为NULL,先将字段置空插入记录,然后使用PreparedStatement对图片文件读流更新入库importorg.......
  • Spring Boot集成JavaMailSender发送邮件,支持二进制流
    什么是JavaMailSenderJavaMailSender是SpringFramework中的一个接口,用于发送电子邮件。它是Spring对JavaMailAPI的封装,提供了更简单和更方便的方式来发送邮件。JavaMailSender接口定义了一组发送邮件的方法,包括发送简单文本邮件、发送带附件的邮件、发送HTML格式的邮件等。它隐......
  • OJ 进制转换 判断进制【C】
    进制转换好久没写C,太生疏了,记一下我卡住的几个点1.C没有字符串这种数据类型,要实现读入一个未知长度的字符串比较简单的方法建立一个一定比这个字符串长的数组,而字符串在数组中的存储是会自动以'\0'结尾的,所以遍历时遍历到'\0'就是字符串的末尾2.类型转换格式  (要转换到......
  • 负进制转化
    思想:1.用短除法像处理正常进制一样将所有余数算出来  //余数转化为正数2.  负数转化公式:被除数=商*除数+余数        =商*除数+除数-除数+余数       =除数*(商+1)+(余数-除数)举个例子:-7(十进制)转化为(-2进制)7/-2=3+(-1);因为3+1=......
  • 二进制求子集(位图法)
    0.使用二进制方式求子集例如:a5a4a3a2a1111111.代码模板#include<bits/stdc++.h>usingnamespacestd;intn;inta[]={1,2,3,4,5,6,7,8,9,10};//求a[0]->a[n-1]的所有子集voidprint_subset(intn){ //i<(1<<n)即i<=2^(n-1),是......
  • 将一个结构体里面的数据转为 小端对齐的二进制流
    现在有一个C++的结构体,需要把它转为二进制流,而且是小端对齐的。我们还需要将一个小端对齐的二进制流,转为对应的结构体。appendLittleEndianparseLittleEndian这2个方法是chatgpt提供给我的,功能能准确实现。代码也比较简洁。 #include<iostream>#include<vector>#inc......