首页 > 编程语言 >算法练习题03:分解质因数

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

时间:2024-08-28 23:24:23浏览次数:13  
标签:练习题 03 include int 质数 isPrime 质因数 dp

【问题描述】 求出区间[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 开始处理直到 b
    for (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;
}

标签:练习题,03,include,int,质数,isPrime,质因数,dp
From: https://blog.csdn.net/2302_78946634/article/details/141613107

相关文章

  • 03. SpringBoot 项目创建
    接下来我们将要完成一个基础的Springboot项目的创建,并且将项目上传到Gitee1.查看官网,选择版本学习任何一门技术,一定要学会从官网了解一手信息,无论是哪个博主的博客都是有时效性的,我们要掌握这样的习惯,看懂看不懂另说,起码知道从哪里去找。spring官网地址:https://sp......
  • 深度学习-pytorch-basic-003
    1.环境配置1.1anconda配置环境condacreate-nDL_pytorchpython=3.11condaacticvateDL_pytorchcondadeactivatecondaenvlistcondaremove-nDL_pytorch--all1.2torchCPU环境配置pipinstalltorch==1.10.0-ihttps://pypi.tuna.tsinghua.edu.cn/simplecond......
  • L1-039 古风排版——C语言
    中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。输入格式:输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。输出格式:按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足......
  • L1-032 Left-pad C语言
    根据新浪微博上的消息,有一位开发者不满NPM(NodePackageManager)的做法,收回了自己的开源代码,其中包括一个叫left-pad的模块,就是这个模块把javascript里面的React/Babel干瘫痪了。这是个什么样的模块?就是在字符串前填充一些东西到一定的长度。例如用*去填充字符串GPLT,使之长度为1......
  • 基于stm32f103c8t6的智能蓝牙遥控小车(有代码)
    智能小车对于初学者而言还是有点挑战性的,由于本人一直以来都在专注于学业绩点,很少有时间来学习stm32,但这学期开始课慢慢的变少,所以又开始学习32顺便做一些小项目,本文将以stm32为核心制作蓝牙遥控小车。之后我也会继续发一些其他的小项目资料和经验总结。所需材料:12v的电源3......
  • 给自己复盘的随想录笔记-链表练习题(在整理ing)
    删除链表的倒数第N个节点双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。思路是这样的,但要注意一些细节。分为如下几步:推荐大家使用虚拟头结点,这样方便处理删除实际头结点的逻辑,定......
  • Dijkstra's algorithm All In One
    Dijkstra'salgorithmAllInOne迪杰斯特拉算法DijkstraDijkstra'salgorithm(/ˈdaɪkstrəz/DYKE-strəz)isanalgorithmforfindingtheshortestpathsbetweennodesinaweightedgraph,whichmayrepresent,forexample,roadnetworks.Dijkstra算法是一种......
  • stm32f103c8t6 程序编译后的 Program Size: Code=xxx RO-data=xxx RW-data=xxx ZI-dat
            之前在裸机跑一些简单的项目内存完全够用,就不会涉及到内存方面的问题。最近在学FreeRTOS时,将大容量的stm32f103rct6代码移植到小容量的stm32f103c8t6上时,就遇到了内存不足的问题,所以才注意到这些东西。    那么在我们编译后看到的这些东西到底......
  • MySQL 2003 - Can’t connect to MySQL server on ' '(10060)
    2003-Can’tconnecttoMySQLserveron''(10060) 一般是以下几个原因造成的:1.网络不通畅2.mysql服务未启动3.防火墙未开放端口4##云服务器的安全组规则未设置  一般是以下几个原因造成的:1.网络不通畅:【mysql-u-p,看看能不能登陆】2.mysql服务未启动:......
  • L1-103 整数的持续性 分数 20
    #include<bits/stdc++.h>usingnamespacestd;#defineintlonglongintfunc(intn){intres=0;while(n>=10){inta=n;vector<int>num;while(a){num.push_back(a%10);......