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

⭐问题 A: 又一版 A+B
问题描述:输入两个不超过整型定义的非负10进制整数A和B(<=231-1),输出A+B的m (1 < m <10)进制数。

  • 输入
测试输入包含若干测试用例。
每个测试用例占一行,给出m和A,B的值。
当m为0时输入结束。
  • 输出
每个测试用例的输出占一行,输出A+B的m进制数。
  • 样例输入
2 4 5
8 123 456
0
  • 样例输出
1001
1103

没有加==0判断break,会报黄错,运行错误,奇怪的运行错误增加了

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
int main()
{
	long long a, b;
	int d;
	
	int num;
	while (scanf("%d", &d) != EOF)
	{
		if (d == 0)
			break;
		long long sum;
		scanf("%lld %lld", &a, &b);
		sum = a + b;
		//printf("%lld\n", C);
		int c[40];
		num = 0;
		do {
			c[num++] = sum % d;
			sum /= d;
		} while (sum != 0);
		for (num = num - 1; num >= 0; num--)
			printf("%d", c[num]);
		printf("\n");
	}
		return 0;
}

⭐⭐问题 B: 数制转换
问题描述:求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。
不同进制的表示符号为(0,1,…,9,a,b,…,f)或者(0,1,…,9,A,B,…,F)。

  • 输入
输入只有一行,包含三个整数a,n,b。
a表示其后的n 是a进制整数,b表示欲将a进制整数n转换成b进制整数。
a,b是十进制整数,2 =< a,b <= 16
  • 输出
可能有多组测试数据,对于每组数据,输出包含一行,该行有一个整数为转换后的b进制数。
输出时字母符号全部用大写表示,即(01...9,A,B,...,F)。
  • 样例输入
4 123 10
  • 样例输出
27

这题主要注意字符串和数字的转换
0-9:16进制30H-39H
10进制48-57
A-B:10进制65开始
a-b:10进制97开始(差了32)

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>

int main()
{
	long int a, b;
	long int y;
	int len;
	int product;
	char n[40];
	int i;
	int temp;
	while (scanf("%ld %s %ld", &a, n, &b) != EOF)
	{	
		//首先把数组n[i]中的字符都变成数字
		len = strlen(n);
		for (i = len-1; i >= 0; i--)
		{	
			if ((n[i] <= '9') && (n[i] >= '0'))
				 n[i] -= '0';
			else if ((n[i] <= 'F') && (n[i] >= 'A'))
				n[i] =n[i]- 'A'+10;
			else if ((n[i] <= 'f') && (n[i] >= 'a'))
				n[i] = n[i] - 'a' + 10;
			else 
				;
		}
		//然后计算10进制y
		y = 0; product = 1;
		for (i = len - 1; i >= 0; i--)
		{
			y = y + n[i] * product;
			product *= a;
		}
		//输出10进制的y查看结果
		//printf("y:%d\n", y);
		
		//将10进制的y转化为b进制的z		
		
		long int z[40] = {0};
		product = 0;
		do {
			temp = y % b;
			if ((temp >= 0) && (temp <= 9))				
				z[product++] = temp + '0';		
			else if ((temp >= 10) && (temp <=15))
				z[product++] = temp - 10 + 'A';
			else
				;
			y = y / b;
		} while (y != 0);
		//输出数组
		for (product = product - 1; product >= 0; product--)
		{			
				printf("%c", z[product]);			
		}
		printf("\n");
		//记得memset两个数组
		memset(n, '\0', sizeof(n));
		memset(z, '\0', sizeof(z));
	}
	return 0;
}

⭐⭐⭐问题 C: 进制转换
问题描述:将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。

  • 输入
多组数据,每行为一个长度不超过30位的十进制非负整数。
(注意是10进制数字的个数可能有30个,而非30bits的整数)
  • 输出
每行输出对应的二进制数。
  • 样例输入
985
211
1126
  • 样例输出
1111011001
11010011
10001100110

这题代码很好玩,十进制的字符串变二进制代码,一个难点就是即使是long long int类型也最多只能表示大约18位数字,所以十进制的数也要用字符串存储;

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
int main()
{
    char s[32]; //将十进制字符串转换为倒排的二进制字符串, 需模拟多次数字取余和除法
    while (scanf("%s",s)!=EOF) {
        char nums[100] = {};
        int numsSize = 0, sum = 1; //numsSize是nums数组的大小,sum是while的判断条件
        while (sum) { //当十进制字符还未除完时继续循环
            sum = 0; //每一次十进制字符串除以2都恢复0
            for (int i = 0; s[i]; i++) {
                int digit = s[i] - '0';
                int x = digit / 2;
                sum += x;
                if (s[i + 1]) {//如果不是最后一位,就让后一位加上
                    s[i + 1] += (digit % 2 * 10);
                }
                else {//如果是最后一位或者后一位是0,那就算最后一位是奇数还是偶数,如果是奇数,就算成1,如果是偶数,就算成0
                    nums[numsSize++] = digit % 2 + '0'; //从低位向高位存入取余的字符
                }
                s[i] = x + '0'; //让该位变回字符
            }
        }
        //完成-输出结果
        for (int k = numsSize - 1; k >= 0; k--) {
            printf("%c", nums[k]);
        }
        printf("\n");
    }
	return 0;
}

问题 D: 八进制
问题描述:输入一个整数,将其转换成八进制数输出。

  • 输入
 输入包括一个整数N(0<=N<=100000)
  • 输出
可能有多组测试数据,对于每组数据,
输出N的八进制表示数。
  • 样例输入
9
8
5
  • 样例输出
11
10
5

这题就是简单的进制转换啦,没有任何坑,数字只要取到int即可

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
//const int maxn =85;
//char a[maxn];
int main()
{
	int N;
	int z[40] = { 0 };
	int num;
	int i;
	while (scanf("%d", &N) != EOF)
	{
		num = 0;
		do {
			
			z[num++] = N % 8;
			N /= 8;
		} while (N != 0);
		for (i=num-1; i>=0; i--)
			printf("%d",z[i]);
		printf("\n");
		memset(z,'\0',sizeof(z));
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值