虽然这个问题很那啥,我还是需要提一下,使用的容器如果需要遍历不要忘记清空一下,或者直接在循环内声明!!!
估值一亿的代码
——字符串处理的学习还是由很远的路要走啊
该题有几个要求,我们需要分步进行。
这里我们首先讲大小写和?与!的问题解决一下。
还用一个点就是,标点前面可能没有空格,我们需要手动给添加一下,防止切割出现错误。
这个应该是比较好实现的。
然后我们再将其他的进行替换:
核心代码:
该段代码的意思是将temp字符串根据空格分隔。
形成s1二维字符串数组。
string s1[1007],tmp;
int ssindex=0;
stringstream ss(temp);
while(ss>>tmp){
s1[ssindex++]=tmp;
}
形成了字符串后,我们就可以进行替换了。
还有一个需要注意的地方就是输出的
AI:后面是有一个空格的。这里需要特殊判断一下。
因为默认下。标点符号的前面是不能有空格的,但是如果标点在第一个的话,他是必须加空格的。所以这里需要判断一下,第一个是不是标点。如果是的话,先输出一个空格。因为后面的输出都是没有空格的。
然后我们输单词的时候只需要在前面加上一个空格就ok了。因为单词前是必须有空格的。
具体代码如下:
#include <bits/stdc++.h>
using namespace std;
int n, m;
int main(){
cin>>n;
getchar();
string a[n];
for(int i =0;i<n;i++){
getline(cin,a[i]);
}
for(int i =0;i<n;i++){
string temp = a[i];
cout<<temp<<endl<<"AI:";
for(int j = 0;j<temp.length();j++){
if(temp[j]=='?')
temp[j]='!';
if(isalnum(temp[j])){
if(temp[j]!='I')
temp[j]=tolower(temp[j]);
}
else{
temp.insert(j," ");
j++;
}
}
string s1[1007],tmp;
int ssindex=0;
stringstream ss(temp);
while(ss>>tmp){
s1[ssindex++]=tmp;
}
if(!isalnum(s1[0][0])){
cout<<" ";
}
for(int i =0;i<ssindex;i++){
//cout<<s1[i]<<endl;
if(!isalnum(s1[i][0])){
cout<<s1[i];
}
else if(s1[i]=="could"&&s1[i+1]=="you"){
cout<<" I could";
i++;
}
else if(s1[i]=="can"&&s1[i+1]=="you"){
cout<<" I can";
i++;
}
else if(s1[i]=="I"||s1[i]=="me"){
cout<<" you";
}
else
cout<<" "<<s1[i];
}
cout<<endl;
}
return 0;
}
思路来自:L1-8 估值一亿的AI核心代码 (20分)坑点分析+代码
特立独行的幸福
该题的意思就是找到不被经过的数,并且这个数的循环不能有死循环。
并且当该数为素数的时候值翻倍。并且,出现的被依附的不在范围内的不进行考虑。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <map>
#include <string>
#include <cmath>
#define MAXN 100007
typedef long long ll;
using namespace std;
//vis用来记录不是幸福
//ch 用来判断循环
//xin用来输出
//ci用来记录遍历次数
int a,b, visit[MAXN],ch[MAXN],ci=0,xin[MAXN];
bool isprime(int x)
{
int sum=0;
for(int i=2;i<=sqrt(x+1);i++)
{
if(x%i==0) return false;
}
return true;
}
int main(){
memset(visit,0,sizeof(visit));
memset(xin,0,sizeof(xin));
cin>>a>>b;
for(int i =a;i<=b;i++){
if(visit[i]) continue;
int val = i,ci=0;
int sum=0;
memset(ch,0,sizeof(ch));
while(1){
sum=0;
while(val){
sum+=(val%10)*(val%10);
val/=10;
}
//这里是记录经过的数,这些数都不是幸福
if(sum<=b&&sum>=a) visit[sum]=1;
//判断是否有死循环 退出
if(ch[sum]){
visit[i]=1;
break;
}
val=sum;
ci++;
ch[sum]=1;
// 出现条件时退出
if(sum==1){
xin[i]=ci;
if(isprime(i)) xin[i]*=2;
break;
}
}
}
int flag=0;
for(int i =a;i<=b;i++){
if(visit[i]==0&&xin[i]>0){
cout<<i<<" "<<xin[i]<<endl;
flag++;
}
}
if(flag==0) cout<<"SAD"<<endl;
return 0;
}
思路来自:
L2-1 特立独行的幸福 (25 分)