信息学奥赛初赛天天练-19-挑战程序阅读-探索因数、所有因数平和、质数的奥秘

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的商是整数,且没有余数,那么我们就说ba的因数。

例如

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
posted @ 2024-06-04 20:50  new-code  阅读(0)  评论(0编辑  收藏  举报