找出质数
问题描述
明明学习数学已经有一段时间了。一次老师在课上讲了什么叫质数。质数就是大于等于2且只能被1和其本身整除的整数。明明觉得这很简单,以为这很容易掌握,于是就不多做练习。明的爸爸发现了这个问题,他想让明明多做练习,把质数这个知识点掌握牢固。但是,他也知道只是求质数会很无聊,明明一定不愿意多做。于是他想出了一个游戏,这个游戏叫“找出质数”,就是给明明一个数字串,要叫明明在这个数字串中找出一个最大的子串,要求这个子串是一个质数。 但是由于明明还太小,他的计算能力有限,因此明明的爸爸认为,找出长度大于4个字符的质数对明明来说太困难了。于是他降低了要求,只需找出小于10,000的最长的质数子串即可。 例如:有一个数字串为17,最大的子串就应该是17,因为1不是质数,7虽然是质数,但是7的长度只有1,17也是质数,它的长度为2,因此最大的子串就是17。 明明觉得这个游戏很有趣,就高兴地做了起来,明明的爸爸出了很多个数字串,由于数字串太多,所以明明爸爸自己找出最长的子串也要花很多的时间,于是明明的爸爸想让你帮他一个忙,写一个程序,找出数字串中最长的质数子串。
明明爸爸的问题可以归结为:输入一串数字,找出其中最长的不超过4个字符的质数子串。若有多个答案,则找出其中数值最大的一个。
总结
1. 难点在从小到大循环找子串,我通过两个循环实现
2. 字符串与整型的相互转换,通过sstream库实现
整型转换字符串:stringstream ss;ss << num;
字符串转换为整型:stringstream ss(s);ss >> num;
#include <bits/stdc++.h>
using namespace std;
bool isPrime(int num){
if(num <= 1){
return false;
}
if(num == 2){
return true;
}
if(num % 2 == 0){
return false;
}
int sqrt_n = int(sqrt(num));
for(int i = 3;i <= sqrt_n; i++){
if(num % i == 0){
return false;
}
}
return true;
}
int lookformax_num(string s,int lm){
int max_num = 0;
int lenth = 1;
while(lenth <= lm){
for(int i = 0;i < s.size() ;i++){
int num;
string s2 = s.substr(i,lenth) ;
stringstream ss(s2);
ss >> num;
if(isPrime(num)){
if(num > max_num){
max_num = num;
}
}
}
lenth++;
}
return max_num;
}
int main() {
string s;
while(cin >> s){
int lm;
int l;
if(s.size() > 4){
lm = 4;
}else{
lm = s.size() ;
}
cout << lookformax_num(s,lm) << endl;
}
return 0;
}
翻译字符串
问题描述
在现代战争中,情报战越来越显示出它的重要性,敌我双方都想方设法得到对方的情报,然后一举歼灭对方。然而,随着加密技术的出现,对情报进行加密变得越来越频繁,想破解敌方的情报也越来越难。明明是一名富有经验的情报工作人员,他的主要任务就是破解敌方的情报,从而得到对己方有利的信息。在一次破解情报任务中,明明再次成功地破解了敌方的情报。明明的破解方法如下:一串以‘@’为结束标志的字符串,从左至右对其进行翻译,若字符串中当前字符是整数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@;(注:在翻译时,‘@’当作字符处理。) 这样翻译字符串的方法虽然简单,但是由于敌方的文件巨大,仅仅靠手工翻译是很难在短时间内完成的。于是明明就求助于你这位程序专家,按照明明提供的破译方法写一个程序,帮助明明快速把敌方文件翻译完成。
明明的问题可以归结为:按照文中提供的破译情报的方法,对字符串进行翻译,然后输出翻译后的字符串。
总结
1. 输出n+1数字次,可以理解为,输出这个数字次,然后再输出这个数字本身
2. 每输出三次都需要输出一个空格
3. 需要对最后一次输出三次的情况做另外的考虑,因为最后一次输出不需要空格,其实可以加一个bool first,仅对第一次输出的三个,前方不需要空格,之后的三连输出,前方需要空格
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
while(cin >> s){
int count = 0;
for(int i = 0; i < s.size() ;i++){
int times = 0;
if(s[i] >= '0' && s[i] <= '9'){
times = s[i] - '0';
i++;
}
for(int j = 0;j < times;j++){
cout << s[i];
count++;
if(count == 3){
cout << " ";
count = 0;
}
}
cout << s[i];
count++;
if(count == 3 && i != s.size()-1){
cout << " ";
count = 0;
}
}
cout << endl;
}
return 0;
}
分割数字并排序
问题描述
输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。
你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。
总结
与之前刷的一道读取字符串的题类似,最后一个(或者一串)的字符容易忽略掉,我们可以在后面给他加上一个特殊字符,然后进行判断是否要输出来处理
#include <bits/stdc++.h>
using namespace std;
void divde(vector<int> &div,string s){
string s2;
for(int i = 0;i < s.size() ;i++){
if(s[i] != '5'){
s2 += s[i];
}
else{
int num;
if(!s2.empty() ){
stringstream ss(s2);
ss >> num;
s2.clear() ;
div.push_back(num);
}
}
}
}
int main() {
int n;
while(cin >> n){
while(n--){
string s;
vector<int> div;
cin >> s;
s += '5';
divde(div,s);
sort(div.begin() ,div.end() );
bool first = true;
for(int i = 0;i < div.size() ;i++){
if(first){
cout << div[i];
first = false;
}else{
cout << " " << div[i];
}
}
cout << endl;
}
}
return 0;
}
计算机英语翻译
三、输出硬件
计算机的显示器,可以简单的显示文本和图片,被分类(归类)为输出设备。但是触控屏,就既可以被分类为输入设备,也可以分类为输出设备,因为他可以接收输入,而且并且可以输出。Standalone显示器(独立),有时被称之为传感器(显示器),在笔记本电脑中特别受欢迎(在台式电脑中很常见)。笔记本、台式机、或者掌机的显示器中继承了(内置在系统单元中)系统单元,但是这些设备可能也接收额外的传感器(支持外接显示器)。显示器有常用的两个技术:LCD和LED。LCD(liquid crystal display)(液晶显示器)技术产生图片,是通过filtering光,通过一层liquid crystal细胞(通过一层液晶单元过滤光线来生成图像)。LCD屏幕的优点包括了显示清晰,低辐射释放emission,portability(便携性好),并且compactness(结构紧凑)适配度高。光的来源是通过背景版。大多数现代屏幕是backlit的LED(light-emitting diode)(发光二极管)技术,被市场称之为LED显示器。
Standalone n.独立
monitor n.显示器
filter v.过滤
portability n.便携性好
compactness n.紧凑
单词打卡


660

被折叠的 条评论
为什么被折叠?



