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;
}

PTA 函数与递归部分题目讲解及思路的更多相关文章

  1. C51函数的递归调用

    前几天在写C51程序时用到了递归,简单程序如下: void WRITE_ADD(uchar addr,uchar wbyte) { START(); //先发送起始信号 WRITE_BYTE(0xa0 ...

  2. 莫队浅谈&题目讲解

    莫队浅谈&题目讲解 一.莫队的思想以及莫队的前置知识 莫队是一种离线的算法,他的实现借用了分块的思想.在学习莫队之前,本人建议学习一下分块,并对其有一定的理解. 二.莫队 现给出一道例题:bz ...

  3. python3 函数的形参、实参、位置参数、默认参数、关键字参数以及函数的递归

    python 版本 3.5 #Author by Andy#_*_ coding:utf-8 _*_def func(x,y=2): print('我是形参%s'%x) print('我是默认参y-- ...

  4. C笔记01:关于printf函数输出先后顺序的讲解

    关于printf函数输出先后顺序的讲解!! 对于printf函数printf("%d%d\n", a, b);函数的实际输出顺序是这样的先计算出b,然后再计算a,接着输出a,最后再 ...

  5. Day3 - Python基础3 函数、递归、内置函数

    Python之路,Day3 - Python基础3   本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8. ...

  6. 你好,C++(27)在一个函数内部调用它自己本身 5.1.5 函数的递归调用

    5.1.5 函数的递归调用 在函数调用中,通常我们都是在一个函数中调用另外一个函数,以此来完成其中的某部分功能.例如,我们在main()主函数中调用PowerSum()函数来计算两个数的平方和,而在P ...

  7. [C++程序设计]函数的递归调用

    在调用一个函数的过程中又出现直接或间接地调用 该函数本身,称为函数的递归(recursive)调用. 包含递归调用的函数称为递归函数. 在实现递归时,在时间和空间上的开销比较大 求n! #includ ...

  8. 利用php函数mkdir递归创建层级目录

    项目开发中免不了要在服务器上创建文件夹,比如上传图片时的目录,模板解析时的目录等.这不当前手下的项目就用到了这个,于是总结了几个循环创建层级目录的方法. php默认的mkdir一次只能创建一层目录,而 ...

  9. Python基础之内置函数和递归

    一.内置函数 下面简单介绍几个: 1.abs() 求绝对值 2.all() 如果 iterable 的所有元素都为真(或者如果可迭代为空),则返回 True 3.any() 如果 iterable 的 ...

  10. 16汇编第十讲完结Call变为函数以及指令的最后讲解

    16汇编完结Call变为函数以及指令的最后讲解 学了10天的16位汇编,这一讲就结束了,这里总结一下昨天的LOOP指令的缺陷,因为lOOP指令的缺陷,所以我们都改为下面的汇编代码使用了,自己去写,其中 ...

随机推荐

  1. tomcat远程部署

    使用maven的插件对tomcat进行远程部署,大大降低了部署步骤,对于远程部署调试也有一定的帮助 要让maven对够进行远程部署,我们需要对tomcat进行配置,主要是配置tomcat-user.x ...

  2. JDK8升级JDK11最全实践干货来了

    1.前言 截至目前(2023年),Java8发布至今已有9年,2018年9月25日,Oracle发布了Java11,这是Java8之后的首个LTS版本.那么从JDK8到JDK11,到底带来了哪些特性呢 ...

  3. Vue-入门vue,及第一个vue程序

    一.初始Vue 什么是vue Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架.它基于标准 HTML.CSS 和 JavaScript 构建,并提 ...

  4. 一个 println 竟然比 volatile 还好使?

    前两天一个小伙伴突然找我求助,说准备换个坑,最近在系统复习多线程知识,但遇到了一个刷新认知的问题-- 小伙伴:Effective JAVA 里的并发章节里,有一段关于可见性的描述.下面这段代码会出现死 ...

  5. Linux 下 C语言 open() 和 fopen() 区别

    Linux 下 C语言 open() 和 fopen() 区别   fopen() #include <stdio.h> FILE *fopen(const char *path, con ...

  6. MySQL 的 InnoDB 存储引擎简介

    MySQL 是世界上最流行的开源关系型数据库管理系统之一,而其中的存储引擎则是其关键组成部分之一.InnoDB 存储引擎在 MySQL 中扮演了重要角色,提供了许多高级功能和性能优化,适用于各种应用程 ...

  7. FFT & NTT 及其简单优化

    FFT FFT 是一种高效实现 DFT 和 IDFT 的方式,可以在 \(O(n \log n)\) 的时间内求多项式的乘法. 多项式的点值表示 不同于用每项的系数来表示一个多项式,我们知道对于给定的 ...

  8. 让物体动起来,Unity的几种移动方式

    一.前言 在大部分的Unity游戏开发中,移动是极其重要的一部分,移动的手感决定着游戏的成败,一个优秀的移动手感无疑可以给游戏带来非常舒服的体验.而Unity中有多种移动方法,使用Transform, ...

  9. Java进程(基础)

    基本概念 1.进程:程序的执行过程 2.线程:一个进程可以有单个线程也就是我们说的单线程,还可以有多个线程也就是我们说的多线程, 线程 1.当一个类继承了Thread类就可以当成一个线程用 2.我们会 ...

  10. 洛谷P1462spfa + 二分答案

    第一次接触二分答案的题目最开始是没有思路的看了一个题解,然后强行理解之后开始自己打了一遍,然而结果是只得了30分过了3个点其他全wa,之后是漫长的debug,这里想感慨一句自己debug的速度是真慢. ...