进制转换题

PAT (Advanced Level) Practice 进制转换题

目录

  • 《算法笔记》 重点摘要
  • 1015 Reversible Primes (20)
  • 1019 General Palindromic Number (20)
  • 1027 Colors in Mars (20)
  • 1058 A+B in Hogwarts (20)
  • 1100 Mars Numbers (20)

《算法笔记》 3.5 进制转换 重点摘要

P进制转换为Q进制,分两步

  • P进制转换为10进制
// y 为要求的 10进制数
// x 为 P 进制数,循环中每次取一位
// product 在循环中不断乘 P,得到 P 的幂次
int y = 0, product = 1;
while (x != 0){
y = y + (x % 10) * product;
x = x / 10;
product = product * P;
}
  • 10进制转换为Q进制
// 数组 z 用来存放所求 Q进制数的每一位
// num 为 Q进制数的位数
int z[40], num = 0;
do {
z[num++] = y % Q; // 除基取余法
y = y / Q;
} while (y != 0);
// z 数组从 z[num-1] 到 z[0] 即为所求

1015 Reversible Primes (20)

#include<cstdio>
bool isPrime(int n)
{
if (n <= 1) return false;
for (int i = 2; i * i <= n; i++)
if ( n % i == 0) return false;
return true;
}
int revD(int n, int D)
{
int n2D[20], num = 0, result = 0;
do {
n2D[num++] = n % D;
n = n / D;
} while(n > 0);
for (int i = 0; i < num; i++) result = result * D + n2D[i];
return result;
}
int main()
{
int n, D;
scanf("%d", &n);
while (n >= 0){
scanf("%d", &D);
printf("%s",isPrime(n) && isPrime(revD(n,D)) ? "Yes\n" : "No\n");
scanf("%d", &n);
}
return 0;
}
  • 记忆判断素数函数
  • 记忆进制转换函数
  • 注意:10进制转D进制后得到的D进制数是数组高位到地位,即反向,故转换回10进制时只要从低位开始加即可得到反转的D进制对应的10进制

1019 General Palindromic Number (20)

#include<cstdio>
int main()
{
int n, b, num = 0;
scanf("%d%d", &n, &b);
int bn[31] = {0};
do {
bn[num++] = n % b;
n = n / b;
} while (n > 0);
bool isPalindromic = true;
for (int i = 0; i < num/2; i++){
if (bn[i] != bn[num-1-i]){
isPalindromic = false;
break;
}
}
printf("%s", isPalindromic ? "Yes\n" : "No\n");
printf("%d", bn[num-1]);
for (int i = num - 2; i >= 0; i--) printf(" %d", bn[i]);
return 0;
}
  • 记忆进制转换函数,注意用 do while 保证 n 为0情况

1027 Colors in Mars (20)

#include<cstdio>
int main()
{
int r, g, b;
scanf("%d%d%d", &r, &g, &b);
char RGB[8];
char dec213[] = "0123456789ABC";
RGB[0] = '#';
RGB[1] = dec213[r/13];
RGB[2] = dec213[r%13];
RGB[3] = dec213[g/13];
RGB[4] = dec213[g%13];
RGB[5] = dec213[b/13];
RGB[6] = dec213[b%13];
RGB[7] = '\0';
printf("%s",RGB);
return 0;
}
  • char数组输出问题

    • 有初始化时尽量不要对字符数组长度进行定义,应该把这个长度交给系统来进行分配
    • 若用 %s 输出,要遇到 '\0' 符号的时候,才会停止输出,所以初始化字符数组的时候最好以 '\0' 结尾
    • 若不以 '\0' 作字符数组结尾,用 %s 输出会出错,只能逐个输出。
    • 使用字符串初始化字符数组时,比用字符逐个赋值要多占用一个字节,用于存放 '\0' ,同时字符数组的长度不会去计算 '\0' ,但是数组占有的字节数会将 '\0' 算上,是由系统自行来进行处理的
  • 参考:柳婼小姐姐的代码
#include <cstdio>
using namespace std;
int main() {
char c[14] = {"0123456789ABC"};
printf("#");
for(int i = 0; i < 3; i++) {
int num;
scanf("%d", &num);
printf("%c%c", c[num/13], c[num%13]);
}
return 0;
}
  • 输入一个数处理一个数,逐个字符进行输出

1058 A+B in Hogwarts (20)

#include<cstdio>
int main()
{
int Galleon1, Sickle1, Knut1, Galleon2, Sickle2, Knut2, carrySickle = 0, carryGalleon = 0;
scanf("%d.%d.%d %d.%d.%d", &Galleon1, &Sickle1, &Knut1, &Galleon2, &Sickle2, &Knut2);
int Knut = Knut1 + Knut2;
if (Knut >= 29){
carrySickle = Knut / 29;
Knut = Knut % 29;
}
int Sickle = Sickle1 + Sickle2 + carrySickle;
if (Sickle >= 17){
carryGalleon = Sickle / 17;
Sickle = Sickle % 17;
}
int Galleon = Galleon1 + Galleon2 + carryGalleon;
printf("%d.%d.%d", Galleon, Sickle, Knut);
return 0;
}
  • 注意没有输入的数据要初始化,如carrySickle、carryGalleon
  • 注意要先保存进位再求余更新本位,否则会丢失进位信息

1100 Mars Numbers (20)

#include<string>
#include<map>
#include<iostream>
using namespace std;
int main()
{
string ones[13] = {"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
string tens[13] = {"", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
map<string, int> M2E;
for (int i = 0; i < 13; i++) M2E.insert(pair<string, int>(ones[i], i));
for (int i = 1; i < 13; i++) M2E.insert(pair<string, int>(tens[i], i*13));
int N;
cin >> N;
getchar();
string s;
for (int i = 0; i < N; i++){
getline(cin, s);
if (s[0] >= '0' && s[0] <= '9'){
int earth = stoi(s);
if (earth/13) cout << tens[earth/13];
if (earth/13 && earth%13) cout << " ";
if (earth%13 || earth == 0) cout << ones[earth%13];
cout << endl;
}
else{
int earth = 0;
if (s.length() > 4) earth = M2E[s.substr(0,3)] + M2E[s.substr(4,3)];
else earth = M2E[s];
cout << earth << endl;
}
}
return 0;
}
  • 题目坑点:13的整倍数输出时不用在低位加"tret",如39,应该输出maa而不是maa tret。
  • 注意:输入火星数字时中间可能有空格,需要用getline(),要用getchar()吸收前面输入N后的换行符。

PAT甲级 进制转换题_C++题解的更多相关文章

  1. PAT甲级 排序题_C++题解

    排序题 PAT (Advanced Level) Practice 排序题 目录 <算法笔记> 6.9.6 sort()用法 <算法笔记> 4.1 排序题步骤 1012 The ...

  2. 九度OJ 1194:八进制 (进制转换)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3521 解决:2058 题目描述: 输入一个整数,将其转换成八进制数输出. 输入: 输入包括一个整数N(0<=N<=100000 ...

  3. 九度OJ 1080:进制转换 (进制转换)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4583 解决:1076 题目描述: 将M进制的数X转换为N进制的数输出. 输入: 输入的第一行包括两个整数:M和N(2<=M,N< ...

  4. 九度OJ 1026:又一版 A+B (进制转换)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:11412 解决:3086 题目描述: 输入两个不超过整型定义的非负10进制整数A和B(<=231-1),输出A+B的m (1 < ...

  5. 九度OJ 1138:进制转换 (进制转换)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2388 解决:935 题目描述: 将一个长度最多为30位数字的十进制非负整数转换为二进制数输出. 输入: 多组数据,每行为一个长度不超过30 ...

  6. poj1220:高精度进制转换模板题

    今天撸3708  一直奇怪的re 就先放下了,写这个题的过程中学习了一个高精度进制转换,用这个模板写了1220 记录一下: #include <iostream> #include < ...

  7. 进制转换(NOIP2000&NOIP水题测试(2017082301))

    题目链接:进制转换 这题得明白其中的数学方法,明白后就不难了. 那么我们应该怎么计算呢? 其实也很简单. 我们依然采取辗转相除法. 但是,对于负的余数,我们需要进行一些处理. 我们怎么处理呢? 很简单 ...

  8. C++笔记(7)——一些模拟题:简单模拟、查找元素、图形输出、日期处理、进制转换、字符串处理

    以下内容基本来自<算法笔记>,作者为胡凡,建议直接买书看,我这里只是摘抄部分当笔记,不完整的. 简单模拟 就是一类"题目怎么说你就怎么做"的题目.这类题目不涉及算法,只 ...

  9. 洛谷P2084 进制转换

    题目背景 无 题目描述 今天小明学会了进制转换,比如(10101)2 ,那么它的十进制表示的式子就是 : 1*2^4+0*2^3+1*2^2+0*2^1+1*2^0, 那么请你编程实现,将一个M进制的 ...

随机推荐

  1. Python中匹配IP的正则表达式

    下面是IPv4的IP正则匹配表达式 import re #简单的匹配给定的字符串是否是ip地址,下面的例子它不是IPv4的地址,但是它满足正则表达式 if re.match(r"^(?:[0 ...

  2. docker 搭建registry

    Docke官方提供了Docker Hub网站来作为一个公开的集中仓库.然而,本地访问Docker Hub速度往往很慢,并且很多时候我们需要一个本地的私有仓库只供网内使用.Docker仓库实际上提供两方 ...

  3. 2019-12-10:win7,win12提权练习

    一.win7 1,上传webshell到服务器,访问 2,因为win7权限没设置好,导致任何命令都可以执行 直接提权成功,还可以通过msf工具利用exp进行提权,今天太晚了就先不做了 二.win201 ...

  4. 学习OpenCV双目测距原理及常见问题解答

    学习OpenCV双目测距原理及常见问题解答 转自博客:https://blog.csdn.net/angle_cal/article/details/50800775 一. 整体思路和问题转化.  图 ...

  5. Centos7 安装Redis,报错[adlist.o] Error jemalloc/jemalloc.h: No such file or directory

    redis官网 https://redis.io/download 安装 $ wget http://download.redis.io/releases/redis-5.0.4.tar.gz $ t ...

  6. Java枚举知识点

    近几天从单例模式及阿里开发手册中遇到枚举,之前没怎么关注过. 便学习一下,此次看了多方资料,并写Demo实现,记录下知识点,方便之后巩固. 枚举的两个优点: 1. 保证了类型安全:调用者无法随意传一个 ...

  7. [RK3399] 修改移动网络默认为4G

    CPU:RK3399 系统:Android 7.1 现在手机卡都默认是 4G 网路,但是源码中默认的还是 3G网络,每次都要手动改到 4G. 下面在源码中就直接将默认网络改为4G. PREFERRED ...

  8. SQL中AVG()、COUNT()、SUM()等函数对NULL值处理

    一.AVG() 求平均值 注意AVE()忽略NULL值,而不是将其作为“0”参与计算 二.COUNT() 两种用法 1.COUNT(*) 对表中行数进行计数 不管是否有NULL 2.COUNT(字段名 ...

  9. Javascript-基本类型

    数字 JavaScript不区分整数和浮点数,所有数字都用浮点数表示. 能够表示最大值是 -253 ~ 253,包含边界.超过范围的数无法保证低位数字的精度. JavaScript能直接识别十进制的整 ...

  10. 010-centos 端口问题

    1.nmap 安装 yum install nmap    #输入y安装 使用 nmap localhost    #查看主机当前开放的端口      nmap -p 1024-65535 local ...