华为机试每日一练--第七题: 进制转换

简介: 华为机试每日一练--第七题: 进制转换

练习题入口

问题描述

功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 )

数据范围: 1 \le n \le 2 \times 10^{9} + 14 \1≤n≤2×109+14

输入描述:

输入一个整数

输出描述:

按照从小到大的顺序输出它的所有质数的因子,以空格隔开。

7482557e0a17aa188b45d2d4444d59b1_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_18,color_FFFFFF,t_70,g_se,x_16.png

解题分析

       首先科普一下什么是质数的因子

质因子(或质因数)在数论里是指能整除给定正整数的质数。根据算术基本定理,不考虑排列顺序的情况下,每个正整数都能够以唯一的方式表示成它的质因数的乘积。两个没有共同质因子的正整数称为互质。因为1没有质因子,1与任何正整数(包括1本身)都是互质。只有一个质因子的正整数为质数。


将一个正整数表示成质因数乘积的过程和得到的表示结果叫做质因数分解。显示质因数分解结果时,如果其中某个质因数出现了不止一次,可以用幂次的形式表示。例如360的质因数分解是:

57bbef9eb20af5d9718f8f32a35a88cb_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png

其中的质因数2、3、5在360的质因数分解中的幂次分别是3,2,1。

简而言之就是求一个数的因数,而这个因数必须是质数。


下面该分析解题思路了,我们知道n是由它的所有质因数相乘所得,那如何判断n的质因数呢?


质因数都是n的因子,所以当n取模等于0时,这个数就是n的质因数!


那如何找到所有的质因数呢?循环!假如质因数为a,当每次循环找到a后,我们就把n/a赋值为n(为了避免重复查找a),一直循环到找不到质因数为止。


       这样大致流程就确定了,但是我们也要减少循环次数,我们不能真的循环a-b次,那样耗费的时间就太长了。


当b>sqrt(a)+1时,就说明a中已经没有质因数了,这时循环就能结束了!


for (b=2; b < a; b++)
  {
  if (b > sqrt(a) + 1)
  {
    b = a;
  }
  if (a % b == 0)
  {
    printf("%d ", b);
    a = a / b;
  }
  }

上述伪代码其实存在漏洞,大家能发现吗?


我们看下图就能看到,第第三次循环找到了“4”,而4确不是120的质因数,所以上述代码存在问题

cc3c8f21db0e6b30f3f5f1b6c351db82_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png

4为2*2,就说明a中的质因数不唯一,有重复的,那我们可不可以在一次for循环中在添加一个while循环,一直挑选出所有与b相同的质因数。

for (b=2; b < a; b++)
  {
  if (b > sqrt(a) + 1)
  {
    b = a;
  }
  while (a % b == 0)
  {
    printf("%d ", b);
    a = a / b;
  }
  }

这样我们就能顺利找出重复的质因数了


代码实现

#include<stdio.h>
#include<math.h>
int main()
{
    int a, b, i = 0;
    scanf("%d", &a);
    for (b = 2; b <= a; b++)
    {
        if (b > sqrt(a) + 1) //最小质数因子必小于输入数字的平方根
        {
            b = a;
        }
        while (a % b == 0)
        {
            printf("%d ", b);
            a = a / b;
        }
    }
    return 0;
}

7085e24accead436ff770abb0fecbf97_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png

相关文章
|
数据采集 监控 算法
原子钟的基本介绍
【10月更文挑战第7天】本文介绍原子钟是一种利用原子跃迁频率作为基准的高精度计时设备,广泛应用于通信、导航、科学研究等领域。铯原子钟是最精确的计时设备之一,基于铯133原子的超精细跃迁,频率为9,192,631,770 Hz。其关键部件包括铯束源、微波腔、磁态选择器、检测系统和反馈回路。原子钟在GPS、电信、金融市场等应用中至关重要,软件开发需考虑高精度时间同步、数据处理、硬件接口和性能监控。
2665 62
|
Oracle 关系型数据库 Java
实时计算 Flink版操作报错之报错:Caused by: oracle.jdbc.OracleDatabaseException: ORA-01291如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
Shell
esp32入门笔记
这篇文章是关于ESP32 S3入门的笔记,包括了安装编译工具、下载ESP-IDF框架、设置工具和环境变量、以及烧录固件的步骤说明。
803 5
|
人工智能 算法 API
谷歌AI Gemini 2.5 pro国内使用教程, 2025最新版!
在 2025 年 2 月初,谷歌又推出了 Gemini 2.0 Pro 系列模型,进一步巩固了其在 AI 领域的领先地位,同时也正式向外界宣告,我们进入了 Gemini 2.0 时代
6229 5
|
人工智能 开发框架 小程序
【一步步开发AI运动APP】二、跨平台APP AI运动识别方案介绍
本系列博文旨在帮助开发者从【AI运动小程序】迈向性能更优的【AI运动APP】开发。通过「云智AI运动识别」uni-app版插件,提供本地原生极速识别、精准姿态检测及运动计时计数功能,支持健身系统、线上赛事、学生体测、康复锻炼等多场景应用。插件无需云端依赖,一次付费永久使用,成本低且扩展性强。同时兼容uni-app与uni-app x框架,适合不同技术背景的开发者快速上手,助力抢占AI辅助运动市场。下篇将介绍插件引入,敬请期待!
|
安全 Linux 网络安全
Linux 开放的端口太多了?教你一招找出所有开放的端口,然后直接干掉!
在 Linux 系统中,端口管理至关重要。本文介绍了如何使用 `netstat`、`lsof` 和 `nmap` 等工具查找开放端口,并通过关闭相关服务、修改防火墙规则或禁用网络接口来关闭这些端口,以提高系统安全性。注意不要随意关闭重要端口,谨慎操作并备份数据。
1204 3
|
云安全 存储 缓存
三大能力|构建云上全流量威胁检测新视角
三大能力|构建云上全流量威胁检测新视角
搭建一个普通的网站需要多少费用?
用户如果需要搭建一个普通的网站大概需要多少钱?网站搭建费用一般分为域名、服务器/虚拟主机、网站制作、设计和维护费用。费用在1000-3000是比较常见的,建站主要以PageAdmin CMS系统为主。
3092 2
|
资源调度 API 计算机视觉
【OpenCV】—非线性滤波:中值滤波、双边滤波
【OpenCV】—非线性滤波:中值滤波、双边滤波
691 3
|
机器学习/深度学习 数据可视化 数据挖掘
构建可复用的 Jupyter 模板和插件:提高工作效率的最佳实践
【8月更文第29天】Jupyter Notebook 是一个广泛使用的交互式计算环境,支持多种编程语言。它不仅用于数据分析、可视化和机器学习项目,也是教学和科研的理想工具。然而,随着使用频率的增加,重复编写相似的代码和设置变得既耗时又低效。通过创建可复用的 Jupyter 模板和插件,我们可以显著提高工作效率。
761 1

热门文章

最新文章