蓝桥杯算法训练合集十七 1.数字反转2.试题39713.矮人采金子4.筛法5.机器指令

目录

1.数字反转

2.试题3971

3.矮人采金子

4.筛法

5.机器指令


1.数字反转

问题描述

给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例 2) 。

输入格式

输入共 1 行,一个整数 N。

输出格式

输出共 1 行,一个整数,表示反转后的新数。

样例输入1

123

样例输出1

321

样例输入2

-830

样例输出2

38

数据规模和约定

-1,000,000,000 ≤ N≤1,000,000,000。

示例代码

#include 
using namespace std;

int main() {
	string str;
	cin >> str;
	int len = str.length();
	if (str[0] == '-') {//如果是负数
		cout << "-";
		int flag = 0;
		for (int i = len - 1; i > 0; i--) {
			if (str[i] == '0') {
				if (flag == 1) {
					cout << str[i];
				}
			}
			else {
				cout << str[i];
				flag = 1;
			}
		}
	}
	else {
		int flag = 0;
		for (int i = len - 1; i >= 0; i--) {
			if (str[i] == '0') {
				if (flag == 1) {
					cout << str[i];
				}
			}
			else {
				cout << str[i];
				flag = 1;
			}
		}
	}
	return 0;
}

2.试题3971

问题描述

有一些正整数,如果这个正整数分解质因数之后,只包含2或3或5,那么该数即为“丑数”,比如100就是“丑数”,100分解质因数之后只包含2和5;14就不是“丑数”,因为14分解质因数之后,包含了7.

输入正整数n,请写程序判断n是否是“丑数”,是“丑数”则输出“yes”,否则输出“no”。

输入格式

一个正整数n

输出格式

一个字符串yes 或no

样例输入

15

样例输出

yes

样例输入

242

样例输出

no

数据规模和约定

n不超过C语言整型范围

示例代码

#include 
using namespace std;
void dfs(int n) {
	if (n == 1) {
		cout << "yes";
		return ;
	}
	if (n % 2 == 0) {
		dfs(n / 2);
	}
	else if(n%3==0){
		dfs(n / 3);
	}
	else if (n % 5 == 0) {
		dfs(n / 5);
	}
	else {
		cout << "no";
		return;
	}
}
int main() {
	int n;
	cin >> n;
	if (n == 1) {//1比较特别
		cout << "no";
		return 0;
	}
	dfs(n);
	return 0;
}

3.矮人采金子

问题描述

矮人们发现了 N 个新的金矿。据测算,开采第 i 个金矿会带来 Ai 个金币的收入。但是,开采一个金矿本身需要花费 1000 个金币来开挖隧道。矮人们可以选择是否开采每个金矿。他们想知道,通过合理的选择,他们最多可以有多少个金币的净收入。你能回答他们的问题吗?

输入格式

第一行包含一个正整数 N 。(1 ≤ N ≤ 100)。
  第二行为 N 个用空格隔开的非负整数,其中第 i 个数表示 Ai,每个数
  不超过 10000。

输出格式

输出仅一行,只包含一个数字,即矮人们所能获得的最高的净收入。

样例输入

4
2012 999 1481 23

样例输出

1493

示例代码

#include 
using namespace std;

int main() {
	int n,a,sum=0;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> a;
		if (a > 1000) {
			sum += (a - 1000);
		}
	}
	cout << sum;
	return 0;
}

4.筛法

问题描述

炫炫学了筛法之后,很想用筛法求欧拉函数。他决定求1到N的所有数的欧拉函数值。

输入格式

输入的第一行包含1个整数n,。

输出格式

输出若干行,每行包含一个整数,第i行表示i的欧拉函数值

样例输入

2

样例输出

1

1

数据规模和约定

n<=500000

示例代码

#include 
using namespace std;
void phi(int n) {
	double res=double(n);
	for (int i = 2; i * i <= n; i++) {
		if (n % i == 0) {
			res = res * (i - 1) / i;
			while (n % i == 0) {
				n /= i;
			}
		}
	}
	if (n > 1) {
		res = res * (n - 1) / n;
	}
	cout << int(res) << endl;
}

int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		phi(i);
	}
	return 0;
}

5.机器指令

我觉得测试点是错的

问题描述

A同学在一台简陋的计算机上运行程序H。(同《计算机科学导论》一书的附录C)假设这台机器的CPU仅有16个通用寄存器(register)(用十六进制的0到F编号),主存只有256个内存单元(memory cell)(用十六进制00到FF编号),每个机器指令长两个字节(用十六进制数表示),各种指令的解释如下:
1RXY 将内存单元XY里的数据复制到寄存器R中
2RXY 将数据XY存至寄存器R中
3RXY 将寄存器R中的数据复制到内存单元XY中
40RS 将寄存器R中的数据复制到寄存器S中
5RST 将寄存器S和寄存器T中储存的整数相加并存放在寄存器R中
BRXY 如果寄存器R中的内容和寄存器0中的内容相同,则程序计数器指向XY内存单元(执行JUMP操作),否则程序按原来流程继续运行
C000 结束程序
在一个指令循环中,CPU每次提取程序计数器指向的内存单元和下一个内存单元中两个十六进制数组成的四位十六进制数作为机器指令并执行,若在指令执行时未进行JUMP操作,则把程序计数器向后移两个单元。一旦程序开始运行,CPU将进入指令循环直到出现“结束程序”的命令为止(C000)。现在这个程序H只需使用从00到0F的内存单元,且在程序开始前程序计数器(program counter)已经指向了00单元。输入程序H运行前00到0F内存单元里存放的数据,请输出程序H结束后00到0F内存单元里的数据。

输入格式

输入一行16个十六进制数(每个十六进制数占两位,可能以0开头),用空格隔开,分别表示程序H运行前00到0F内存单元中存放的数据。

输出格式

输出一行16个十六进制数(每个十六进制数占两位,可能以0开头),用空格隔开,分别表示程序H结束后00到0F内存单元中存放的数据。

样例输入

2A 99 3A 00 1A 03 3A 02 C0 00 00 00 00 00 00 00

样例输出

99 99 00 00 1A 03 3A 02 C0 00 00 00 00 00 00 00

样例说明

运行指令2A99:将十六进制数99存至寄存器A中;
运行指令3A00:将寄存器A中的数据(99)复制到内存单元00中;
运行指令1A03:将内存单元03里的数据(00)复制到寄存器A中;
运行指令3A02:将寄存器A中的数据(00)复制到内存单元02中;
运行指令C000:结束程序。

示例代码

#include 
using namespace std;
int a[16] = { 0 }, b[16] = { 0 };
int find_index(char n) {//16进制转化为10进制
	if (n >= '0' && n <= '9') {
		return int(n) - 48;
	}
	else {
		return int(n) - 55;
	}
}
void shizhuanshiliu(int n) {//10进制转化为16进制输出
	int first, second;
	first = n / 16;
	second = n % 16;
	if (first >= 10) {
		cout << char(first + 55);
	}
	else {
		cout << char(first + 48);
	}
	if (second >= 10) {
		cout << char(second + 55) << " ";
	}
	else {
		cout << char(second + 48) << " ";
	}
	return;
}
int main() {
	string str;
	int flag = 0, count = 0;
	for (int i = 0; i < 16; i++) {
		cin >> str;
		a[i] = find_index(str[0]) * 16 + find_index(str[1]);//为储存的数据
		b[i] = a[i];//命令
	}
	while (b[count]/16!=12){//当首字母为C就结束
		if (b[count] / 16 == 1) {//将内存单元XY里的数据复制到寄存器R中
			int temp = b[count] % 16;
			count++;
			a[temp] = a[b[count]];
			count++;
		}
		else if (b[count] / 16 == 2) {//将数据XY存入寄存器R中
			int temp = b[count] % 16;
			count++;
			a[temp] = a[count];
			count++;
		}
		else if (b[count] / 16 == 3) {//将寄存器R中的数据复制到寄存器XY中
			int temp = b[count] % 16;
			count++;
			a[b[count]] = a[temp];
			count++;
		}
		else if (b[count] / 16 == 4) {//将寄存器R中的数据复制到寄存器S中
			count++;
			a[b[count] % 16] = a[b[count] / 16];
			count++;
		}
		else if (b[count] / 16 == 5) {//将寄存器S和寄存器T中储存的数相加并存放在寄存器R中
			int temp = b[count] % 16;
			count++;
			a[temp] = a[b[count] / 16] + a[b[count] % 16];
			count++;
		}
		else if (b[count] / 16 == 11) {//如果寄存器R中的内容和寄存器0的内容相同,则程序计数器指向XY内存单元,否则程序按照原来流程继续运行
			int temp = b[count] % 16;
			count++;
			if (temp == a[0]) {
				count = a[b[count]];
			}
			else {
				count++;
			}
		}
	}
	for (int i = 0; i < 16; i++) {
		shizhuanshiliu(a[i]);
	}
	return 0;
}

你可能感兴趣的:(蓝桥杯,蓝桥杯,职场和发展)