洛谷 p1604 B进制星球 C语言

附上代码

#include<stdio.h>
#include<string.h>
char temp1[2002];
char temp2[2002];
char a[2002];
char b[2002];
char c[2002];
int max(int x,int y){
	return (x > y) ? x : y;
}
int main()
{
	int n;//进制 
	scanf("%d",&n);
	getchar();
	scanf("%s",temp1);//将题上所给的数字变成字符串储存进数组 
	scanf("%s",temp2);
	int len1 = strlen(temp1);
	int len2 = strlen(temp2);
	for(int i = 0;i < len1;i++)// 将temp1中的数组倒序存入数组a中 
	{
		if(temp1[len1 - i - 1] <= '9'&&temp1[len1 - i - 1] >= '0')//数字在10以内,直接存入 
			a[i] = temp1[len1 - i - 1] - '0';
		else//如果存储的是字母,将其变为对应的数字 
			a[i] = temp1[len1 - i - 1] - 'A' + 10;
	}
		
	for(int i = 0;i < len2;i++)//与数组a的操作相同 
	{
		if(temp2[len2 - i - 1] <= '9'&&temp2[len2 - i - 1] >= '0')
			b[i] = temp2[len2 - i - 1] - '0';
		else
			b[i] = temp2[len2 - i - 1] - 'A' + 10;
	}
	int lenc = max(len1,len2);//c数组的长度取a,b中较大的 
	for(int i = 0;i < lenc;i++)
	{
		c[i] += a[i] + b[i];
		if(c[i] >= n)//需要进位 
		{
			c[i + 1] += c[i] / n;//进位操作 
			c[i] = c[i] % n;
			if(c[lenc])//如果数组c的最高位不为0,要将数组c的长度加一 
				lenc++;
		}
	}
	for(int i = lenc - 1;i >= 0;i--)//如果c[i]是十以内数字,直接输出,如果大于十,就将其转化成相应字母输出 
	{
		if(c[i] <= 9&&c[i] >= 0)
			printf("%d",c[i]);
		else 
			printf("%c",c[i] - 10 + 'A');
	}
		
	
	return 0;
}

删除线格式
这道题是一道高精度算法的变式,添加了不同进制,使问题变得稍微复杂·,首先因为a和b的位数不一定相等,所以我们选择将a,b倒着写,使他们从个位开始一一对应,在输入的时候,注意数字和字母的变化。
因为9和A在ascall码不是不是连续的,所以要特殊操作。
在计算时,对应位置的数字相加,判断是否需要进位,需要进位的话,分别进行相除和取余操作,再对数组c的长度进行更新。这些都是正常的高精度算法操作。
输出时还需要判断数字是否在10以内,如果不在,需要将其转化为字母再输出。
然后就可以获得AC代码了。
删除线格式
溜了溜了~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值