PAT----字符串处理, 数学--------进制转换

——————————————————————————————

进制转换

——————————————————————————————

 

素数判断 + 十进制与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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值