100000579 - 《算法笔记》3.5小节——入门模拟->进制转换

《算法笔记》3.5小节——入门模拟->进制转换
1941 Problem A 又一版 A+B

#include <stdio.h>
#include <string.h>

int main() {
	int m;
	long long a, b;
	while (scanf("%d", &m) != EOF) {
		if (m == 0) break;
	//while(scanf("%d",&m) && m)
		scanf("%lld %lld", &a, &b);
		long long sum = a + b;

		int ans[50] = { 0 };
		int num = 0;
		do {
			ans[num++] = sum % m;
			sum /= m;
		} while (sum != 0);
		//单独处理sum为0的情况,否则用do循环,先做一遍进制换算
		//if(sum==0) { printf("0\n"); continue; }
		for (int i = num - 1; i >= 0; i--) {
			printf("%d", ans[i]);
		}
		//注意顺序是反的,从num-1开始
		printf("\n");
	}

	return 0;
}

1942 Problem B 数制转换

#include <stdio.h>
#include <string.h>

int main() {
	int a, b;
	char n[50];
	int m[50] = { 0 };
	
	while (scanf("%d %s %d", &a, &n, &b) != EOF) {
		int length = strlen(n);
		long nnum = 0;
		int temp;
		for (int i = 0; i < length; i++) {
			if (n[i] >= 'a') n[i] -= 32;
			if (n[i] >= 'A') temp = (n[i]) - 'A' + 10;
			else temp = n[i] - '0';
			nnum = nnum * a + temp;
			//数组转化为整数:每轮循环中,num=num*进制+a[i];
		}

		int cnt = 0;
		do {
			int temp;
			temp = nnum % b;
			nnum /= b;
			if (temp >= 10) m[cnt++] = temp - 10 + 'A';
			else m[cnt++] = temp + '0';
		} while (nnum != 0);

		for (int i = cnt - 1; i >= 0; i--) {
			printf("%c", m[i]);
		}
		printf("\n");
	}
	return 0;
}

1943 Problem C 进制转换
不能直接用long long的整数,不够大,必须按位处理!
注意按位处理的方法!

#include<cstdio>
#include<cstring>

int main() {
	//30位数字远远大于long long范围,因此必须按位处理
	char a[35];
	int anum[35] = { 0 };
	int bnum[1000] = { 0 };
	while (scanf("%s", &a) != EOF) {
		int len = strlen(a);
		for (int i = 0; i < len; i++) {
			anum[i] = a[i] - '0';
		}

		int cnt = 0, n = 0;
		//注意以下按位处理的方法!
		while (n < len) {
			bnum[cnt++] = anum[len - 1] % 2;
			for (int i = n; i < len; i++) {
				if (anum[i] % 2 == 1) anum[i + 1] += 10;
				anum[i] /= 2;
			}
			if (anum[n] == 0) n++;
		}
		
		for (int i = cnt-1; i >=0; i--) {
			printf("%d", bnum[i]);
		}
		printf("\n");
	}
		
	return 0;
}

1944 Problem D 八进制

#include<cstdio>
#include<cstring>

int main() {
	long N = 0;
	
	while (scanf("%d", &N) != EOF) {
		int num[10000] = { 0 };
		int cnt = 0;
		do {
			num[cnt++] = N % 8;
			N /= 8;
		} while (N != 0);

		for (int i = cnt - 1; i >= 0; i--) {
			printf("%d", num[i]);
		}
		printf("\n");
	}
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值