信息学奥赛初赛天天练-28-CSP-J2022完善程序-枚举求因数、类型转换秘籍、取整技巧、Vector数组实战应用

PDF文档公众号回复关键字:20240617
在这里插入图片描述

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]

  • 13
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值