http://codeup.cn/contest.php?cid=100000579
Time Limit: 1.000 Sec Memory Limit: 32 MB
Submit: 3542 Solved: 955
Description
输入两个不超过整型定义的非负10进制整数A和B(<=231-1),输出A+B的m (1 < m <10)进制数。
Input
输入格式:测试输入包含若干测试用例。每个测试用例占一行,给出m和A,B的值。
当m为0时输入结束。
Output
输出格式:每个测试用例的输出占一行,输出A+B的m进制数。
Sample Input
2 4 5
8 123 456
0
Sample Output
1001
1103
HINT
注意输入的两个数相加后的结果可能会超过int和long的范围。
代码(C++)
#include <cstdio>
using namespace std;
int main()
{
long long A, B, C, m;
while (scanf("%lld%lld%lld", &m, &A, &B), m)
{
C = A + B;
int ans[40], num = 0;
do {
ans[num++] = C % m;
C = C / m;
} while (C);
for (int i = num - 1; i >= 0; --i)
printf("%d", ans[i]);
printf("\n");
}
return 0;
}
Time Limit: 1.000 Sec Memory Limit: 32 MB
Submit: 2914 Solved: 737
Description
求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。
不同进制的表示符号为(0,1,...,9,a,b,...,f)或者(0,1,...,9,A,B,...,F)。
Input
输入只有一行,包含三个整数a,n,b。a表示其后的n 是a进制整数,b表示欲将a进制整数n转换成b进制整数。a,b是十进制整数,2 =< a,b <= 16。
Output
可能有多组测试数据,对于每组数据,输出包含一行,该行有一个整数为转换后的b进制数。输出时字母符号全部用大写表示,即(0,1,...,9,A,B,...,F)。
Sample Input
4 123 10
Sample Output
27
HINT
用字符串存储和表示不同进制的数。
提示:可能题目信息描述的不是很准确,我也读了很久。题目的意思是将a进制的n转换为b进制然后输出。很多人可能奇怪,既然都是整数了,为什么又扯到符号呢?其实这个“整数”的涵盖范围很大。比如十六进制的A6就是十六进制的整数,但用十进制表示不出来,所以用字母。所以输入的“整数”中是可能含有字母的,转换后的整数也是有可能含有字母的,因此要用字符串存储和表示不同进制的数。我代码中的重点在于对字符转数字以及数字转字符的处理。
代码(C++)
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
int a, b;
char n[40];
while (scanf("%d%s%d", &a, n, &b) != EOF)
{
int temp = 0, product = 1, num = 0; // 十进制数temp和乘积
for (int i = strlen(n) - 1; i >= 0; --i)
{
if (n[i] >= '0' && n[i] <= '9')
temp += (n[i] - '0') * product;
else if (n[i] >= 'a' && n[i] <= 'f')
temp += (n[i] - 87) * product;
else if (n[i] >= 'A' && n[i] <= 'F')
temp += (n[i] - 55) * product;
product *= a;
}
char ans[40];
do {
int y = temp % b;
ans[num++] = y >= 10 ? y + 55 : y + '0'; // 注意+55和+'0'的区别
temp /= b;
} while(temp);
ans[num] = '\0';
for (int i = num - 1; i >= 0; --i)
printf("%c", ans[i]);
printf("\n");
}
return 0;
}
Time Limit: 1.000 Sec Memory Limit: 32 MB
Submit: 1699 Solved: 614
Description
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
Input
多组数据,每行为一个长度不超过30位的十进制非负整数。
(注意是10进制数字的个数可能有30个,而非30bits的整数)
Output
每行输出对应的二进制数。
Sample Input
985
211
1126
Sample Output
1111011001
11010011
10001100110
提示:非常好的一个题目,强烈建议一定要完全弄懂。最基本的思路是:用字符串来存储数字,即使是long long也只能存到18位整数;然后我们勇字符串数组模拟除法,实质就是针对每一位的除法。这是很方便的,比如5 / 2,在计算机中得到的结果就是2,也就是商,而它的余数可作为后一位的“补10”处理。注意啦,这里的“补10”要好好理解一下。最后要注意的就是在哪里设置循环,用什么循环(结合本博客最上方的常用模板那句话来理解),循环的条件怎么设置,什么时候字符转数字什么时候又反过来。
代码(C++)
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
char dec[40];
while (scanf("%s", &dec) != EOF)
{
char bin[500];
int num = 0, re;
do
{
re = 0;
for (int i = 0; dec[i] != '\0'; ++i) // 进行每一位的除法,每位的余数向后一位进位
{
int temp = re; // 用temp保存前一位的进位
re = (dec[i] - '0') % 2; // 求出余数,更新进位
dec[i] = (dec[i] - '0'+ temp * 10) / 2 + '0'; // 做除法,记得+'0'转换为字符
}
bin[num++] = re + '0'; // 最后剩下的余数就是二进制位,别忘记re是整数,要转为字符
if (dec[0] == '0' && strlen(dec) != 1) // 如果做完除法后最高位为0,且此时还不是个位数,则需要字符串前移
{
int j = 0;
for (int i = 1; dec[i] != '\0'; ++i)
dec[j++] = dec[i];
dec[j] = '\0'; // 别忘加字符串终止符
}
} while (dec[0] != '0');
bin[num] = '\0';
for (int i = num - 1; i >= 0; --i)
printf("%c", bin[i]);
printf("\n");
}
return 0;
}
Time Limit: 1.000 Sec Memory Limit: 32 MB
Submit: 782 Solved: 581
Description
输入一个整数,将其转换成八进制数输出。
Input
输入包括一个整数N(0<=N<=100000)。
Output
可能有多组测试数据,对于每组数据,
输出N的八进制表示数。
Sample Input
9
8
5
Sample Output
11
10
5
代码(C++)
#include <cstdio>
using namespace std;
int main(){
int N;
while (scanf("%d", &N) != EOF){
int ans[40], num = 0;
do {
ans[num++] = N % 8;
N = N / 8;
} while (N);
for (int i = num - 1; i >= 0; --i)
printf("%d", ans[i]);
printf("\n");
}
return 0;
}
SakuraJI(https://blog.csdn.net/qq_37701948/article/details/103587109)
版权所有:可定博客 © WNAG.COM.CN
本文标题:《Contest100000579 – 《算法笔记》3.5小节——入门模拟->进制转换》
本文链接:https://cloud.tencent.com/developer/article/1616892
特别声明:除特别标注,本站文章均为原创,本站文章原则上禁止转载,如确实要转载,请电联:wangyeuuu@qq.com,尊重他人劳动成果,谢过~