质数和约数

试除法判定质数

问题描述

给定 n 个正整数 ai,判定每个数是否是质数。

输入格式

第一行包含整数 n。

接下来 n 行,每行包含一个正整数 ai。

输出格式

共 n 行,其中第 i 行输出第 i 个正整数 ai 是否为质数,是则输出 Yes,否则输出 No。

数据范围

1≤n≤100,1≤ai≤231−1

输入样例

2
2
6

输出样例

Yes
No

问题分析

质数定义:一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数,这个数就是质数。

给定一个数 x,判断 x 是否为质数:

用 x 除以 2 ~ x - 1 中的每个数,如果出现了余数为 0,则这个数不是质数,如果没有出现余数为 0,则这个数是质数。

优化:

一个数 x 分解成两个数的乘积,则这两个数中,一定有一个数大于根号 x,一个数小于根号x。

所以,可以用 x 除以 2 ~ 根号x 中的每个数,如果出现了余数为 0,则这个数不是质数,如果没有出现余数为 0,则这个数是质数。

代码

#include<bits/stdc++.h>
using namespace std;
const int N=110;
int n;
int a[N];
bool is_prime(int n)
{if(n<2) return false;for(int i=2;i<=n/i;i++){if(n%i==0) return false;}return true;
}
int main()
{cin>>n;for(int i=1;i<=n;i++){cin>>a[i];if(is_prime(a[i])) cout<<"Yes"<<endl;else cout<<"No"<<endl;}return 0;
}

分解质因数

问题描述

给定 n 个正整数 ai,将每个数分解质因数,并按照质因数从小到大的顺序输出每个质因数的底数和指数。

输入格式
第一行包含整数 n。

接下来 n 行,每行包含一个正整数 ai。

输出格式
对于每个正整数 ai,按照从小到大的顺序输出其分解质因数后,每个质因数的底数和指数,每个底数和指数占一行。

每个正整数的质因数全部输出完毕后,输出一个空行。

数据范围
1≤n≤100,2≤ai≤2×109

输入样例

2
6
8

输出样例

2 1
3 12 3

问题分析

  • x 的质因子最多只包含一个大于 根号x 的质数。如果有两个,这两个因子的乘积就会大于 x,矛盾。

  • i 从 2 遍历到 根号x。 用 x / i,如果余数为 0,则 i 是一个质因子。

  • s 表示质因子 i 的指数,x /= i 为 0,则 s++, x = x / i 。

  • 最后检查是否有大于 根号x 的质因子,如果有,输出。

代码

#include<bits/stdc++.h>
using namespace std;
int n;
void div(int n)
{for(int i=2;i<=n/i;i++){if(n%i==0){int s=0;while(n%i==0) n/=i,s++;cout<<i<<" "<<s<<endl;}}if(n>1) cout<<n<<" "<<1<<endl;
}
int main()
{cin>>n;int x;for(int i=1;i<=n;i++){cin>>x;div(x);cout<<endl;}return 0;
}

筛质数

问题描述

给定一个正整数 n,请你求出 1∼n 中质数的个数。

输入格式

共一行,包含整数 n。

输出格式

共一行,包含一个整数,表示 1∼n 中质数的个数。

数据范围

1≤n≤106

输入样例

8

输出样例

4

问题分析

代码

朴素筛法

#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
int prime[N],cnt;
bool st[N];
int n;
void get_prime(int n)
{for(int i=2;i<=n;i++){if(st[i]) continue;prime[cnt++]=i;for(int j=i+i;j<=n;j+=i)st[j]=true;}
}
int main()
{cin>>n;get_prime(n);cout<<cnt<<endl;return 0;
}

线性筛法

#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
int prime[N],cnt;
bool st[N];
int n;
void get_prime(int n)
{for(int i=2;i<=n;i++){if(!st[i]) prime[cnt++]=i;for(int j=0;prime[j]<=n/i;j++){st[prime[j]*i]=true;if(i%prime[j]==0) break;}}
}
int main()
{cin>>n;get_prime(n);cout<<cnt<<endl;return 0;
}

试除法求约数

问题描述

给定 n 个正整数 ai,对于每个整数 ai,请你按照从小到大的顺序输出它的所有约数。

输入格式

第一行包含整数 n。

接下来 n 行,每行包含一个整数 ai。

输出格式

输出共 n 行,其中第 i 行输出第 i 个整数 ai 的所有约数。

数据范围

1≤n≤100,1≤ai≤2×109

输入样例

2
6
8

输出样例

1 2 3 6 
1 2 4 8 

问题分析

什么是约数:如果一个数a除以另一个数b的余数为0,即 a%b == 0, 则b是a的约数。

如何求一个数x的所有约数:

用 x 除以 1 到 x 的所有数,如果余数是0,则把除数加到答案中。

优化

  • 如果 a / b = c···0,则一定有 a % c = b····0。所以一个数 x 的约数肯定是成对存在的,对称轴是 根号x。
  • 因此,只需要用 x 除以 1 到 根号x 之间的数,如果余数是0,则把除数以及x / 除数加到答案中。

代码

#include<bits/stdc++.h>
using namespace std;vector<int> get_divisors(int x)
{vector<int> res;for (int i = 1; i <= x / i; i ++ )if (x % i == 0){res.push_back(i);if (i != x / i) res.push_back(x / i);}sort(res.begin(), res.end());return res;
}int main()
{int n;cin >> n;while (n -- ){int x;cin >> x;auto res = get_divisors(x);for (auto x : res) cout << x << ' ';cout << endl;}return 0;
}

约数个数

问题描述

给定 n 个正整数 ai,请你输出这些数的乘积的约数个数,答案对 109+7 取模。

输入格式

第一行包含整数 n。

接下来 n 行,每行包含一个整数 ai。

输出格式

输出一个整数,表示所给正整数的乘积的约数个数,答案需对 109+7 取模。

数据范围

1≤n≤100,1≤ai≤2×109

输入样例

3
2
6
8

输出样例

12

问题分析

一个数的约数是由这个数的几个质因子相乘得到的。

例如:12 的质因子有 2,3。12的约数有:1,2,3,4,6,12。

约数1 是由 0 个 2, 0 个3相乘得到的。
约数2 是由 1 个 2, 0 个3相乘得到的。
约数3 是由 0 个 2, 1 个3相乘得到的。
约数4 是由 2 个 2, 0 个3相乘得到的。
约数6 是由 1 个 2, 1 个3相乘得到的。
约数12 是由 2 个 2, 1 个3相乘得到的。
12 可以分解为:22*31。所以2可以取 0 ~ 2个,3种取法。3可以取 0~1 个,2种取法。12的约数一共:2 * 3 = 6个。

也就是:把一个数N 写成:N = (p1x1)(px2)(p3x3)…(pk^xk),其中pi为质数。则N的约数个数为:(x1+1)(x2+1)(x3+1)…(xk+1)

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=110,MOD=1e9+7;
int main()
{int n;cin>>n;unordered_map<int, int> primes;while(n--){int x;cin>>x;for(int i=2;i<=x/i;i++)while(x%i==0){primes[i]++;x/=i;}if(x>1) primes[x]++;}ll res=1;for(auto x:primes) res=res*(x.second+1)%MOD;cout<<res<<endl;return 0;
}

约数之和

问题描述

给定 n 个正整数 ai,请你输出这些数的乘积的约数之和,答案对 109+7 取模。

输入格式

第一行包含整数 n。

接下来 n 行,每行包含一个整数 ai。

输出格式

输出一个整数,表示所给正整数的乘积的约数之和,答案需对 109+7取模。

数据范围

1≤n≤100,1≤ai≤2×109

输入样例

3
2
6
8

输出样例

252

问题分析

如果 N=p1c1∗p2c2∗…∗pkck

约数个数:(c1+1)∗(c2+1)∗…∗(ck+1)

约数之和: (p10+p11+…+p1c1)∗…∗(pk0+pk1+…+pkck)

while (b - - ) t = (t * a + 1) % mod;

t=t∗p+1

t=1
t=p+1
t=p2+p+1

t=pb+pb-1+…+1

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
int main()
{int n;cin>>n;unordered_map<int,int> primes;while(n--){int x;cin>>x;for(int i=2;i<=x/i;i++){while(x%i==0){x/=i;primes[i]++;}}if(x>1) primes[x]++;}ll res=1;for(auto p:primes){int a=p.first,b=p.second;ll t=1;while(b--) t=(t*a+1)%mod;res=res*t%mod;}cout<<res<<endl;return 0;
}

最大公约数

问题描述

给定 n 对正整数 ai,bi,请你求出每对数的最大公约数。

输入格式

第一行包含整数 n。

接下来 n 行,每行包含一个整数对 ai,bi。

输出格式

输出共 n 行,每行输出一个整数对的最大公约数。

数据范围

1≤n≤105,1≤ai,bi≤2×109

输入样例

2
3 6
4 6

输出样例

3
2

问题分析

什么是最大公约数
最大公约数(Greatest Common Divisor)指两个或多个整数共有约数中最大的一个。也称最大公因数、最大公因子,a, b的最大公约数记为(a,b),同样的,a,b,c的最大 公约数记为(a,b,c),多个 整数的最大公约数也有同样的记号。求最大公约数有多种 方法,常见的有 质因数分解法、 短除法、 辗转相除法、 更相减损法。

辗转相减法求最大公约数
用(a,b)表示a和b的最大公因数:有结论(a,b)=(a,ka+b),其中a、b、k都为自然数。

也就是说,两个数的最大公约数,将其中一个数加到另一个数上,得到的新数,其公约数不变,比如(4,6)=(4+6,6)=(4,6+2×4)=2.

要证明这个原理很容易:如果p是a和ka+b的公约数,p整除a,也能整除ka+b.那么就必定要整除b,所以p又是a和b的公约数,从而证明他们的最大公约数也是相等的.

基于上面的原理,就能实现我们的迭代相减法:(78,14)=(64,14)=(50,14)=(36,14)=(22,14)=(8,14)=(8,6)=(2,6)=(2,4)=(2,2)=(0,2)=2

基本上思路就是大数减去小数,一直减到能算出来为止,在作为练习的时候,往往进行到某一步就已经可以看出得值.

辗转相减到辗转相除
迭代相减法简单,不过步数比较多,实际上我们可以看到,在上面的过程中,由(78,14)到(8,14)完全可以一步到位,因为(78,14)=(14×5+8,14)=(8,14),由此就诞生出我们的辗转相除法.

即:(a, b) = (a % b, b) = (b, a %b)

相当于每一步都把数字进行缩小,等式右边就是每一步对应的缩小结果。

对(a, b)连续使用辗转相除,直到小括号内右边数字为0,小括号内左边的数就是两数最大公约数。

代码

#include<bits/stdc++.h>
using namespace std;
int n;
int gcd(int a,int b)
{return b?gcd(b,a%b):a;
}
int main()
{cin>>n;for(int i=0;i<n;i++){int a,b;cin>>a>>b;cout<<gcd(a,b)<<endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/15285.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

黄金价格创新高,交易风险提示

在全球经济格局中&#xff0c;黄金一直被视为避险资产&#xff0c;尤其在美联储降息预期逐步兑现以及地缘政治不确定性上升的背景下&#xff0c;投资者纷纷寻求安全资产。近期&#xff0c;上海黄金交易所针对黄金价格的异常波动&#xff0c;向市场参与者发出了交易风险提示&…

从 0 开始本地部署大语言模型

1、准备 ● Ollama&#xff1a;ollama.com ● Docker&#xff1a;https://docs.openwebui.com/ 2、下载 Ollama 进入 Ollama 官网&#xff0c;点击 Download 。 下载完成后&#xff0c;双击安装&#xff0c;什么都不需要勾选&#xff0c;直接下一步即可。安装完成&#xf…

PYQT5点击Button执行多次问题解决方案(亲测)

PYQT5点击Button却执行多次问题 使用pyqt5时遇到问题&#xff0c;UI上按钮点击一次&#xff0c;对应的槽函数却执行了3遍 首先&#xff0c;确认函数名无冲突&#xff0c;UI button名无命名冲突&#xff0c;下图是简单的示例程序&#xff1a; 运行后&#xff0c;点击按钮&#…

electron调试自动更新,不触发下载进度解决方案

调试时候删除掉后缀是.blockmap的文件。如果你的代码在改动不大的情况下发布一个新版本。那个安装器可能会根据这个数据自动合成一个包&#xff0c;而不走网络路径。从而不触发下载进度。

什么是js

JavaScript&#xff08;通常缩写为JS&#xff09;是一种轻量级的编程语言&#xff0c;它是一种实现网页交互性的客户端脚本语言。JavaScript 与 HTML 和 CSS 并列&#xff0c;是构建和开发网页和网页应用程序的三大核心技术之一。 JavaScript 可以用于创建动态的网页内容&#…

Spring框架学习笔记(四):手动实现 Spring 底层机制(初始化 IOC容器+依赖注入+BeanPostProcessor 机制+AOP)

1 Spring 整体架构示意图 2 阶段 1 -- 编写自己的 Spring 容器&#xff0c;实现多层扫描包 编写自己的 Spring 容器&#xff0c;实现多层扫描包&#xff0c;排除包下不是bean的&#xff0c; 得到 bean 对象&#xff0c;放入到临时ioc容器中 代码实现&#xff1a; &#xff0…

OSM最新台湾电力数据(2024年5月23日数据)转换总结及与(2024年2月16日数据)转换结果对比

osm包含种类繁多&#xff0c;我们这里是只以刚转换的台湾电力设备为例抛砖引玉的进行说明。本次仅仅转换了&#xff0c;变电站、电厂和线路杆塔数据&#xff01; 这种带增强的文件&#xff0c;是我在基础规则之外增加的提取规则。是为了更多的将OSM相关类型数据过滤提取出来&am…

干货 | 2024 EISS 企业信息安全高峰论坛(脱敏)PPT(7份可下载)

2024 EISS 企业信息安全高峰论坛&#xff08;脱敏&#xff09;PPT&#xff0c;共7份。 AI在出海业务的安全实践.pdf Palo Alto Networks为中国企业全球化布局保驾护航.pdf 安全建设与治理思路.pdf 车路云一体化安全体系建设实践.pdf 企业研发安全DevSecOps流程落地实践.pdf 浅谈…

c++入门的基础知识

c入门 C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式等。熟悉C语言之后&#xff0c;对C学习有一定的帮助&#xff0c;本章节主要目标&#xff1a; 补充C语言语法的不足&#xff0c;以及C是如何对C语言设计…

2024年收集搜索引擎蜘蛛大全以及浏览器模拟蜘蛛方法

对于做SEOer来说经常和搜索引擎蜘蛛打交道&#xff0c;下面整理收集了最全的搜索引擎蜘蛛大全。供有需要的朋友使用&#xff0c;建议收藏。 搜索引擎蜘蛛大全 "TencentTraveler", "Baiduspider", "BaiduGame", "bingbot",//必应蜘蛛…

电商SaaS系统中的公共功能和租户自定义功能探讨

在现代电商SaaS&#xff08;Software as a Service&#xff09;系统中&#xff0c;如何平衡公共功能和租户自定义功能是一个至关重要的问题。公共功能提供了基础服务&#xff0c;确保系统的稳定性和一致性&#xff0c;而租户自定义功能则允许各个租户根据自身需求进行个性化配置…

JAVA GUI之RGB配色

在Java GUI中&#xff0c;RGB配色是通过使用Color类来实现的。Color类提供了一些预定义的颜色常量&#xff0c;如Color.RED、Color.GREEN和Color.BLUE等。 RGB配色是通过指定红、绿和蓝三个颜色分量的值来创建颜色的。在Color类中&#xff0c;RGB分量的值取自0到255之间的整数。…

uni-app App端实现文字语音播报(Ba-TTS)

前言 最近在遇到消息提示语音播放出来&#xff0c;查了一圈文档发现并没有自带api 后面想起支付宝收钱播报&#xff0c;不受限与系统环境和版本环境&#xff08;后面查阅他是音频实现的&#xff09; 如果是由安卓端需要语音播放功能-直接使用Ba-TTs救急&#xff08;需要付费2…

详解CSS(一)

目录 1.CSS是什么 2.基本语法规范 3.引入方式 3.1内部样式表 3.2行内样式表 3.3外部样式表 4.选择器 4.1基础选择器 4.1.1标签选择器 4.1.2类选择器 4.1.3id选择器 4.1.4通配符选择器 4.2复合选择器 4.2.1后代选择器 4.2.2子选择器 4.2.3并集选择器 4.2.4伪类选择…

【通义千问—Qwen-Agent系列3】案例分析(五子棋游戏多Agent冒险游戏多智能体群组交流)

目录 前言一、快速开始1-1、介绍1-2、安装1-3、开发你自己的Agent 二、基于Qwen-Agent的案例分析2-0、环境安装2-1、五子棋游戏实现2-2、多Agent冒险游戏2-N、 多智能体群组交流&#xff08;太酷啦&#xff09; 附录1、agent源码2、router源码 总结 前言 Qwen-Agent是一个开发…

DataGear 制作服务端分页的数据可视化看板

DataGear 2.3.0 版本新增了附件图表数据集特性&#xff08;在新建图表时将关联的数据集设置为 附件 &#xff0c;具体参考官网文档定义图表章节&#xff09;&#xff0c;在制作看板时&#xff0c;可以基于此特性&#xff0c;结合dg-chart-listener&#xff0c;利用服务端数据扩…

基于高通公司AI Hub Models的On-Device AI学习:Introduction to On-Device AI

Introduction to On-Device AI 本文是学习 https://www.deeplearning.ai/short-courses/introduction-to-on-device-ai/这门课的学习笔记。 What you’ll learn in this course As AI moves beyond the cloud, on-device inference is rapidly expanding to smartphones, IoT…

MySQL 带游标的存储过程(实验报告)

一、实验名称&#xff1a; 带游标的存储过程 二、实验日期&#xff1a; 2024 年 5月 25 日 三、实验目的&#xff1a; 掌握MySQL带游标的存储过程的创建及调用&#xff1b; 四、实验用的仪器和材料&#xff1a; 硬件&#xff1a;PC电脑一台&#xff1b; 配置&#xff1…

[OpenGL] opengl切线空间

目录 一 引入 二 TBN矩阵 三 代码实现 3.1手工计算切线和副切线 3.2 像素着色器 3.3 切线空间的两种使用方法 3.4 渲染效果 四 复杂的物体 本章节源码点击此处 继上篇法线贴图 来熟悉切线空间是再好不过的。对于法线贴图来说,我们知道它就是一个2D的颜色纹理,根据rgb…