点击查看 ---------------> 题干
1、624
#include<iostream>
#include<cctype>
using namespace std;
int main(){
int cnt=0;
for(int i=1;i<=2020;i++){
string s=to_string(i);
for(int j=0;j<s.size();j++){
if(s[j]=='2') cnt++;
}
}
cout<<cnt;
return 0;
}
2、2481215
#include<iostream>
using namespace std;
int gcd(int a,int b){
return (b==0)?a:gcd(b,a%b);
}//求最大公因数
int main(){
int cnt=0;
for(int i=1;i<=2020;i++)
for(int j=1;j<=2020;j++){
if(gcd(i,j)==1) cnt++;
}
cout<<cnt;
return 0;
}
3、761 画图 <(20,20)在第39斜排的最中间>
4、8879 千万小心如果单算2020年10月1日,要 加2(怪不得对答案的时候莫名其妙的少了1)
#include<iostream>
using namespace std;
int main(){
int weekday=5,sum=0;
for(int i=2000;i<=2019;i++){
int flag=1; //非闰年
if((i%4==0&&i%100!=0)||(i%400==0)) flag=0; //闰年
int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if(!flag) a[1]=29;
for(int j=1;j<=12;j++){
for(int k=1;k<=a[j-1];k++){
weekday++;
if((weekday==1&&k!=1)||(weekday!=1&&k==1)||(weekday==1&&k==1)) sum+=2;
else sum++;
if(weekday==7) weekday=0;
}
}
}
//2020年
int b[9]={31,29,31,30,31,30,31,31,30};
for(int i=1;i<=9;i++){
for(int k=1;k<=b[i-1];k++){
weekday++;
if((weekday==1&&k!=1)||(weekday!=1&&k==1)||(weekday==1&&k==1)) sum+=2;
else sum++;
if(weekday%7==0) weekday=0;
}
}
sum+=2;//2020年 10月1日 ,注意是1号,是2km
cout<<sum;
}
5、先略过了
6、round(),对浮点数四舍五入,最后返回整数。
floor():向下取整 ceil():向上取整,头文件是#include<cmath>
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int n,jige=0,youxiu=0;
cin>>n;
for(int i=1;i<=n;i++){
int score;
cin>>score;
if(score>=60) jige++;
if(score>=85) youxiu++;
}
double jigelv=(double)jige/n*100;
double youxiulv=(double)youxiu/n*100;
jigelv=round(jigelv);
youxiulv=round(youxiulv);
cout<<jigelv<<"%"<<endl<<youxiulv<<"%";
return 0;
}
7、在测试点3扣了10分,实在没有找出为什么
#include<iostream>
using namespace std;
int main(){
int n,year,y,m,d,k;
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
cin>>n;
y=n/10000,year=y,k=y;
while(1){ //找下一个回文日期
year++;
d=(year/1000)+(year%1000/100)*10;
m=(year%100/10)+(year%100%10)*10;
if((year%400==0)||(year%4==0&&year%100!=0)) a[2]=29;
if(m<=12&&d<=a[m]){
printf("%d%02d%02d\n",year,m,d);
break;
}
else {
a[2]=28;
continue;
}
}
while(1){ //找下一个ABABBABA型的回文日期
k++;
int k1=k/100,k2=k%100,m1=k1/10+k1%10*10;
if(k1!=k2||m1>12) continue;
else{
printf("%d%02d%02d",k,m1,m1);
break;
}
}
return 0;
}
8、题干
这题太鬼了,直接就想暴力解题,但是看到很多大佬想到的这个方法,花了一些时间很艰难的把它弄懂了,不得不说这种做法真的太巧妙了,真的想不出来《= =》\\。
分析:
string s = "ababc";
- 对于字符串s中的每一个字符,对其求所在的子串的数量,然后将所有字符所在的子串数量加和,就是最终的结果
- s[0]='a'; 则s的所有子串中包含有s[0]的子串数为 个
- s[1]='b'; 则s的所有子串中包含有s[1]的子串数为 个 [ 注意:(1-0)1是当前字符的下标,0是上一次该字符出现的下标,准确地讲不该是0,所以代码是将字符串最前边补上一个字符后从下标1开始的]
- s[0]='a';则s的所有子串中包含有s[0]的子串数为个
- ······
- 图示:
#include<iostream>
using namespace std;
int last[26];
//26个字母,0-25分别是a-z的位置,每个位置存储此位置代表的字母在字符串中上一次出现的下标
int main(){
string s;
cin>>s;
int len=s.size();
s="0"+s;
long long ans=0;
for(int i=1;i<s.size();i++){
ans+=1ll*(i-last[s[i]-'a'])*(len-i+1);
last[s[i]-'a']=i;
}
cout<<ans;
return 0;
}
这个代码可真是绝了!!!真是学到了
未完待续。。。。。。