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;
}
PTA 函数与递归部分题目讲解及思路的更多相关文章
- C51函数的递归调用
前几天在写C51程序时用到了递归,简单程序如下: void WRITE_ADD(uchar addr,uchar wbyte) { START(); //先发送起始信号 WRITE_BYTE(0xa0 ...
- 莫队浅谈&题目讲解
莫队浅谈&题目讲解 一.莫队的思想以及莫队的前置知识 莫队是一种离线的算法,他的实现借用了分块的思想.在学习莫队之前,本人建议学习一下分块,并对其有一定的理解. 二.莫队 现给出一道例题:bz ...
- python3 函数的形参、实参、位置参数、默认参数、关键字参数以及函数的递归
python 版本 3.5 #Author by Andy#_*_ coding:utf-8 _*_def func(x,y=2): print('我是形参%s'%x) print('我是默认参y-- ...
- C笔记01:关于printf函数输出先后顺序的讲解
关于printf函数输出先后顺序的讲解!! 对于printf函数printf("%d%d\n", a, b);函数的实际输出顺序是这样的先计算出b,然后再计算a,接着输出a,最后再 ...
- Day3 - Python基础3 函数、递归、内置函数
Python之路,Day3 - Python基础3 本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8. ...
- 你好,C++(27)在一个函数内部调用它自己本身 5.1.5 函数的递归调用
5.1.5 函数的递归调用 在函数调用中,通常我们都是在一个函数中调用另外一个函数,以此来完成其中的某部分功能.例如,我们在main()主函数中调用PowerSum()函数来计算两个数的平方和,而在P ...
- [C++程序设计]函数的递归调用
在调用一个函数的过程中又出现直接或间接地调用 该函数本身,称为函数的递归(recursive)调用. 包含递归调用的函数称为递归函数. 在实现递归时,在时间和空间上的开销比较大 求n! #includ ...
- 利用php函数mkdir递归创建层级目录
项目开发中免不了要在服务器上创建文件夹,比如上传图片时的目录,模板解析时的目录等.这不当前手下的项目就用到了这个,于是总结了几个循环创建层级目录的方法. php默认的mkdir一次只能创建一层目录,而 ...
- Python基础之内置函数和递归
一.内置函数 下面简单介绍几个: 1.abs() 求绝对值 2.all() 如果 iterable 的所有元素都为真(或者如果可迭代为空),则返回 True 3.any() 如果 iterable 的 ...
- 16汇编第十讲完结Call变为函数以及指令的最后讲解
16汇编完结Call变为函数以及指令的最后讲解 学了10天的16位汇编,这一讲就结束了,这里总结一下昨天的LOOP指令的缺陷,因为lOOP指令的缺陷,所以我们都改为下面的汇编代码使用了,自己去写,其中 ...
随机推荐
- WPF学习:Slider — 冒泡显示值
想做一个下图所示的Slider,以冒泡的方式显示其Value值,该怎么做呢? 功能要求,当鼠标放在滑块上的时候,冒"泡"显示值:当滑块移动的时候,"泡"跟随移动 ...
- 使用MySQL存储过程提高数据库效率和可维护性
MySQL 存储过程是一种强大的数据库功能,它允许你在数据库中存储和执行一组SQL语句,类似于编程中的函数.存储过程可以大幅提高数据库的性能.安全性和可维护性.本文将详细介绍MySQL存储过程的使用. ...
- Solution -「ZJOI 2014」力
Descrption Link. 对于每一个 \(i\),求出: \[\sum_{j=1}^{i-1}\frac{a_{j}}{(i-j)^{2}}-\sum_{j=i+1}^{n}\frac{a_{ ...
- 【知识杂谈#1】Linux如何安装net-tools和sbin配置PATH
1. Linux下载net-tools 在Linux上下载net-tools包的方法可能会因你所使用的Linux发行版而有所不同.在某些现代的Linux发行版中,net-tools已经被弃用,而推荐使 ...
- 第一次git上传的完整流程
第一次git上传的完整流程 使用git简单命令上传代码push到远程仓库 + 简单介绍了一个.git文件结构. 代码上传到gitee和github流程一样的,不过你上传到github可能网不行失败,所 ...
- AIGC革新,将文字或者LOGO融入AI视频基于PIKA-labs(Python3.10)
很多平台都会禁止用户使用带有网址或者二维码的头像以及文章配图,这样可以有效的防止用户的一些"导流"行为.当然,头像.文章或者视频现在都是AI来审,毕竟现在人工的成本实在太高,但是如 ...
- Python网络编程——TCP套接字通信、通信循环、链接循环、UDP通信
文章目录 基于TCP的套接字通信 加上通信循环 加上链接循环 基于UDP协议的套接字通信 基于TCP的套接字通信 以买手机的过程为例 服务端代码 import socket # 1.买手机 phone ...
- 8. 用Rust手把手编写一个wmproxy(代理,内网穿透等), HTTP改造篇之HPACK原理
用Rust手把手编写一个wmproxy(代理,内网穿透等), HTTP改造篇之HPACK原理 项目 ++wmproxy++ gite: https://gitee.com/tickbh/wmproxy ...
- umich cv-3-2
UMICH CV Neural Network 既然谈到神经网络,我们肯定要讨论在神经网络中是如何进行梯度的计算以及参数的优化的 传统的方法就是我们手动计算梯度,但是随着神经网络层数的增加,这种方法显 ...
- 云图说|初识API中心APIHub
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:API中心是为AP ...