⭐问题 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进制数。
输出时字母符号全部用大写表示,即(0,1,...,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;
}