算法练习题03:分解质因数

news/2024/9/24 8:06:17/

【问题描述】 求出区间[a,b]中所有整数的质因数分解,统计一共有多少种不同的分法

【输入格式】 输人两个整数a和b。

【输出格式】 输出一行,一个整数,代表区间内质因数分解方法之和。

【输入样例】 6 10

【输出样例】 10

【样例说明】 6的质因数为2和3,一共有两个。7的质因数有7,只有一个。8的质因数有2、2、2,一共 有三个。9的质因数有3、3,一共有两个。10的质因数有2和5,一共有两个。所以答案为2+1+3+2+2=10。

【数据规模与约定】2<=a<=b<=10000

我的答案:

#include<iostream>
using namespace std;
bool isPrime(int n){int flag = 0;for(int i=n-1;i>1;i--){if(n%i==0){flag++;}}return (flag==0);
}
int main(){int a,b;cin>>a>>b;int dp[10001];int sum=0;for(int i=2;i<=b;i++){if(isPrime(i)){dp[i]=1;}else{for(int j=2;j<i;j++){if(i%j==0){dp[i] = dp[i/j]+dp[j];break;}}}}for(int i=a;i<=b;i++){sum+=dp[i];}cout<<sum;
}

改进点:

 1.优化 isPrime 函数

现在的 isPrime 函数效率较低,因为它从 n-1 一直检查到 2。事实上,只需检查到 sqrt(n) 即可。这是因为如果 n 不是质数,它的最小因子一定小于或等于 sqrt(n)。这样可以显著减少不必要的计算。

2. 初始化 dp 数组

建议在一开始将 dp 数组初始化为 0,以避免不确定的初始值导致的错误。

改进后:

#include<iostream>
#include<cmath> // 引入cmath库用于sqrt函数
using namespace std;// 判断是否是质数的函数
bool isPrime(int n) {if (n <= 1) return false;for (int i = 2; i <= sqrt(n); i++) {if (n % i == 0) return false; // 如果 n 能被 i 整除,说明不是质数}return true; // 没有因子,说明是质数
}int main() {int a, b;cin >> a >> b;int dp[10001] = {0}; // 初始化dp数组int sum = 0;for (int i = 2; i <= b; i++) {if (isPrime(i)) {dp[i] = 1; // 如果是质数,dp[i] 设为 1} else {for (int j = 2; j <= sqrt(i); j++) {if (i % j == 0) {dp[i] = dp[j] + dp[i / j]; // 通过因子分解计算质因数的和break; // 找到第一个因子后可以直接退出循环}}}}// 计算从a到b之间所有数的质因数总和for (int i = a; i <= b; i++) {sum += dp[i];}cout << sum; // 输出质因数的总和return 0;
}

老师给的答案:

#include <iostream>
#include <vector>using namespace std;// 判断是否是质数的函数
bool isPrime(int n) {if (n <= 1) {return false; // 1 和更小的数都不是质数}for (int i = 2; i <= n / 2; ++i) {if (n % i == 0) {return false; // 如果能被 i 整除,说明不是质数}}return true; // 如果没有因子,则是质数
}int main() {vector<int> v; // 存储2到b之间的所有质数int a, b;cout << "请输入两个整数 a 和 b,用空格分隔(a < b):" << endl;cin >> a >> b;// 找出所有在 2 到 b 之间的质数并存储到向量 v 中for (int i = 2; i <= b; ++i) {if (isPrime(i)) {v.push_back(i); // 如果 i 是质数,则存储到向量 v 中}}int sum = 0; // 用于记录质因数的总数// 从 a 开始处理直到 bfor (int i = a; i <= b; ++i) {if (isPrime(i)) {sum++; // 如果 i 是质数,则直接计数} else {// 不是质数时,分解质因数int temp = i; // 暂存 i 的值int index = 0; // 用于遍历质数数组的索引while (temp != 1) { // 当当前数字没有被除尽时if (temp % v[index] == 0) { // 如果能被当前质数整除sum++; // 计数temp /= v[index]; // 更新 temp 为除尽后的值index = 0; // 还原索引,重新从第一个质数(2)开始尝试} else {index++; // 尝试下一个质数}}}}cout << "质因数的总数为:" << sum << endl; // 输出质因数的总数return 0;
}

http://www.ppmy.cn/news/1517696.html

相关文章

RabbitMQ实战-JavaDemo

目录 前言 消息生产者 消息消费者 消息确认机制 消息持久化 Maven 依赖 总结 前言 在使用 RabbitMQ 进行消息传递时&#xff0c;了解如何在代码中创建和发布消息&#xff08;生产者&#xff09;、接收和处理消息&#xff08;消费者&#xff09;&#xff0c;以及配置消息…

Ubuntu20.04安装 docker和docker-compose环境

Docker简介 Docker 是一个开源的应用容器引擎&#xff0c;它使开发者能够打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不会有任何接口&#xff08;…

在 CentOS 7 上安装 LNMP 环境:MySQL 8.0、PHP 8.3 和 ThinkPHP 8.0

在 CentOS 7 上安装 LNMP 环境&#xff0c;并配置 MySQL 8.0、PHP 8.3 以及 ThinkPHP 8.0&#xff0c;能够为你的 web 应用程序提供一个强大的开发和运行环境。下面是详细的安装步骤&#xff1a; --- ## 在 CentOS 7 上安装 LNMP 环境&#xff1a;MySQL 8.0、PHP 8.3 和 Thin…

如何处理段错误

在调试代码时&#xff0c;我们会遇到一些状况百出的问题&#xff0c;尤其是段错误&#xff0c;让人头大&#xff1a; 造成段错误的原因主要是内存泄漏&#xff0c;操作空指针&#xff1b; 在很长的代码中&#xff0c;去查找问题是很困难的&#xff0c;这里可以在Linux的ubunt…

Scrapy入门学习

文章目录 Scrapy一. Scrapy简介二. Scrapy的安装1. 进入项目所在目录2. 安装软件包Scrapy3. 验证是否安装成功 三. Scrapy的基础使用1. 创建项目2. 在tutorial/spiders目录下创建保存爬虫代码的项目文件3.运行爬虫4.利用css选择器Scrapy Shell提取数据例如: Scrapy 一. Scrapy…

6个一键生成原创文案实用方法,亲测好用!

在当下的这个自媒体时代&#xff0c;文案创作的需求日益增长。无论是用于社交媒体、广告宣传还是各种内容创作&#xff0c;优质的原创文案都能起到关键作用。但有时候&#xff0c;我们在创作文案的过程中可能会陷入灵感枯竭的困境。但别担心&#xff0c;这里有6个一键生成原创文…

【系统分析师】-缓存

目录 1、常见分类 2、集群切片方式 3、Redis 3.1、分布式存储方式 3.2、数据分片方式 3.3、数据类型 3.4、持久化方案 3.5、内存淘汰机制 3.6、Redis常见问题 4、布隆过滤器 1、常见分类 1、MemCache Memcache是一个高性能的分布式的内存对象缓存系统&#xff0c;用…

Golang 中的 String、rune 和 byte

解释 String Go语言中&#xff0c;string就是只读的采用utf8编码的字节切片(slice) 因此用len函数获取到的长度并不是字符个数&#xff0c;而是字节个数。 for循环遍历输出的也是各个字节。 rune rune是int32的别名&#xff0c;代表字符的Unicode编码&#xff0c;采用4个字…