PDF文档公众号回复关键字:20240604
1 2023 CSP-J 阅读程序3
阅读程序(程序输入不超过数组成字符串定义的范围:判断题正确填√,错误填×;除特殊说明外,判断题1.5分,选择题3分,共计40分)
源程序
#include <iostream>
#include <cmath>
using namespace std;
int solve1(int n){
return n*n;
}
int solve2(int n){
int sum=0;
for(int i=1;i<=sqrt(n);i++){
if(n%i==0){
if(n/i==i){
sum+=i*i;
}else{
sum+=i*i+(n/i)*(n/i);
}
}
}
return sum;
}
int main(){
int n;
cin>>n;
cout<<solve2(solve1(n))<<" "<<solve1((solve2(n)))<<endl;
return 0;
}
假设输入的n是绝对值不超过1000的整数,完成下面的判断题和单选题。
判断题
27(2分)如果输入的n为正整数,solve2函数的作用是计算n所有的因子的平方和( )
28 (2分) 第13~14行的作用是避免n的平方根因子i(或n/i)进入第16行而被计算两次( )
29 (2分)如果输入的n为质数,solve2(n)的返回值为n^2+1( )
单选题
30 (4分)如果输入的n为质数p的平方,那么solve2(n)的返回值为( )
A p^2+p+1
B n^2+n+1
C n^2+1
D p^4+2p^2+1
31(3分)当输入为正整数时,第一项减去第二项的差值一定( )
A 大于0 B 大于等于0且不一定大于0 C 小于0 D 小于等于0且不一定小于0
32 (3分) 当输入为“5”时,输出为( )
A "651 625"
B "650 729"
C "651 676"
D "652 625"
2 相关知识点
1) 因数
因数,也被称为约数,用于描述两个正整数之间的关系。如果一个整数a除以另一个非零整数b的商是整数,且没有余数,那么我们就说b是a的因数。
例如
6的因数有:1、2、3、6
10的因数有:1、2、5、10
注意
任何正整数都有至少两个因数:1和它本身
0的因数在数论中通常不讨论,因为0除以任何非零数都是0,但这不是通常所说的“整除”
一个数的因数总是成对出现的(除了完全平方数,其平方根会出现两次,如4的因数是1,2,2,4)
2)质数
质数和合数是数学中对于自然数(不包括0和1)的两种重要分类
质数 (Prime Number)
一个大于1的自然数,除了1和它本身以外不再有其他因数的数称为质数
例如
2、3、5、7、11、13、17、19等都是质数
注意
质数只有两个正因数:1和它本身
合数
合数是指在大于1的整数中,除了能被1和本身整除外,还能被其他数(0除外)整除的数
4、6、8、9、10、12、14、15等都是合数
注意
合数至少有三个正因数,除1和本身以外还有至少一个正因数
3 思路分析
solve2代码逻辑
1 循环1~sqrt(n) ,对所有因数处理 (n%i==0)
2 n/i==i 时累加i 的平方(等同 n/i * i),这时只有一个因子,累加因子i的平方
3 n/i!=i 时累加i的平方和(n/i)的平方,此时累加2个因子的平方
4 综合上述1,2,3步骤,可以看出solve2函数的主要功能是累加一个数的所有因子的平方和
/*
n=8时
所以因子分别为 1 8 2 4
sum=1*1 + 8 * 8 + 2 * 2 + 4 * 4=85
*/
int solve2(int n){
int sum=0;
for(int i=1;i<=sqrt(n);i++){
if(n%i==0){
if(n/i==i){
sum+=i*i;
}else{
sum+=i*i+(n/i)*(n/i);
}
}
}
return sum;
}
假设输入的n是绝对值不超过1000的整数,完成下面的判断题和单选题。
判断题
27(2分)如果输入的n为正整数,solve2函数的作用是计算n所有的因子的平方和( )
答案 T
分析
根据对solve2函数的分析可以知,solve2函数的作用是计算n所有的因子的平方和
28 (2分) 第13~14行的作用是避免n的平方根因子i(或n/i)进入第16行而被计算两次( )
答案 T
分析
如果平方根因子是整数时,累加一次,如果去掉13-14行,程序执行逻辑会改变
//以n=4为例
//平方根2 改变前执行 sum+=2 * 2;
sum+=i*i;
//平方根2 改变后执行 sum+=2 * 2 + (4/2)*(4/2) = 2 * 2 + 2 * 2
sum+=i*i+(n/i)*(n/i);
所以第16造成平方根因子被加2次
29 (2分)如果输入的n为质数,solve2(n)的返回值为n^2+1( )
答案 T
分析
由于质数只有2个因子,1和本身
所以所有因子平方和之和为1的平方+n的平方=n^2+1
单选题
30 (4分)如果输入的n为质数p的平方,那么solve2(n)的返回值为( )
A p^2+p+1
B n^2+n+1
C n^2+1
D p^4+2p^2+1
答案 B
分析
质数p的平方,有3个因子,1和p和p^2
所以所有因子平方和
1^2 + p^2 +( p^2 )^2
由于
n=p^2
整理上述2个式子得
1+n+n^2
所以选B
31(3分)当输入为正整数时,第一项减去第二项的差值一定( )
A 大于0 B 大于等于0且不一定大于0 C 小于0 D 小于等于0且不一定小于0
答案 D
分析
cout<<solve2(solve1(n))<<" "<<solve1((solve2(n)))<<endl;
//solve2(solve1(n)) 先计算solve1函数,再计算solve2函数,对n先平方再求n平方的因子平方和
//solve1(solve2(n)) 先计算solve2函数,再计算solve1函数,先计算n的因子平方和再平方
n=1时
solve1(1)=1
solve2(1)=1
所以solve2(solve1(1))=1
solve1(solve2(n))=1
第一项减去第二项的差值=0
n=4时
solve1(4)=16
solve2(16)=1^2+16^2+2^2+8^2+4^2=341
solve2(solve1(4))=341
solve2(4)=1^2 +4^2 + 2^2 = 21
solve1(21)=441
solve1(solve2(4))=441
第一项减去第二项的差值341-441<0
n=5时
solve1(5)=25
solve2(25)=1^2+25^2+5^2=651
solve2(solve1(5))=625
solve2(5)=1^2 +5^2 = 26
solve1(26)=676
solve1(solve2(4))=676
第一项减去第二项的差值625-676<0
所以选D
32 (3分) 当输入为“5”时,输出为( )
A "651 625"
B "650 729"
C "651 676"
D "652 625"
答案 C
分析
n=5时
solve1(5)=25
solve2(25)=1^2+25^2+5^2=651
solve2(solve1(5))=625
solve2(5)=1^2 +5^2 = 26
solve1(26)=676
solve1(solve2(4))=676
所以选C