纯粹合数
属于字符串的内容
题目
-
问题描述
明明的爸爸是一位数学家,明明受他爸爸的影响从小就喜欢数学,经常向他爸爸学习或请教数学问题。
一天,明明问他爸爸什么是合数,明明的爸爸回答说:"首先,合数都是大于1的整数,其次合数是除了1和其本身外,还能被至少一个其他自然数整除的数,例如'4'这个数,它除了能被1和4整除外,还能被2整除,因此'4'就是合数;但是'3'就不是合数,因为3只能被1和3这两个数整除,因此'3'不是合数。"
聪明的明明很快就理解了他爸爸的意思,于是又接着问他爸爸:"那什么又是纯粹合数呢?"明明的爸爸接着回答说:"一个合数,去掉最高位,剩下的数是0或仍是合数;再去掉剩下的数的最高位,剩下的数还是0或合数;这样反复,一直到最后剩下的一位数仍为0或合数;我们把这样的数称为纯粹合数。
例如'100'这个数,它能被1、2、4、5、10、20、50、100整除,因此100是个合数,我们去掉它的最高位,剩下的数是0(其实剩下的应该是00,但是前置0对一个整数来说没有意义,因此前置0被舍去,就剩下个位数上的0),因此'100'是一个纯粹合数。有趣的是,100是最小的一个三位纯粹合数。
再例如'104'这个数,104能被1、2、8、13、26、52、104整除,所以104是个合数;我们去掉它的最高位后剩下4,4能被1、2、4整除,所以4也是合数,所以'104'是一个纯粹合数。
但是'101'就不是纯粹合数,因为'101'只能被1和101这两个数整除。"
明明对他爸爸的回答很满意,于是自己动手从100开始寻找纯粹合数,他一共找到了100个纯粹合数,调皮的明明开始反过来考爸爸了,问他爸爸能否告诉他第2个大于等于100的纯粹合数是哪个?第3个大于等于100的纯粹合数又是哪个?......明明的爸爸被这个突如其来的问题给难住了,他无法立刻回答出来,于是请求你的帮助,帮助他回答明明的这个问题。
明明的问题可以归结为:根据一个正整数n,求出从100开始从小到大的第n个纯粹合数。 -
输入说明
你写的程序需要从标准输入设备(通常为键盘)中读入多组测试数据,每组测试数据仅占一行,每行仅包括一个正整数n(1 ≤ n ≤ 100)。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。 -
输出说明
对于每一组测试数据,你写的程序需要计算出一组相应的运算结果,并将每组运算结果依次写入到标准输出设备(通常为启动该程序的文本终端,例如Windows中的命令行终端)中。每组运算结果为一个整数,即从100开始从小到大的第n个纯粹合数。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。 -
输入范例
10
2
1 -
输出范例
124
104
100
解题思路
- 首先从100开始按从小到大的顺序逐个枚举整数,对于每一个数先判断它本身是否为合数;若是合数,则将该数转换为字符串形式,反复删除最高位(即删除字符串的第一个字符),每删除一次就把剩余部分转回整数进行判断,如果剩下的数为0或仍为合数,则继续处理,否则该数不是纯粹合数;如果一直删除到只剩一位且始终满足条件,则该数为纯粹合数。按顺序统计纯粹合数的个数,当计数达到输入的n时,当前数即为答案。
整体代码
cpp
#include <iostream>
#include <vector>
#include <string>
using namespace std;
// 判断一个数是否为合数
bool isComposite(int x) {
if (x <= 3) return false; // 1、2、3都不是合数
for (int i = 2; i * i <= x; i++) {
if (x % i == 0) return true;
}
return false;
}
// 判断是否为纯粹合数
bool isPureComposite(int x) {
if (!isComposite(x)) return false;
string s = to_string(x);
// 逐步删除最高位
while (s.length() > 1) {
s.erase(0, 1);
int val = stoi(s);
if (val == 0) continue;
if (!isComposite(val)) return false;
}
// 最后一位
int last = stoi(s);
if (last == 0) return true;
return isComposite(last);
}
int main() {
// 预处理前100个纯粹合数
vector<int> pure;
int num = 100;
while (pure.size() < 100) {
if (isPureComposite(num)) {
pure.push_back(num);
}
num++;
}
int n;
while (cin >> n) {
cout << pure[n - 1] << endl;
}
return 0;
}
注意事项
- 注意合数定义为大于1且除了1和自身外还有其他因数的数,因此1、2、3都不是合数,需要单独处理。
找出质数
属于字符串的内容
题目
-
问题描述
明明学习数学已经有一段时间了。一次老师在课上讲了什么叫质数。质数就是大于等于2且只能被1和其本身整除的整数。明明觉得这很简单,以为这很容易掌握,于是就不多做练习。明的爸爸发现了这个问题,他想让明明多做练习,把质数这个知识点掌握牢固。但是,他也知道只是求质数会很无聊,明明一定不愿意多做。于是他想出了一个游戏,这个游戏叫"找出质数",就是给明明一个数字串,要叫明明在这个数字串中找出一个最大的子串,要求这个子串是一个质数。 但是由于明明还太小,他的计算能力有限,因此明明的爸爸认为,找出长度大于4个字符的质数对明明来说太困难了。于是他降低了要求,只需找出小于10,000的最长的质数子串即可。 例如:有一个数字串为17,最大的子串就应该是17,因为1不是质数,7虽然是质数,但是7的长度只有1,17也是质数,它的长度为2,因此最大的子串就是17。 明明觉得这个游戏很有趣,就高兴地做了起来,明明的爸爸出了很多个数字串,由于数字串太多,所以明明爸爸自己找出最长的子串也要花很多的时间,于是明明的爸爸想让你帮他一个忙,写一个程序,找出数字串中最长的质数子串。
明明爸爸的问题可以归结为:输入一串数字,找出其中最长的不超过4个字符的质数子串。若有多个答案,则找出其中数值最大的一个。 -
输入说明
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅一行,每组测试数据为一个数字串,数字串的长度不超过20。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。 -
输出说明
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一个整数,即最长的不超过4个字符的质数子串(测试数据保证这个子串存在);若有多个答案,则输出其中数值最大的一个。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。 注:通常,显示屏为标准输出设备。 -
输入范例
17
121
1113 -
输出范例
17
2
113
解题思路
- 由于题目要求子串长度不超过4且数值小于10000,因此可以对输入的数字串按长度从4到1依次枚举所有连续子串,优先保证"最长";对于每个子串,将其转换为整数后判断是否为质数,如果是质数则记录下来,并在相同长度的情况下取数值最大的一个作为结果;一旦在某一长度下找到了至少一个质数子串,就无需再继续枚举更短长度,直接输出该长度中数值最大的结果即可。由于字符串最大长度仅为20、子串长度最多为4,枚举与判断的时间开销很小,可以直接按题意模拟实现。
整体代码
cpp
#include <iostream>
#include <string>
using namespace std;
// 判断是否为质数
bool isPrime(int x) {
if (x < 2) return false;
for (int i = 2; i * i <= x; i++) {
if (x % i == 0) return false;
}
return true;
}
int main() {
string s;
while (cin >> s) {
int n = s.length();
int answer = 0;
// 按长度从4到1枚举,保证最长
for (int len = 4; len >= 1; len--) {
if (len > n) continue;
int best = -1;
for (int i = 0; i + len <= n; i++) {
string sub = s.substr(i, len);
int num = stoi(sub);
if (isPrime(num)) {
if (num > best) best = num;
}
}
// 如果当前长度找到了质数子串
if (best != -1) {
answer = best;
break;
}
}
cout << answer << endl;
}
return 0;
}
注意事项
- 注意质数定义为大于等于2且只有1和自身两个因数,因此0和1都不是质数,需要在判断函数中特别处理。
翻译字符串
属于字符串的内容
题目
-
问题描述
在现代战争中,情报战越来越显示出它的重要性,敌我双方都想方设法得到对方的情报,然后一举歼灭对方。然而,随着加密技术的出现,对情报进行加密变得越来越频繁,想破解敌方的情报也越来越难。明明是一名富有经验的情报工作人员,他的主要任务就是破解敌方的情报,从而得到对己方有利的信息。在一次破解情报任务中,明明再次成功地破解了敌方的情报。明明的破解方法如下:一串以'@'为结束标志的字符串,从左至右对其进行翻译,若字符串中当前字符是整数n(0≤n≤9),则表示将后一个字符重复n+1次,不论后一个字符是否为数字,且后一个字符无需再次翻译;若当前字符非数字,则表示自己,无需翻译,直接输出即可。最后,输出翻译完的字符串。
例如字符串为:2d352d@,因为第一个字符为数字2,则将后一个字符d输出3次,而d则不需再翻译,然后翻译3,3也是一个数字,则将后一个字符5输出4次,而5则不需再翻译,然后翻译2,2也是一个数字,将后一个字符d输出3次,而d则不需再翻译,最后一个字符为@,表示自己,直接输出即可,最后的输出为:ddd 555 5dd d@;(注:在翻译时,'@'当作字符处理。) 这样翻译字符串的方法虽然简单,但是由于敌方的文件巨大,仅仅靠手工翻译是很难在短时间内完成的。于是明明就求助于你这位程序专家,按照明明提供的破译方法写一个程序,帮助明明快速把敌方文件翻译完成。
明明的问题可以归结为:按照文中提供的破译情报的方法,对字符串进行翻译,然后输出翻译后的字符串。 -
输入说明
你写的程序要求从标准输入设备(通常,键盘为标准输入设备)中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅占一行,每行包含一个以'@'为结束标志的字符串,字符串由数字、小写字母以及'@'组成,中间不包含空格,字符串长度不大于10。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。 -
输出说明
对于每一组测试数据你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备(通常,显示屏为标准输出设备)中。每组运算结果为经过翻译的字符串,字符串中的字符以三个为一组输出,每组字符之间用一个空格隔开。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。 -
输入范例
a1b2c3d4@
2d352d@
dsegweg@ -
输出范例
abb ccc ddd d@@ @@@
ddd 555 5dd d@
dse gwe g@
解题思路
- 首先从左到右遍历输入字符串,当遇到普通字符(非数字)时,直接加入结果字符串;当遇到数字字符n时,说明需要将其后一个字符重复输出n+1次,然后跳过这个被重复的字符,因为该字符不再参与后续翻译。需要注意数字后面的字符可以是数字、字母或"@",都按普通字符处理。完成整串翻译后,再按照题目要求将结果字符串按每3个字符分组输出,组与组之间用一个空格隔开,最后不足3个字符的一组也要正常输出。整个过程本质是字符串模拟与格式化输出。
整体代码
cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
while (cin >> s) {
string res = "";
int n = s.length();
for (int i = 0; i < n; i++) {
if (isdigit(s[i])) {
int times = s[i] - '0' + 1; // 重复次数
if (i + 1 < n) {
char nextChar = s[i + 1];
for (int k = 0; k < times; k++) {
res += nextChar;
}
i++; // 跳过下一个字符,因为它已经被处理
}
} else {
// 普通字符直接加入结果
res += s[i];
}
}
// 按每3个字符一组输出
int len = res.length();
for (int i = 0; i < len; i++) {
cout << res[i];
if ((i + 1) % 3 == 0 && i != len - 1) {
cout << " ";
}
}
cout << endl;
}
return 0;
}
注意事项
- 注意当遇到数字字符时,一定要将其转换为整数并按 n+1次重复后一个字符,同时要记得 i++ 跳过被重复的字符,否则会被再次处理。
英文段落翻译
自己翻译
1.软件开发
在软件开发过程中,计算机科学家和工程师学习软件设计的多种领域和技术,例如,在特定的项目中的最好的编程语言和算法的类型,如何高效的存储和检索信息,以及确切的计算机与软件的结合的计算限制。软件设计者在开发一个项目时,必须考虑许多因素。通常在一个领域的项目表现通过软件的大体运行的利益来体现。例如,由于计算机仅仅有一个存储总量的限制,软件设计者必须限制它们包含在一个项目里的特征的数量以便不会要求更多的内存使得匹配设计的系统能够供应。
软件工程是一个软件开发的领域,在其中,计算机科学家和工程师学习能够促进正确可靠健壮的计算机项目的高效开发的方式和工具。在这个计算机科学的分支的研究思考所有软件生命周期的现象,这通过一个正式的问题规范开始,并且进化到一个解决问题的设计,它的实现作为一个项目,项目的测试以及项目的维护。软件工程师开发软件工具和叫做工程环境的工具的集合来优化开发流程。例如,工具能够帮助管理被一个团队的项目开发者正在编写的一个巨大的项目的大部分零件。
2.计算机体系结构
相机体系结构是新的计算机系统的设计和分析。计算机架构师通过提升计算机的速度,存储能力和可靠性,以及减少他们的成本和能源消耗,来研究提高计算机的方式。计算机架构师提升软件和硬件模型,来分析现存的和提出的计算机设计的表现,然后使用这个分析来指导新计算机的开发。他们通常参与一个新的计算机的工程,因为他们的模型的准确性,依靠计算机的电路设计。许多计算机架构师热衷于开发针对于特殊应用的计算机,例如,图像处理,信号处理或者机械系统的控制。按照特定任务,对计算机体系结构进行优化,常常带来性能的,提高成本的降低,或者两者。
AI翻译
1 . 软件开发
在开发计算机软件时,计算机科学家与工程师需要研究软件设计的各个领域与技术,例如:针对特定程序应选用何种最佳编程语言与算法、如何高效存储与检索信息,以及特定软硬件组合的计算极限。软件开发者在设计程序时必须权衡诸多因素。通常情况下,程序的某一项性能必须为整体性能计而做出妥协。例如,由于计算机内存有限,软件设计者必须限制程序中包含的功能数量,以确保其所需内存不超过目标系统所能提供的容量。
软件工程是软件开发的一个领域,计算机科学家与工程师在此研究有助于高效开发正确、可靠且健壮的计算机程序的方法与工具。计算机科学的这一分支研究涵盖了软件生命周期的所有阶段:从正式的问题规约开始,进而推进到解决方案的设计、将其实现为程序、程序测试,直至程序维护。软件工程师开发各种软件工具及称为编程环境的工具集合,以改进开发流程。例如,工具可协助管理由程序员团队编写的大型程序中的众多组件。
2 . 计算机体系结构
计算机体系结构是对新型计算机系统的设计与分析。计算机体系结构专家研究通过提升速度、存储容量与可靠性,以及降低成本与功耗来改进计算机的途径。他们开发软件与硬件模型,用以分析现有及拟议计算机设计的性能,并据此指导新计算机的研发。计算机体系结构专家通常参与新计算机的工程实现,因为其模型的准确性取决于计算机电路系统的设计。许多计算机体系结构专家致力于开发面向特定应用(如图像处理、信号处理或机械系统控制)的专用计算机。针对特定任务优化计算机体系结构,往往能带来更高的性能、更低的成本,或两者兼得。
单词打卡

下一篇
待续