第六章字符串
P5733 【深基6.例1】自动修正
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string s;
cin>>s;
for(int i=0;i<s.size();i++)
{
if(s[i]>='a'&&s[i]<='z')
s[i]-='a'-'A';
}
cout<<s<<endl;
return 0;
}
P1914 小书童——凯撒密码
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
int n;
string s;
cin>>n>>s;
for(int i=0;i<s.size();i++)
{
s[i]=(s[i]-'a'+n)%26+'a';
cout<<s[i];
}
return 0;
}
P1125 [NOIP2008 提高组] 笨小猴
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
string s;
int ans[26]={0};
int mmax=0,mmin=10000,delta;
cin >> s;
for(int i=0;i<s.size();i++)
ans[s[i]-'a']++;
for(int i=0;i<26;i++)
{
if(ans[i]>mmax)mmax=ans[i];
if(ans[i]!=0&&ans[i]<mmin)mmin=ans[i];
}
delta=mmax-mmin;
if(delta==0||delta==1)
{
printf("No Answer\n0\n");
return 0;
}
for(int h=2;h*h<=delta;h++)
if(delta%h==0)
{
printf("No Answer\n0\n");
}
cout << "Lucky Word"<<endl;
cout<<mmax-mmin<<endl;
return 0;
}
P5015 [NOIP2018 普及组] 标题统计
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string s;
int ans=0;
while(cin>>s)
ans+=s.size();
cout << ans<<endl;
return 0;
}
P5734 【深基6.例6】文字处理软件
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
int n,opt,l,r;
string s,a;
cin >> n>>s;
while (n -- )
{
cin >> opt;
if(opt==1)
{
cin >>a;
s.append(a);
cout<<s<<endl;
}
else if(opt==2)
{
cin>>l>>r;
s=s.substr(l,r);
cout << s<<endl;
}
else if(opt==3)
{
cin>>l>>a;
s.insert(l,a);
cout << s<<endl;
}
else
{
cin >> a;
cout << (int)s.find(a)<<endl;
}
}
return 0;
}
P1308 [NOIP2011 普及组] 统计单词数
//比赛中可以直接用万能头文件
#include <bits/stdc++.h>
//开longlong防止爆掉int,int范围2e9,longlong范围9e18
#define int long long //(有超时风险)
//简写,如果要改动PII,直接该这个就行了,vector常用
#define PII pair<int,int>
//'\n'输出更快一些,而且是分别显示每一行,建议scanf与printf配套
#define endl '\n'
//超大数据有时会用__int128
#define LL __int128
using namespace std;
//需要改动数组直接改动N,M即可
const int N=2e5+10,M=1e3+10;
//常用的数组
int a[N],pre[N];
signed main()
{
//关掉流同步,cin变快,但是不能用scanf,可以用printf;
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
string word,s;
getline(cin,word);
getline(cin,s);
for(int i=0;i<word.size();i++)
if(word[i]>='A'&&word[i]<='Z')
word[i]+='a'-'A';
for(int i=0;i<s.size();i++)
if(s[i]>='A'&&s[i]<='Z')
s[i]+='a'-'A';
word=' '+word+' ';
s=' '+s+' ';
if(s.find(word)==-1)
cout<<-1<<endl;
else{
int firstpos=s.find(word);
int nextpos=s.find(word),cnt=0;
while(nextpos!=-1)
{
cnt++;
nextpos=s.find(word,nextpos+1);
}
cout<<cnt<<" "<<firstpos<<endl;
}
return 0;
}
第六章字符串习题
P1765 手机(map的经典应用)
#include<cstdio>
#include<map>
#include<cstring>
#include<iostream>
#include<string>
using namespace std;
map<char,int>ma;//定义map,把char类型转化成int
string word;
int ans=0;
void init()
{
ma['a']=1;
ma['b']=2;
ma['c']=3;
ma['d']=1;
ma['e']=2;
ma['f']=3;
ma['g']=1;
ma['h']=2;
ma['i']=3;
ma['j']=1;
ma['k']=2;
ma['l']=3;
ma['m']=1;
ma['n']=2;
ma['o']=3;
ma['p']=1;
ma['q']=2;
ma['r']=3;
ma['s']=4;
ma['t']=1;
ma['u']=2;
ma['v']=3;
ma['w']=1;
ma['x']=2;
ma['y']=3;
ma['z']=4;
ma[' ']=1;
}
int main()
{
init();
getline(cin,word);//读入
for(int i=0;i<word.length();i++)
{
ans+=ma[word[i]];
}
cout<<ans<<endl;
}
P3741 小果的键盘(用STL)
//比赛中可以直接用万能头文件
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
//开longlong防止爆掉int,int范围2e9,longlong范围9e18
#define int long long //(有超时风险)
//简写,如果要改动PII,直接该这个就行了,vector常用
#define PII pair<int,int>
//'\n'输出更快一些,而且是分别显示每一行,建议scanf与printf配套
#define endl '\n'
//超大数据有时会用__int128
#define LL __int128
using namespace std;
//需要改动数组直接改动N,M即可
const int N=2e5+10,M=1e3+10;
//常用的数组
int a[N],pre[N];
signed main()
{
//关掉流同步,cin变快,但是不能用scanf,可以用printf;
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int n,c=-1,cnt=0;
string s,a="VK";
cin>>n>>s;
while (s.find(a,c+1)!=-1)
{
cnt++;
int t=s.find(a,c+1);
s[t]='T';
s[t+1]='T';
c=t;
}
for(int i=0;i<s.size()-1;i++)
{
string w="KK";
string e="VV";
if(s.find(w)!=-1)
{
cnt++;
break;
}
if(s.find(e)!=-1)
{
cnt++;
break;
}
}
cout<<cnt;
return 0;
}
P1321 单词覆盖还原
//比赛中可以直接用万能头文件
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
//开longlong防止爆掉int,int范围2e9,longlong范围9e18
#define int long long //(有超时风险)
//简写,如果要改动PII,直接该这个就行了,vector常用
#define PII pair<int,int>
//'\n'输出更快一些,而且是分别显示每一行,建议scanf与printf配套
#define endl '\n'
//超大数据有时会用__int128
#define LL __int128
using namespace std;
//需要改动数组直接改动N,M即可
const int N=2e5+10,M=1e3+10;
//常用的数组
int a[N],pre[N];
int ans,sum;
signed main()
{
//关掉流同步,cin变快,但是不能用scanf,可以用printf;
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
string s;
cin>>s;
for(int i=0;i<=s.size();i++)
{
if(s[i]=='b'||s[i+1]=='o'||s[i+2]=='y')
ans++;
}
for(int i=0;i<=s.size();i++)
if(s[i]=='g'||s[i+1]=='i'||s[i+2]=='r'||s[i+3]=='l')
sum++;
cout<<ans<<endl;
cout<<sum;
return 0;
}
P1553 数字反转(升级版)
//比赛中可以直接用万能头文件
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
//开longlong防止爆掉int,int范围2e9,longlong范围9e18
#define int long long //(有超时风险)
//简写,如果要改动PII,直接该这个就行了,vector常用
#define PII pair<int,int>
//'\n'输出更快一些,而且是分别显示每一行,建议scanf与printf配套
#define endl '\n'
//超大数据有时会用__int128
#define LL __int128
using namespace std;
//需要改动数组直接改动N,M即可
const int N=2e5+10,M=1e3+10;
//常用的数组
int a[N],pre[N];
//反转函数,并去掉前导零
string reverse(string s)
{
int zerocount=0;
reverse(s.begin(),s.end());
for(auto i:s)
if(i==48)++zerocount;//统计前导零的个数
else
break;
s.erase(s.begin(),s.begin()+zerocount);
return (s!=""?s:"0");
}
//去掉后导零
string deleteTail(string s)
{
int zerocount=0;
for(int i=s.size()-1;i>=0;i--)
if(s[i]==48)++zerocount;
else
break;
s.erase(s.end()-zerocount,s.end());
return (s!=""?s:"0");
}
signed main()
{
//关掉流同步,cin变快,但是不能用scanf,可以用printf;
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
string s;
cin>>s;
if(s.back()=='%')
{
cout<<reverse(s.substr(0,s.size()-1))<<"%"<<endl;
return 0;
}
for(auto i:s)
{
string left,right;
if(i=='/')
{
left=s.substr(0,s.find("/"));
right=s.substr(s.find("/")+1);
cout<<reverse(left)<<"/"<< reverse(right)<<endl;
return 0;
}
if(i=='.')
{
left=s.substr(0,s.find("."));
right=s.substr(s.find(".")+1);
cout<<reverse(left)<<"."<<deleteTail(reverse(right)) <<endl;
return 0;
}
}
cout<<reverse(s)<<endl;
return 0;
}
//std::reverse(),顾名思义,用于反转序列。需要提供首尾迭代器作为参数。
//std::string::erase(),传入两个迭代器 l,r,清除[l,r)范围内的字符。
//std::string::substr(),用于提取子字符串,用法与前者类似。
//std::string::find(),用来查找字串在母串中第一次出现的位置。
P1603 斯诺登的密码
#include<iostream>
#include<algorithm>
using namespace std;
string yw[30]={"","one","two","three","four","five","six","seven",
"eight","nine","ten","elven","twelve","thirteen","fourteen","fifteen",
"sixteen","seventeen","eighteen","nineteen","twenty","a","both",
"another","first","second","third"};
int sz[30]={0,1,4,9,16,25,36,49,64,81,0,21,44,69,96,25,56,89,24,61,0,
1,4,1,1,4,9};
int k;
int a[10];
int main()
{
for(int i=1;i<=6;i++)
{
string x;
cin>>x;//直接用变量读就行了
for(int j=1;j<=26;j++)//26种英文数字
if(yw[j]==x)
{a[++k]=sz[j];break;}//k记录有几个英文数字
}
if(k==0){cout<<0<<endl;return 0;}//先判断一下句子中有没有英文数字
sort(a+1,a+k+1);//排序
for(int i=1;i<=k;i++)
{
if(i!=1&&a[i]<10)cout<<0;//补0
cout<<a[i];
}
cout<<endl;
return 0;
}
//根据题目要求“组成一个新数,
//如果开头为0,就去0”,说明除了第一个,
//后面每个数如果只有一位都要在十位补上一个0
P1200 [USACO1.1] 你的飞碟在这儿 Your Ride Is Here
//比赛中可以直接用万能头文件
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
//开longlong防止爆掉int,int范围2e9,longlong范围9e18
#define int long long //(有超时风险)
//简写,如果要改动PII,直接该这个就行了,vector常用
#define PII pair<int,int>
//'\n'输出更快一些,而且是分别显示每一行,建议scanf与printf配套
#define endl '\n'
//超大数据有时会用__int128
#define LL __int128
using namespace std;
//需要改动数组直接改动N,M即可
const int N=2e5+10,M=1e3+10;
//常用的数组
int a[N],pre[N];
int ans=1,num=1;
signed main()
{
//关掉流同步,cin变快,但是不能用scanf,可以用printf;
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
string a,b;
cin>>a>>b;
for(int i=0;i<a.size();i++)ans*=a[i]-64;
for(int i=0;i<b.size();i++)num*=b[i]-64;
ans%=47,num%=47;
if(ans==num)cout<<"GO";
else cout<<"STAY";
return 0;
}
P1597 语句解析
P1597
法一map
//比赛中可以直接用万能头文件
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
//开longlong防止爆掉int,int范围2e9,longlong范围9e18
#define int long long //(有超时风险)
//简写,如果要改动PII,直接该这个就行了,vector常用
#define PII pair<int,int>
//'\n'输出更快一些,而且是分别显示每一行,建议scanf与printf配套
#define endl '\n'
//超大数据有时会用__int128
#define LL __int128
using namespace std;
//需要改动数组直接改动N,M即可
const int N=2e5+10,M=1e3+10;
//常用的数组
int a[N],pre[N];
map<char,int>num;
signed main()
{
//关掉流同步,cin变快,但是不能用scanf,可以用printf;
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
string s;
cin>>s;
num['a']=num['b']=num['c']='0';
for(int i=0;i<s.size();i+=5)
if(s[i+3]>='0'&&s[i+3]<='9')
num[s[i]]=s[i+3];
else
num[s[i]]=num[s[i+3]];
printf("%c %c %c",num['a'],num['b'],num['c']);
return 0;
}
第七章函数与结构体
P5735 【深基7.例1】距离函数
//比赛中可以直接用万能头文件
#include <bits/stdc++.h>
//开longlong防止爆掉int,int范围2e9,longlong范围9e18
#define int long long //(有超时风险)
//简写,如果要改动PII,直接该这个就行了,vector常用
#define PII pair<int,int>
//'\n'输出更快一些,而且是分别显示每一行,建议scanf与printf配套
#define endl '\n'
//超大数据有时会用__int128
#define LL __int128
using namespace std;
//需要改动数组直接改动N,M即可
const int N=2e5+10,M=1e3+10;
//常用的数组
int a[N],pre[N];
double sq(double x)
{
return x*x;
}
double dist(double x1,double y1,double x2,double y2)
{
return sqrt(sq(x1-x2)+sq(y1-y2));
}
signed main()
{
//关掉流同步,cin变快,但是不能用scanf,可以用printf;
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
double x1,y1,x2,y2,x3,y3,ans;
cin>>x1>>y1>>x2>>y2>>x3>>y3;
ans=dist(x1,y1,x2,y2);
ans+=dist(x1,y1,x3,y3);
ans+=dist(x2,y2,x3,y3);
printf("%.2lf",ans);
return 0;
}
P5736 【深基7.例2】质数筛
//比赛中可以直接用万能头文件
#include <bits/stdc++.h>
//开longlong防止爆掉int,int范围2e9,longlong范围9e18
#define int long long //(有超时风险)
//简写,如果要改动PII,直接该这个就行了,vector常用
#define PII pair<int,int>
//'\n'输出更快一些,而且是分别显示每一行,建议scanf与printf配套
#define endl '\n'
//超大数据有时会用__int128
#define LL __int128
using namespace std;
//需要改动数组直接改动N,M即可
const int N=2e5+10,M=1e3+10;
//常用的数组
int a[N],pre[N];
int n;
bool is_prime(int x)
{
if(x==0||x==1)return 0;//0和1不是质数,需要特判
for(int i=2;i*i<=x;i++)
if(x%i==0)
return 0;
return 1;//如果是质数,则返回1,否则返回0
}
signed main()
{
//关掉流同步,cin变快,但是不能用scanf,可以用printf;
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<n;i++)
if(is_prime(a[i]))
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
P5737 【深基7.例3】闰年展示
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 3010;
int a[N];
int cnt=0;
int ans;
int main()
{
int l,r;
cin>>l>>r;
for(int i=l;i<=r;i++)
{
if((i%4==0&&i%100!=0)||i%400==0)
{
a[cnt++]=i;
ans++;
}
}
cout<<ans<<endl;
for(int i=0;i<cnt;i++)
cout<<a[i]<<" ";
}
P5738 【深基7.例4】歌唱比赛
//比赛中可以直接用万能头文件
#include <bits/stdc++.h>
//开longlong防止爆掉int,int范围2e9,longlong范围9e18
#define int long long //(有超时风险)
//简写,如果要改动PII,直接该这个就行了,vector常用
#define PII pair<int,int>
//'\n'输出更快一些,而且是分别显示每一行,建议scanf与printf配套
#define endl '\n'
//超大数据有时会用__int128
#define LL __int128
using namespace std;
//需要改动数组直接改动N,M即可
const int N=2e5+10,M=1e3+10;
//常用的数组
int a[N],pre[N];
int s[25],n,m,maxsum;
void stat(int a[],int m)
{
int maxscore=0,minscore=10,sum=0;
for(int i=0;i<m;i++)
{
maxscore=max(a[i],maxscore);
minscore=min(a[i],minscore);
sum+=a[i];
}
maxsum=max(maxsum,sum-maxscore-minscore);//记录剩下的n-2评分总和
}
signed main()
{
//关掉流同步,cin变快,但是不能用scanf,可以用printf;
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=0;i<n;i++) {
for (int j = 0; j < m; j++)
cin >> s[j];
stat(s, m);
}
printf("%.2f",double(maxsum)/(m-2));
return 0;
}
P5733 【深基6.例1】自动修正
//比赛中可以直接用万能头文件
#include <bits/stdc++.h>
//开longlong防止爆掉int,int范围2e9,longlong范围9e18
#define int long long //(有超时风险)
//简写,如果要改动PII,直接该这个就行了,vector常用
#define PII pair<int,int>
//'\n'输出更快一些,而且是分别显示每一行,建议scanf与printf配套
#define endl '\n'
//超大数据有时会用__int128
#define LL __int128
using namespace std;
//需要改动数组直接改动N,M即可
const int N=2e5+10,M=1e3+10;
//常用的数组
int a[N],pre[N];
string to_upper(string s)
{
for(int i=0;i<s.size();i++)
if(s[i]>='a'&&s[i]<='z')
s[i]-=32;
return s;
}
signed main()
{
//关掉流同步,cin变快,但是不能用scanf,可以用printf;
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
string s1,s2;
getline(cin,s1);
s2=to_upper(s1);
cout<<s2<<endl;
return 0;
}
P5739 【深基7.例7】计算阶乘
//比赛中可以直接用万能头文件
#include <bits/stdc++.h>
//开longlong防止爆掉int,int范围2e9,longlong范围9e18
#define int long long //(有超时风险)
//简写,如果要改动PII,直接该这个就行了,vector常用
#define PII pair<int,int>
//'\n'输出更快一些,而且是分别显示每一行,建议scanf与printf配套
#define endl '\n'
//超大数据有时会用__int128
#define LL __int128
using namespace std;
//需要改动数组直接改动N,M即可
const int N=2e5+10,M=1e3+10;
//常用的数组
int a[N],pre[N];
int f(int x)
{
if(x==1)return 1;
return x*f(x-1);
}
signed main()
{
//关掉流同步,cin变快,但是不能用scanf,可以用printf;
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int n;
cin>>n;
cout<<f(n)<<endl;
return 0;
}
P5740 【深基7.例9】最厉害的学生
#include <bits/stdc++.h>
#define int long long //(有超时风险)
#define PII pair<int,int>
#define endl '\n'
#define LL __int128
using namespace std;
const int N=2e5+10,M=1e3+10,mod=998244353,INF=0x3f3f3f3f;
int a[N],pre[N];
struct Node
{
string name;
int chinese,math,eng,sum;
int idx;//编号
}stu[N];
bool cmp(Node a,Node b)//自定义比较函数
{
if(a.sum!=b.sum)
{return a.sum>b.sum;//return这个表达式的返回值,大于是1
//相当于if(a.sum>b.sum)
// return true;
// else
// return false;
}
else if(a.idx!=b.idx)
{
return a.idx<b.idx;
}
}
signed main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
string name;
cin>>name;
int x,y,z;
cin>>x>>y>>z;
stu[i]={name,x,y,z,x+y+z,i};
}
sort(stu+1,stu+n+1,cmp);
cout<<stu[1].name<<' '<<stu[1].chinese<<' '<<stu[1].math<<' '<<stu[1].eng;
return 0;
}
P5741 【深基7.例10】旗鼓相当的对手 - 加强版
//比赛中可以直接用万能头文件
#include <bits/stdc++.h>
//开longlong防止爆掉int,int范围2e9,longlong范围9e18
#define int long long //(有超时风险)
//简写,如果要改动PII,直接该这个就行了,vector常用
#define PII pair<int,int>
//'\n'输出更快一些,而且是分别显示每一行,建议scanf与printf配套
#define endl '\n'
//超大数据有时会用__int128
#define LL __int128
using namespace std;
//需要改动数组直接改动N,M即可
const int N=1e4,M=1e3+10;
//常用的数组
int n,x,ans;
struct student_t_distribution{
string name;
int chinese,math,english;
}a[N];
bool check(int x,int y,int z)
{
return x<=y+z&&y<=x+z;
}
signed main()
{
//关掉流同步,cin变快,但是不能用scanf,可以用printf;
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].name>>a[i].chinese>>a[i].math>>a[i].english;
}
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
if(check(a[i].chinese,a[j].chinese,5)&&check(a[i].math,a[j].math,5)&&check(a[i].english,a[j].english,5)&& check(a[i].chinese+a[i].math+a[i].english,a[j].chinese+a[j].math+a[j].english,10))
cout<<a[i].name<<" "<<a[j].name<<endl;
return 0;
}
P5742 【深基7.例11】评等级
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 1024;
struct node {
int id;//学号
double sc1, sc2;//学业成绩和素质拓展成绩
int score;//学业成绩和素质拓展成绩的和
double final_score;//综合分数
}a[N];//结构体定义,由于本人习惯(懒),sc1和sc2定义成了double。
int main() {
int n;
cin >> n;
for(int i=0; i<n; i++) {
cin >> a[i].id >> a[i].sc1 >> a[i].sc2;
a[i].score = a[i].sc1 + a[i].sc2;
a[i].final_score = a[i].sc1 * 0.7 + a[i].sc2 * 0.3;//计算综合分数
}
for(int i=0; i<n; i++) {
if(a[i].score > 140 && a[i].final_score >= 80) {//一定看清题
cout << "Excellent" << endl;
}
else {
cout << "Not excellent" << endl;
}
}
return 0;
}
第7章函数与结构体课后习题
P1075 [NOIP2012 普及组] 质因数分解
//比赛中可以直接用万能头文件
#include <bits/stdc++.h>
//开longlong防止爆掉int,int范围2e9,longlong范围9e18
#define int long long //(有超时风险)
//简写,如果要改动PII,直接该这个就行了,vector常用
#define PII pair<int,int>
//'\n'输出更快一些,而且是分别显示每一行,建议scanf与printf配套
#define endl '\n'
//超大数据有时会用__int128
#define LL __int128
using namespace std;
//需要改动数组直接改动N,M即可
const int N=2e5+10,M=1e3+10;
bool is_prime(int x)
{
if(x<2)return 0;
for(int i=2;i<=sqrt(x);i++)
if(x%i==0)return 0;
return 1;
}
//常用的数组
int a[N],pre[N];
int cnt=0;
signed main()
{
//关掉流同步,cin变快,但是不能用scanf,可以用printf;
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int m,w,q;
cin>>m;
for(int i=2;i<sqrt(m);i++)
if(is_prime(i)==1&&m%i==0&&is_prime(m/i)==1){
cout<<m/i<<endl;
return 0;
}
return 0;
}
P1304 哥德巴赫猜想
//比赛中可以直接用万能头文件
#include <bits/stdc++.h>
//开longlong防止爆掉int,int范围2e9,longlong范围9e18
#define int long long //(有超时风险)
//简写,如果要改动PII,直接该这个就行了,vector常用
#define PII pair<int,int>
//'\n'输出更快一些,而且是分别显示每一行,建议scanf与printf配套
#define endl '\n'
//超大数据有时会用__int128
#define LL __int128
using namespace std;
//需要改动数组直接改动N,M即可
const int N=2e5+10,M=1e3+10;
bool is_prime(int x)
{
if(x<2)return 0;
for(int i=2;i<=sqrt(x);i++)
if(x%i==0)return 0;
return 1;
}
//常用的数组
int n,s;
int cnt=0;
signed main(){
int i,j;
cin>>n;//读入
for (i=4;i<=n;i++)//从4到n扫
for (j=2;j<=i/2;j++)//因为1不是质数,不用考虑,一直到i的一半就可以了,不然i一减就重复了
if (i%2!=0) break;//因为哥德巴赫猜想是说大于4的偶数,如果i是奇数就弹了
else if (is_prime(j)&&is_prime(i-j)) {cout<<i<<"="<<j<<"+"<<i-j<<endl;break;}//其实没必要写else,因为如果不行的已经弹了,现在的i一定是偶数并且j和i-j都是质数的话就输出,再弹出这个循环
return 0;
}
第八章模拟与高精度
P1009 [NOIP1998 普及组] 阶乘之和
//比赛中可以直接用万能头文件
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
//开longlong防止爆掉int,int范围2e9,longlong范围9e18
#define int long long //(有超时风险)
//简写,如果要改动PII,直接该这个就行了,vector常用
#define PII pair<int,int>
//'\n'输出更快一些,而且是分别显示每一行,建议scanf与printf配套
#define endl '\n'
//超大数据有时会用__int128
#define LL __int128
using namespace std;
//需要改动数组直接改动N,M即可
const int N=2e5+10,M=1e3+10;
//常用的数组
int a[N],pre[N];
int n;
vector<int>mul(vector<int>&a,int b)//模拟乘法
{
vector<int>c;
int t=0;
for(int i=0;i<a.size()||t;i++)
{
if(i<a.size())t+=a[i]*b;
c.push_back(t%10);
t/=10;
}
while(c.size()>1&&c.back()==0)c.pop_back();
return c;
}
//mul 函数实现了大整数的乘法运算,接受一个大整数向量 a 和一个整数 b,返回它们的乘积。具体步骤如下:
//定义一个空向量 c 用来存储乘积结果。
//使用变量 t 来保存进位值,初始化为 0。
//遍历大整数向量 a,同时将当前位与整数 b 相乘,并加上进位值 t。
//将乘积结果的个位数加入向量 c 中,并更新进位值 t。
//如果遍历完 a 后,仍然存在进位值 t,则将其加入向量 c 中。
//最后去除结果向量 c 中末尾的多余零,并返回结果向量 c。
vector<int>add(vector<int>&a,vector<int>&b)//模拟加法
{
if(a.size()<b.size())return add(b,a);
vector<int>c;
int t=0;
for(int i=0;i<a.size();i++)
{
t+=a[i];
if(i<b.size())t+=b[i];
c.push_back(t%10);
t/=10;
}
if(t)
{
c.push_back(t);
}
return c;
}
//add 函数实现了大整数的加法运算,接受两个大整数向量 a 和 b,返回它们的和。具体步骤如下:
//确保 a 的长度不小于 b 的长度,如果不是,则交换 a 和 b。
//定义一个空向量 c 用来存储相加结果。
//使用变量 t 来保存进位值,初始化为 0。
//遍历大整数向量 a,同时将当前位与 b 对应位置的位相加,并加上进位值 t。
//将相加结果的个位数加入向量 c 中,并更新进位值 t。
//如果遍历完 a 后,仍然存在 b 中未处理的位,则将其与进位值相加,并将结果加入向量 c 中。
//如果遍历完 a 和 b 后,仍然存在进位值 t,则将其加入向量 c 中。
//返回结果向量 c。
signed main()
{
//关掉流同步,cin变快,但是不能用scanf,可以用printf;
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n;
vector<int>a;
a.push_back(1);
vector<int>res,pri;
res.push_back(0);
pri.push_back(1);
for(int b=1;b<=n;b++)//模拟阶乘
{
pri=mul(pri,b);
res=add(res,pri);
// for(auto c:pri)cout<<c;
// cout<<" ";
// for(auto c:res)cout<<c;
// cout<<endl;
}
for(int i=res.size()-1;i>=0;i--)
{
cout<<res[i];
}
cout<<endl;
return 0;
}
//初始化向量 a 为 {1},表示初始的阶乘结果为 1。
//初始化向量 res 和 pri 为 {0} 和 {1},分别表示阶乘之和的结果和当前计算的阶乘结果。
//使用循环计算从 1 到 n 的阶乘之和,每次迭代都更新 pri 为当前阶乘值,并将其与 res 相加得到新的阶乘之和。
//最后输出计算得到的阶乘之和。