信息学奥赛初赛天天练-28-CSP-J2022完善程序-枚举求因数、类型转换秘籍、取整技巧、Vector数组实战应用
PDF文档公众号回复关键字:20240617
![](https://img2022.cnblogs.com/blog/404484/202211/404484-20221123185906168-1425738362.png)
2022 CSP-J 阅读程序1
完善程序 (单选题 ,每小题3分,共30分)
1 (枚举因素) 从小到大打印正整数n的所有正因数
试补全模拟程序
01 #include <bits/stdc++.h>
02 using namespace std;
03
04 int main() {
05 int n;
06 cin >> n;
07
08 vector<int> fac;
09 fac.reserve((int)ceil(sqrt(n)));
10
11 int i;
12 for (i = 1; i * i < n; ++i) {
13 if ( ① ) {
14 fac.push_back(i);
15 }
16 }
17
18 for (int k = 0; k < fac.size(); ++k) {
19 cout << ② << " ";
20 }
21 if ( ③ ) {
22 cout << ④ << " ";
23 }
24 for (int k = fac.size() - 1; k >= 0; --k) {
25 cout << ⑤ << " ";
26 }
27 }
35.①处应填( )
A. n%i==0
B. n%i==1
C. n%(i-1)==0
D. n%(i-1)==1
36.②处应该填( )
A. n/fac[k]
B. fac[k]
C. fac[k]-1
D. n/(fac[k]-1)
37.③处应该填( )
A. (i-1) * (i-1) == n
B. (i-1) * i==n
C. i * i==n
D. i * (i-1) == n
38.④处应该填( )
A. n-i
B. n-i+1
C. i-1
D. i
39.⑤处应该填( )
A. n/fac[k]
B. fac[k]
C. fac[k]-1
D. n/(fac[k]-1)
2 相关知识点
1) printf 打印正确类型
#include<bits/stdc++.h>
using namespace std;
/*
printf 打印需要使用正确的数据类型
printf("%d",int);
printf("%f",float);
如果指定错误,输出结果为0
*/
int main(){
int a=2;
printf("%d\n",a);//正确输出2
printf("%f\n",a);//输出错误 0.0000000
float b=2.0;
printf("%f\n",b);//正确输出2.000000
printf("%d\n",b);//输出错误 0
return 0;
}
2) ceil函数 向上取整
#include<bits/stdc++.h>
using namespace std;
/*
ceil 向上取整 round 四舍五入 floor 向下取整
出入参都是double类型
*/
int main(){
float a=3.1;
printf("%d\n",ceil(a));//ceil 返回值是double 用 printf %d输出,不能正确输出,结果为0
printf("%f\n",ceil(a));//ceil 返回值是double 向上取整,返回值为4
printf("%f\n",round(a));//round 返回值是double 四舍五入,返回值为3
a=3.5;
printf("%f\n",round(a));//round 返回值是double 四舍五入,返回值为4
a=3.9;
printf("%f\n",floor(a));//round 返回值是double 向下取整,返回值为3
int b=16;
int c=sqrt(b);//sqrt求平方根 16的平方根为4
return 0;
}
3) vector数组
#include<bits/stdc++.h>
using namespace std;
/*
vector的使用
*/
vector<int> a(11,1);//声明数组a并赋值1 ,申请存放11个整数的空间
vector<int> b(11);//声明数组b,默认赋值0,申请存放11个整数的空间
vector<int> c;////声明数组b,没有申请存放空间
int main(){
cout<<"a占用空间为:"<<a.capacity()<<endl;//a占用空间为:11
cout<<"b占用空间为:"<<b.capacity()<<endl;//b占用空间为:11
cout<<"c占用空间为:"<<c.capacity()<<endl;//c占用空间为:0
c.reserve(20);//申请20个int存放空间
cout<<c.capacity()<<endl;//c占用空间为:20
return 0;
}
4) 因数
因数,又称约数。整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的因数。
例如
6的正因数有:1、2、3、6
10的正因数有:1、2、5、10
5) 求一个数n的正因数
大多因数都是成对出现的,平方根除外
例如
16的因数有 1和16,2和8,4
4是16的平方根
一个常见的求一个数因数的思路
用n逐个去除从1~sqrt(n)的数,如果没有余数则是n的因数p
由于因数是成对出现的,所以n/p是另外一个因数
考虑平方根的情况
3 思路分析
35.①处应填( )
A. n%i==0
B. n%i==1
C. n%(i-1)==0
D. n%(i-1)==1
答案 A
分析
找出1~sqrt(n)范围内的数i,可以整除n,即n%i==0,这样的i是n的一个因子
找到这些因子i,放入vector数组fac中
36.②处应该填( )
A. n/fac[k]
B. fac[k]
C. fac[k]-1
D. n/(fac[k]-1)
答案 B
分析
循环遍历vector数组fac,打印上一步放入的1~sqrt(n) 之间的因子
37.③处应该填( )
A. (i-1) * (i-1) == n
B. (i-1) * i==n
C. i * i==n
D. i * (i-1) == n
答案 C
分析
结合整个程序,输出特殊因子平方根
此处对平方根的判断,i * i==n
38.④处应该填( )
A. n-i
B. n-i+1
C. i-1
D. i
答案 D
分析
结合37题可以看出,这里输出平方根i
39.⑤处应该填( )
A. n/fac[k]
B. fac[k]
C. fac[k]-1
D. n/(fac[k]-1)
答案 A
由于因子是成对出现的,输出fac因子对应的另外一个因子
循环遍历vector数组fac,每个元素fck[k],另外一个因子为: n/fcm[k]
作者:newcode 更多资源请关注纽扣编程微信公众号
从事机器人比赛、机器人等级考试、少儿scratch编程、信息学奥赛等研究学习