PTA 函数与递归部分题目讲解及思路

7-1 判断素数

题目分析

题目输入n个数,判断其是否为质数
对于判断质数,只需要满足从2开始遍历的每一个数一直到√n均无法被n整除即可

关于为什么只要到√n呢?
因为n = √n * √n,因此其最大的因数不会超过√n,因此可以优化减少不必要的循环

AC Code

#include<iostream>
#include<cmath>
using namespace std;
bool is_prime(int num) { 
    if (num <= 1) {
        return false;
    }
    for (int i = 2; i <= sqrt(num); i++) {
        if (num % i == 0) { 
            return false;
        }
    }
    return true;
}
int main()
{
    int n,t;
    cin >> n;
    while(n--)
    {
        cin>>t;
        if(is_prime(t)) cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
}

7-2 求幂之和

题目分析

按照题目所给的公式计算即可

代码思路及优化思路

可以使用do-while结合--n优化代码

AC Code

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
    int n,sum=0;
    cin >> n;
    do
    {
        sum += pow(2,n);
    }while(--n);
    cout<<"result = "<<sum;
}

7-3 近似求PI

题目分析

按照题目给的公式计算即可

AC Code

#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
    double eps;
    cin >> eps;
    double sum=1;
    double t=1;
    for(int i=1;t>eps;i++)
	{
        t = t*i/(2*i+1);
        sum += t;
    }
    printf("PI = %.5f\n", 2*sum);
    return 0;
}

7-4哥德巴赫猜想

题目分析

首先,我们需要验证的是一个偶数是否可以拆分成两个质数的和,而且题目中明确表示,答案应当由拆分出多组结果中的一个最小的质数和一个最大的质数组成的结果

例如 24 = 5 + 19 = 7 + 17
由于 5 + 19为最大质数和最小质数,因此取改组作为最终答案输出

代码思路及优化思路

首先获取一个输入的偶数n,由于需要取最大和最小的质数,因此我们直接从最小的质数开始向后遍历,只需要判断n-i是否也为质数,如果成立,则i为最小质数,n-i为最大质数,作为答案直接输出即可

AC Code

#include <iostream>
#include <cmath>
using namespace std;
bool is_prime(int num) { 
    if (num <= 1) {
        return false;
    }
    for (int i = 2; i <= sqrt(num); i++) {
        if (num % i == 0) { 
            return false;
        }
    }
    return true;
}
int main()
{
    int n;
    cin >> n;
    for(int i=2;i<n;i++)
    {
        if(is_prime(i))
        {
            if(is_prime(n - i)) 
            {
                cout << n <<" = "<<i<<" + "<<n-i;
                return 0;
            }
        }
    }
}

7-5Jack cheng的烦恼3

题目分析

首先,题目给出了真素数的条件,及本身为素数的前提,同时保证各个位上的和也为质数,因此我们首先要判断给出的数是否为素数,然后将每一位取出,并且存放进容器中,然后求和再次判断和是否也为素数

例如 11为真素数
由于11本身为素数,同时各个位之和1+1=2也为素数,因此它为真素数
相反,例如13,虽然本身为素数,但是各个位数之和1+3=4不为素数,因此他不是真素数

代码思路及优化思路

首先获取一个输入的数n,利用函数isturePrime来判断是否为真素数
关于如何获取n的每一位的思路:因为n是整数,因此n%10即可得到其个位数,我们将其存入vector中(一种特殊的数组),然后n/=10,由于原数n为整数,因此n/10之后会舍弃个位的余数,得到新的数,如此反复即可得到n的每一位,直到n为0为止

例如 123
123 % 10 = ***3***
123 / 10 = 12
12 % 10 = ***2***
12 / 10 = 1
1 % 10 = ***1***
1 / 10 = 0(至此停止循环)

AC Code

#include <bits/stdc++.h>
using namespace std;
bool is_prime(int num) { 
    if (num <= 1) {
        return false;
    }
    for (int i = 2; i <= sqrt(num); i++) {
        if (num % i == 0) { 
            return false;
        }
    }
    return true;
}
bool isturePrime(int u)
{
    int sum = 0;
    int n = u;
    vector<int> wei;
    while(n != 0)
    {
        wei.push_back(n % 10); //依次取出n的每一位
        n /= 10; //舍去去除的位数
    }
    for(int i:wei)
    {
        sum+=i;//对取出的每一位求和
    }
    return is_prime(u)&&is_prime(sum);//如果本身为质数且各个位之和为质数,即为真素数
}
int main()
{
    int n;
    cin >> n;
    if(isturePrime(n))
        cout<<"yes";
    else
        cout<<"no";
}

7-6求n以内最大的k个素数以及它们的和

题目分析

首先,题目要求计算并输出不超过n的最大的k个素数以及它们的和,若n以内不够k个素数,则按实际个数输出

代码思路及优化思路

首先,程序结束有两个条件即n范围内所有质数不足k个则输出所有范围内实际存在的质数,或者质数(从大到小)的个数达到k,满足其一即可,所以可以把k看成质数的名额,因此我们可以利用while(n--&&k)优雅的判断结束
在代码中,n为迭代器,从输入的范围开始由大到小向0开始遍历,k为质数个数,只要找到一个符合条件的n,则k--(即占了一个名额),同时,我们每找到一个质数就直接输出一次,然后再将他累加到和sum中即可
循环结束后,只需要输出‘=’+sum即可

AC Code

#include <bits/stdc++.h>
using namespace std;
bool is_prime(int num) { 
    if (num <= 1) {
        return false;
    }
    for (int i = 2; i <= sqrt(num); i++) {
        if (num % i == 0) { 
            return false;
        }
    }
    return true;
}
int main()
{
    int n,k,sum=0;
    bool first = true;
    cin >> n >> k;
    while(n-- && k)
    {
        if(is_prime(n))
        {
            k--;
            sum += n;
            if(!first) //判断是否为第一次输出,因为第一次输出不需要输入加号+,之后的每次输出之前都用加号连接两个数
            {
                cout<<"+";
            }else first = false;
            cout<<n;
        }
    }
    cout<<"="<<sum;
}
posted @ 2023-10-18 21:41  橙之夏  阅读(193)  评论(0编辑  收藏  举报