杭电2006年笔试

1. 输入一个十进制的数,把它变成八进制,类似的把十进制变成16进制,把十六进制转变为十进制等。

2012进制转换

PAT B1022 D进制的A+B (20 分)

思路:

十进制 -> Q进制:依次取余数,存到数组中,最后从后往前输出数组的值

Q进制 -> 十进制:依次取每位乘当前的权,然后累加到初值为0的十进制y中。

代码:

十进制转换为 八进制:

// 十进制转为八进制,除基取余法
#include <cstdio>
int main() {
	int n, p = 8;
	scanf("%d", &n); // 输出十进制数n
	int z[40], pNum = 0; // 存放余数的数组和下标
	// 每次取一个余数,然后 n再取商
	while (n != 0) { 
		z[pNum++] = n % p;
		n /= p;
	}
	// 逆序输出余数数组中的余数
	for (int i = pNum - 1; i >= 0; i--) {
		printf("%d", z[i]);
	}
	return 0;
}

十进制 转换为 十六进制:

// 十进制 转换为 十六进制
#include <cstdio>
char hexa[6] = { 'A', 'B', 'C', 'D', 'E', 'F' };
int main() {
	int n; // 十进制数n
	scanf("%d", &n);
	int p = 16; // 要转换的进制
	char z[40], pNum = 0; //存放余数的数组和下标
	while (n != 0) {
		int remain = n % p; //取余数
		if (remain >= 10 && remain <= 15)
			z[pNum++] = hexa[remain - 10];
		else
			z[pNum++] = '0' + remain;
		n /= p; // 取商
	}
	for (int i = pNum-1; i >= 0; i--) {
		printf("%c", z[i]);
	}
	return 0;
}

 

十六进制 转换为 十进制:

// 十六进制 转 十进制
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main() {
	char num[10];
	scanf("%s", num);
	int len = strlen(num);
	int product = 1; 
	int p = 16; // 权重
	int ans = 0; // 存放结果
    // 十六进制数字的个位往前遍历,每个数字乘以权重,每循环依次,权重乘权
	for (int i = len - 1; i >= 0; i--) {
		if (num[i] >= 'A' && num[i] <= 'F') {
			ans += (num[i] - 'A' + 10) * product;
		}
		else {
			ans += (num[i] - '0') * product;
		}
		product *= p;		
	}
	printf("%d\n", ans);
	return 0;
}

 

2. 大整数相加

hdoj_1002

输入两个非常大的整数(完全超出了int、long的标识范围),这个整数的长度可能超过100位,计算并输出这两个数相加的结果。

参考:《算法笔记》5.6 大整数运算

思路:

设置一个大整数结构体 bign,有2个元素:

数组d[]逆序存放大整数,因为运算的时候是从后往前,所以逆序存放有助于运算;

int型 len 表示这个大整数的长度。

因int和long都不能满足 大整数的存放,所以用字符数组存放。然后再转换成结构体,逆序存入数组。

加法:

定义一个add函数,参数为两个结构体。核心思想:对应位相加,个位数作为当前位的结果,进位记录下来,再加到下一个对应位相加中。

#include <cstdio>
#include <cstring>

struct bign {
	int d[1010];
	int len;
	bign() { // 初始化函数
		memset(d, 0, sizeof(d));
		len = 0;
	}
};

bign change(char str[]) {
	bign a;
	int len = strlen(str);
	for (int i = 0; i < len; i++) {
		a.d[a.len++] = str[len - 1 - i] - '0';
	}
	return a;
}

bign add(bign a, bign b) {
	bign c;
	int carry = 0;
	for (int i = 0; i < a.len || i < b.len; i++) {
		int temp = a.d[i] + b.d[i] + carry;
		c.d[c.len++] = temp % 10;
		carry = temp / 10;
	}
	if (carry != 0) {
		c.d[c.len++] = carry;
	}
	return c;
}

int main() {
	char num1[1010], num2[1010];
	scanf("%s%s", num1, num2);
	bign a = change(num1);
	bign b = change(num2);
	bign c = add(a, b);
	for (int i = c.len - 1; i >= 0; i--) {
		printf("%d", c.d[i]);
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值