——————————————————————————————
进制转换
——————————————————————————————
素数判断 + 十进制与n进制相互转换
1015
//核心: 进制转换 + 判断素数
//1.进制转换
// (1)十进制转d进制:
// 1)vector<int>bits
// 2)while(n){
// bits.push_back(n%d);
// n/=d;}
// 3)reverse(bits.begin(), bits.end());
// (2)d转十进制:
// 1)int result=0;
// 2)for(int i=0;bits[0];i++)result= result*10 +bits[i];
//2.判断素数
// !!!!!!绝对不要忘了等号
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n, d, flag=1;
bool isPrime(int x) {
if (x == 0 || x == 1)return false;
for (int i = 2; i*i <= x; i++)
if (x%i == 0)return false;
return true;
}
int main() {
while (scanf("%d", &n)) {
if (n < 0)break;
scanf("%d", &d);
flag = 1;
if (!isPrime(n)){
printf("No\n");
continue;
}
//转d进制, 倒过来
vector<int>bits;
while (n) {
bits.push_back(n%d);
n /= d;
}
//转成十进制
int result = 0;
for (int i = 0; i < bits.size(); i++) {
result = result * d + bits[i];
}
//判断素数
if (isPrime(result))printf("Yes\n");
else printf("No\n");
}
return 0;
}
回文数, 十进制转n进制
1019
//1.scanf用lld接收long long
//2.见到10^9要警觉, 要不long long, 要不string
//3.非字符串方法判断回文数: 两头往中间夹(for循环两个变量)
//4.十进制转n进制, while循环写n就好, 后面不用再多一行
//5.这里之前用string写, 有很多问题, 以后尽量vector
//核心: 十进制转base进制 + vector<int>判断回文数
//1.十进制转base进制
// (1)vector<int>bits;
// (2)while(n){
// bits.push_back(n%base);
// n/=base;
// }
// (3)reverse(bits.begin(), bits.end());
//2.vector<int>判断回文数 :
// for(int i=0, j=v.size()-1;i<=j;i++,j--)
// if(v[i]!=v[j])flag=0;
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n, base;
bool isPalindromic(vector<int> v) {
int flag = 1;
for (int i = 0, j = v.size() - 1; i<=j; i++, j--)
if (v[i] != v[j]) {
flag = 0;
break;
}
return flag;
}
int main() {
scanf("%d %d", &n, &base);
//进制转换
vector<int>bits;
while (n) {
bits.push_back(n%base);
n /= base;
}
reverse(bits.begin(), bits.end());
//说0也是一个回文数
if (isPalindromic(bits))printf("Yes\n");
else printf("No\n");
for (int i = 0; i < bits.size(); i++) {
if (i != 0)printf(" ");
printf("%d", bits[i]);
}
printf("\n");
return 0;
}
十进制转十三进制 (高进制统一输出)
1027
//核心: 十进制转十三进制
// (1)核心思想: 十进制以上的需要特殊打印输出, 可以先以int的形式存起, 输出时判断是否<10
// (2)刚好两位: 第一位: / 第二位:%
// (3)十三进制输出:
// if(process[i]<10)printf("%d",process[i]);
// else printf("%c",process[i]-10+'A');
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
int a, b, c;
vector<int>inputs(3);
vector<int>process;
int main() {
scanf("%d %d %d", &inputs[0], &inputs[1], &inputs[2]);
//对每个数进行进制转换
for (int i = 0; i < 3; i++) {
process.push_back(inputs[i] / 13);
process.push_back(inputs[i] % 13);
}
//输出
printf("#");
for (int i = 0; i < process.size(); i++) {
if (process[i] < 10)printf("%d", process[i]);
else printf("%c", process[i] - 10 + 'A');
}
printf("\n");
return 0;
}
转n进制 + 数据超限(最好用加法直接做)
1058
//核心: 不同进制加法(类大数加法)+ 数据超限
//1.不同进制加法:
// (1)再次复习加法的核心思想: sum + 模 + 除
// (2)所以: 每位不同进制, 则每位“%”“/”不同的base即可
//2.第一次: 一个样例不过, 牛客所有样例不过
// (1)统一转成最小位进制: (想要练习关于时间进制的转化)
// (2)!!!!!!如果预判结果数据可能超限, 运算数最好也使用long long, 因为中间结果应该是存储在和操作数相同的变量里面
// (3)其他方法: 不进行向大数转化, 各位直接按大数相加减
//3.某数转其他进制的核心思想: 先模,后除
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
int a1, a2, a3, b1, b2, b3;
int main() {
scanf("%d.%d.%d %d.%d.%d", &a1, &a2, &a3, &b1, &b2, &b3);
int c1, c2, c3, carry;
c3 = (a3 + b3)%29;
carry = (a3 + b3) / 29;
c2 = (a2 + b2 + carry)%17;
carry = (a2 + b2 + carry) / 17;
c1 = a1 + b1 + carry;
printf("%d.%d.%d\n", c1,c2,c3);
return 0;
}
// #include<iostream>
// #include<vector>
// #include<string>
// #include<algorithm>
// using namespace std;
// long long a1, a2, a3, b1, b2, b3;
// int main() {
// scanf("%lld.%lld.%lld %lld.%lld.%lld", &a1, &a2, &a3, &b1, &b2, &b3); //必须要用lld接收, 否则中间结果运算溢出
// long long in1, in2, in3;
// in1 = a1 * 17 * 29 + a2 * 29 + a3;
// in2 = b1 * 17 * 29 + b2 * 29 + b3;
// in3 = in1 + in2;
// long long c1, c2, c3;
// c3 = in3 % 29;
// c2 = (in3 /29)%17;
// c1 = in3 / (29 * 17);
// printf("%lld.%lld.%lld\n", c1,c2,c3);
// return 0;
// }
转13进制 + 使用初始化vector和map + getline的使用
1100
//说实话: 这道20的题目自己做, 挺快乐
//核心: 周全地模拟(分支条件较多) + 转13进制
//1.初始化vector, map的方法:
// (1)vector: vector<string>v={"a", "b", "c"};
// (2)map: map<sting, int>m={{"abc", 1},{"def", 2}};
//2.如何用分隔符分开用getline()获得的string:
// (1)getline(stream, str, '分隔符');
// 1)即getline是三个参数
// 2)stream: 可以是cin, 可以是stringstream输入string获得
//3.!!!!!!使用getline之前要用getchar()
// (1)具体的情况是: 上一步刚输入n, 那么后面有一个‘\n’
// (2)所以, 用getline()之前一定要看, 前面的情况
//4.这道题逻辑上小的分支比较多: 不要怕, 其实测试样例, 只要你动手了, 是不是一般都能过?
#include<iostream>
#include<vector>
#include<string>
#include<map>
#include<algorithm>
using namespace std;
int n;
map<string, int>map1 = {
{ "tret",0 },{"jan", 1}, {"feb",2}, { "mar",3 }, { "apr",4 }, { "may",5 }, { "jun",6 },
{ "jly",7 }, { "aug",8 }, { "sep",9 }, { "oct",10 }, { "nov",11 }, { "dec",12 }
};
map<string, int>map2 = {
{ "tret", 0}, { "tam", 1}, { "hel", 2}, { "maa", 3}, { "huh", 4}, { "tou", 5}, { "kes", 6},
{ "hei", 7}, { "elo", 8}, { "syy", 9}, { "lok", 10}, { "mer", 11}, { "jou", 12}
};
vector<string>v1 = { "tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec" };
vector<string>v2 = { "tret","tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou" };
int sToi(string str) {
int number = 0;
string str1, str2;
str1 = str.substr(0, 3), str2 = "tret";
if (str.length() == 3) {
if (map1.find(str1) != map1.end())return map1[str1];
else return map2[str1]*13;
}
else {
str2 = str.substr(4, 3);
return map2[str1] * 13 + map1[str2];
}
}
string iTos(string str) {
int number = stoi(str);
string result = "";
vector<int>bits(2);
if(number>=13)bits[0]=number /13;
bits[1]=number % 13;
if (bits[0] == 0)return v1[bits[1]];
else {
result += v2[bits[0]];
if (bits[1] != 0) {
result += " ";
result += v1[bits[1]];
}
return result;
}
}
int main() {
scanf("%d", &n);
string input;
getchar();
for (int i = 0; i < n; i++) {
getline(cin, input);
//printf("###%s\n", input.c_str());
if (input[0] >= 'a'&&input[0] <= 'z')printf("%d\n", sToi(input));
else printf("%s\n", iTos(input).c_str());
}
return 0;
}
进制转换+二分法(进制上下界)(上:别人代码, 下:自己没过)
1010
//1.单词radix: 基数
//2.进制转换有字母时别忘+10
//3.别的进制转十进制: sum=sum*10 + bit*radix;
//4.下界: bit中最大的数, 上界:max(另一个数,下界+1)
#include "pch.h"
#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
int conversion10(string str, int r) {
int sum = 0;
for (int i = 0; i < str.length(); i++) {
if(str[i]>='0'&&str[i] <= '9')sum = sum * r + (str[i] - '0');
else sum = sum * r + (str[i] - 'a'+10);
}
return sum;
}
int main() {
string str1, str2;
int n1, n2, tag, radix,tmp;
cin >> str1 >> str2;
scanf("%d %d", &tag, &radix);
if (tag == 1) {
if(radix != 10)n1 = conversion10(str1, radix);
else n1 = stoi(str1);
for (int i = 2; i < 1000000000; i++) {
tmp = conversion10(str2, i);
if (tmp < 0)break;
if (tmp == n1) {
printf("%d", i);
return 0;
}
else if (tmp > n1)break;
}
if (tmp != n1)printf("Impossible\n");
}
if (tag == 2) {
if(radix != 10)n2 = conversion10(str2, radix);
else n2 = stoi(str2);
for (int i = 2; i < 1000000000; i++) {
tmp = conversion10(str1, i);
if (tmp < 0)break;
if (tmp == n2) {
printf("%d", i);
return 0;
}
else if (tmp > n2)break;
}
if (tmp != n2)printf("Impossible\n");
}
return 0;
}