过关考模拟考题解

A签到题

  • 分析:

要是这也不会那学习委员真没招了

  • 参考代码:
1
2
3
4
5
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"Help others voluntarily but never let them know they owe you a favor."<<endl;
}

B选择结构

  • 分析:

按照要求逐个判断,然后取最小值就行了

  • 参考代码:
1
2
3
4
5
6
7
8
9
#include<bits/stdc++.h>
using namespace std;
int main(){
double x,y,n,p,ans=200;
cin>>x>>y>>n>>p;
if(p>=x) ans=min(ans,p-y);
ans=min(ans,p/10*n);
printf("%.2lf",ans);
}

C循环

  • 分析:

分三种情况,<10的一定成立,两三四位数自己判断就行了

  • 参考代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,cnt=0; cin>>n;
for(int i=1;i<=n;i++){
if(i<10) cnt++;
else if(i<100){
if(i%10==i/10) cnt++;
}
else if(i<1000){
if(i%10==i/10%10&&i%10==i/100) cnt++;
}
else if(i%10==i/10%10&&i%10==i/100%10&&i%10==i/1000) cnt++;
}
cout<<cnt<<endl;
}
  • 打表的做法

为什么没人想到这题能打表呢?总共也就28个数啊

1
2
3
4
5
6
7
8
9
10
11
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[30]={1,2,3,4,5,6,7,8,9,11,
22,33,44,55,66,77,88,99,111,
222,333,444,555,666,777,888,999,1111,2222},n;
cin>>n;
for(int i=0;i<=28;i++){
if(a[i]>n) {cout<<i<<endl;break;}
}
}

D菱形

  • 分析:

逐行输出,先上半部分,再是后半部分

  • 参考代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<bits/stdc++.h>
using namespace std;
int main(){
int n; cin>>n;
for(int i=0;i<=n/2;i++){
for(int j=1;j<=n/2-i;j++) cout<<".";
cout<<"#";
for(int j=1;j<=i*2-1;j++) cout<<".";
if(i!=0) cout<<"#";
for(int j=1;j<=n/2-i;j++) cout<<".";
cout<<endl;
}
for(int i=n/2-1;i>=0;i--){
for(int j=1;j<=n/2-i;j++) cout<<".";
cout<<"#";
for(int j=1;j<=i*2-1;j++) cout<<".";
if(i!=0) cout<<"#";
for(int j=1;j<=n/2-i;j++) cout<<".";
cout<<endl;
}
}

E金字塔

  • 分析:

逐个循环相加就行了

  • 参考代码:
1
2
3
4
5
6
7
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,ans=0; cin>>n;
for(int i=1;i<=n;i++) ans+=i*i;
cout<<ans<<endl;
}

F假期阅读

  • 分析:

最多k*t页,但不能超过n

  • 参考代码:
1
2
3
4
5
6
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,k,t; cin>>n>>k>>t;
cout<<min(n,k*t)<<endl;
}

G值日

  • 分析:

求最小公倍数

  • 参考代码:
1
2
3
4
5
6
7
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m,i; cin>>n>>m;
for(i=n;i%m!=0;i+=n);
cout<<i<<endl;
}

H数三角形

  • 分析:

循环i 1..n,j 1..i即可,每次判断一下是否存在整数解

  • 参考代码:
1
2
3
4
5
6
7
8
9
10
11
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,cnt=0; cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
if(i*j%2==0) cnt++;
}
}
cout<<cnt<<endl;
}

I幂数和

  • 分析:

直接暴力枚举所有数,判断是否能拆就行了
遍历每种可能的情况,计算和是否为这个数就行了
至于代码中的<<是二进制内左移的意思,用来计算2的n次幂
比如1<<1是10,变成了2,同理还有右移,自己学习

  • 参考代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<bits/stdc++.h>
using namespace std;
int main(){
int l,r,cnt=0; cin>>l>>r;
for(int i=l;i<=r;i++){
bool f=false;
for(int j=0;j<=20;j++){
for(int k=0;k<=20;k++){
if((1<<j)+(1<<k)==i) {cnt++;f=true;break;}
}
if(f) break;
}
}
cout<<cnt<<endl;
}

J质因数分解

  • 分析:

第一空,先输出n,免得后面n的值变掉了
第二空判断是否算一个因子,当然最后一个是需要特判的
第三空,既然发现了因子,那么把n减小,变为n/i
第四空,找的不对,i自增,寻找下一个位置
第五空,输出最后一个质因数

  • 参考代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
ll n,i=2; cin>>n;
cout<<n<<"=";
for(i=2;i<=n;){
if(n%i==0&&n/i!=1){
cout<<i<<"*";
n/=i;
}
else{
i++;
}
}
cout<<i-1<<endl;
}