T101:找出质数------字符串

代码实现:
#include <iostream>
#include <string>//调用s.substr()取子串,s.size()取长度,getline(cin,s)读取一行输入
#include <climits>//防止stoi转换溢出
using namespace std;
bool isprime(int n){
if(n<2) return false;
if(n==2) return true;
if(n%2==0) return false;
for(int i=3;i*i<=n;i+=2){
if(n%i==0) return false;
}
return true;
}
int main(){
string s;
while(getline(cin,s)){
if(s.empty()) continue;//跳过空行
int best=-1;// 记录当前找到的最佳质数, -1 表示未找到
for(size_t len=4;len>=1;len--){
int maxprime=-1;// 在当前长度下找到的最大质数
//遍历所有起始位置,截取长度为len的子串
for(size_t i=0;i+len<=s.size();i++){
string sub=s.substr(i,len);//获取子串
int num =stoi(sub);//将子串转换为整数,自动忽略前导0
if(isprime(num)){
if(num>maxprime) maxprime=num;//更新当前长度的最大值
}
}
//如果当前长度找到了质数
if(maxprime!=-1){
best=maxprime;//记录该质数(由于是从长到短查找,第一个找到的长度就是最长)
break;//跳出循环,不再检查更短长度
}
}
cout<<best<<endl;
}
return 0;
}
个人思考:
这道题通过从长到短遍历所有可能的子串,将子串转换为整数并判断是否为质数,从而找出最长的质数子串(长度不超过4)。若存在多个相同长度的质数,则取数值最大的一个。代码中利用了stoi自动忽略前导零的特性,并采用优化的质数判断(只需检查到平方根)。
T102:翻译字符串------字符串

代码实现:
#include <iostream>
#include <string>//s.length()获取输入字符串长度//result.append()//result.size()获取字符串长度
#include <cctype>//isdigit(s[i])判断当前字符是否为数字
using namespace std;
int main(){
string s;
while(cin>>s){
string result;
int i=0;
int len=s.length();
while(i<len){
if(s[i]=='@'){
result+='@';
break;//@是结束标志,后面不再处理
}
else if(isdigit(s[i])){
int n=s[i]-'0';
char next=s[i+1];//一定有下一个字符(因为最后是'@')
result.append(n+1,next);
i+=2;//跳过数字和它后面的字符
}
else {
result+=s[i];
i++;
}
}
//每三个字符一组输出
for(size_t j=0;j<result.size();j+=3){
if(j!=0) cout<<' ';
for(size_t k=j;k<j+3&&k<result.size();k++){
cout<<result[k];
}
}
cout<<endl;
}
return 0;
}
个人思考:
这道题读懂题目分类处理,遇到数字要重复其后字符并跳过两个位置,利用isdigit判断数字,用append方便地添加重复字符;以@结尾,要跳出循环。输出时每三个字符为一组,用空格分隔,最后可能不足三个,需要控制边界。
T103:分割数字并排序------字符串

代码实现:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main(){
int T;
cin>>T;
cin.ignore();//跳过第一行末尾的换行
while(T--){
string line;
getline(cin,line);
int nums[1000];
int count=0;
int i=0,n=line.size();//i 为当前扫描位置, n 为字符串长度
while(i<n){
//跳过所有连续的'5'
while(i<n&&line[i]=='5') i++;
if(i>=n) break;//如果已经到达末尾,则退出循环
int start =i;// 记录当前整数的起始位置
//继续扫描直到遇到'5'或字符串末尾
while(i<n&&line[i]!='5') i++;
//提取子串[start,i)范围内的字符,即当前整数对应的字符串
string numstr=line.substr(start,i-start);
//将数字串转换为整数,stoi会自动忽略前导0
int num=stoi(numstr);
nums[count++]=num;
}
sort(nums,nums+count);//排序
for(int j=0;j<count;j++){
if(j>0) cout<<' ';
cout<<nums[j];
}
cout<<endl;// 每组输出换行
}
return 0;
}
个人思考:
这道题是将5作为分隔符,需要正确处理连续多个5的情况,避免空串;利用stoi自动忽略前导零的特性,大大简化了整数转换过程。同时还用到了string numstr=line.substr(start,i-start);//提取子串[start,i)范围内的字符,即当前整数对应的字符串。
英语翻译:
P75:V. 计算机科学与其他学科的联系
理论计算机科学的许多研究方法都源自数学和逻辑学。数值计算领域的研究与数学领域的数值分析研究存在重叠。计算机架构师与设计计算机电路的电气工程师紧密合作。
mathematics:数学
logic:逻辑学
overlap:重叠;与...... 部分重合
numerical:数值的;用数字表示的
architects:架构师;设计师
circuit:电路;回路
P76:除了这些历史渊源之外,人工智能研究与心理学、神经生理学和语言学之间也存在着紧密联系。人机交互研究同样与心理学相关联。机器人学家在设计新型机器人时,既要与机械工程师合作,也要与生理学家合作。
P77:计算机科学与几乎所有使用计算机的学科都存在间接联系。其他领域开发的应用程序往往需要与计算机科学家协作,后者贡献自己在算法、数据结构、软件工程和现有技术方面的知识。反过来,计算机科学家也有机会观察计算机的新颖应用,并从中获得对其用途的更深刻理解。这些联系使得计算机科学成为一个高度跨学科的研究领域。
collaboration:协作、合作
algorithm:算法
novel:新颖的、新奇的
interdisciplinary:跨学科的
背单词:
