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

devtools/2024/10/18 23:04:26/

【问题描述】 求出区间[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/devtools/102807.html

相关文章

【STM32】IWDG独立看门狗与WWDG窗口看门狗

本篇博客重点在于标准库函数的理解与使用&#xff0c;搭建一个框架便于快速开发 目录 WDG简介 IWDG IWDG特性 独立看门狗时钟 键寄存器 超时时间 IWDG代码 WWDG WWDG特性 窗口看门狗时钟 超时时间 WWDG时序 WWDG代码 IWDG和WWDG对比 WDG简介 WDG&#xff08;…

布偶猫应该怎么喂?希喂、交响乐金罐、尾巴生活彩虹泥适合布偶猫吗?

我开了家布偶猫咖&#xff0c;这些长相甜美可爱的小家伙超会撒娇卖萌&#xff0c;把客人迷的团团转。布偶猫又叫仙布拉多尔猫&#xff0c;它是现存体型最大、体重最重的猫之一&#xff0c;它们体型大&#xff0c;食量也大&#xff0c;但肠胃却特别弱&#xff0c;所以一定要特别…

《深入剖析 Spring Boot 中的循环依赖问题及解决方案》

spring循环依赖 在 Spring Boot 应用开发中&#xff0c;循环依赖是一个需要深入理解和妥善处理的关键问题。本文将带你全面探索 Spring Boot 中的循环依赖现象、Bean 的创建过程以及循环依赖的检测机制和解决方案。 一、循环依赖的困境 循环依赖指的是两个或多个 bean 相互依…

告别PDF格式困扰,2024年PDF转换器推荐

PDF现在已经逐渐成为了文件传输的主流格式了&#xff0c;它有保存文件页面版式的优点&#xff0c;但是这个格式编辑对大部分人来说还是不那么方便&#xff0c;日常我们还是习惯将它们转换成我们常见的 文本格式来操作。今天我分享一下可以实现PDF格式转换的pdf转换器有哪些吧。…

Lodash——JavaScript中的工具库

Lodash 是一个实用的 JavaScript 工具库&#xff0c;它提供了许多方便的函数&#xff0c;用于处理数组、对象、字符串等常见的数据结构。以下是关于 Lodash 的一些主要特点和用途&#xff1a; 一、函数式编程风格 简洁的代码&#xff1a;Lodash 的函数通常采用简洁的链式调用…

三种tcp并发服务器实现程序

都需先进行tcp连接 1、多进程并发 2、多线程并发 3、IO多路复用并发 &#xff08;1&#xff09;select &#xff08;2&#xff09;epoll 注&#xff1a;select与epoll文件描述符限制的区别是指同时涌入的客户端数量&#xff0c;select最大只能有1024个&#xff0c;epoll可以超…

Python算法工程师面试整理-线性代数

1. 向量和矩阵 ● 向量:表示一个n维空间中的点,通常以列向量或行向量表示。 ○ 向量运算:加法、标量乘法、点积(内积)、叉积(外积)。 ● 矩阵:由行和列组成的二维数组。 ○ 矩

Excel如何快速的定位到某一列和快速知道当前列

Excel如何快速的定位到某一列和快速知道当前列 背景快速找到某一列---660列快速知道当前列 背景 由于某一次做excel数据太大需要快速知道某一列是多少列和快速定位到某一列对此写了这个 快速找到某一列—660列 SUBSTITUTE(ADDRESS(1, 660, 4), "1", ""…