蓝桥杯打卡Day7


文章目录

  • 阶乘的末尾0
  • 整除问题

一、阶乘的末尾0IO链接

**本题思路:**由于本题需要求阶乘的末尾0,由于我们知道2*5=10可以得到一个0,那么我们就可以找出2的数和5的数,但是由于是阶乘,所以5的数量肯定是小于2的数量,因此我们只需要知道5的数量即可,这里只需要算含有5的次幂的数目即可。

cpp 复制代码
#include <bits/stdc++.h>

int main()
{
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);std::cout.tie(nullptr);
  
  int n;
  std::cin>>n;
  
  //这里我们可以知道2和5的乘积能得到0,那么我们可以知道某个数的阶乘中2这个质因子的次数肯定大于5这个质因子出现的次数
  int cnt=0;
  while(n){
    cnt+=n/5;
    n/=5;
  }
  
  std::cout<<cnt<<std::endl;
  return 0;
}

二、整除问题IO链接

**本题思路:**我们可以把 a 给拆分成若干个质因子之积,然后看下 2 ~ n 中包含多少个对应的质因子,就能得出来最多可以整除 a 的多少次方。比如 a 中有质因子p1、p2、p3,2 ~ n 中有对应的质因子、num1、num2 ... 个,那 k 的最大值也就是若干个 num 的最小值。

cpp 复制代码
#include <bits/stdc++.h>

int n,a;
std::vector<std::vector<int>> ans;

void divide(int n)
{
    for(int i=2;i<=n/i;i++){
        if(n%i==0){
            int s=0;
            while(n%i==0){
                s++;
                n/=i;
            } 
            ans.push_back({i,s});
        }
       
    }
    
    if(n>1) ans.push_back({n,1});
    
}

int get_p(int n,int p)
{
    int cnt=0;
    while(n){
        cnt+=n/p;
        n/=p;
    }
    return cnt;
}

int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);std::cout.tie(nullptr);
    
    std::cin>>n>>a;
    
    divide(a);
    int res=INT_MAX;
    for(int i=0;i<ans.size();i++)
        res=std::min(res,get_p(n,ans[i][0])/ans[i][1]);
    std::cout<<res<<std::endl;
    return 0;
}
相关推荐
是小Y啦10 分钟前
leetcode 106.从中序与后续遍历序列构造二叉树
数据结构·算法·leetcode
liuyang-neu20 分钟前
力扣 42.接雨水
java·算法·leetcode
y_dd27 分钟前
【machine learning-12-多元线性回归】
算法·机器学习·线性回归
m0_6312704027 分钟前
标准c语言(一)
c语言·开发语言·算法
万河归海42828 分钟前
C语言——二分法搜索数组中特定元素并返回下标
c语言·开发语言·数据结构·经验分享·笔记·算法·visualstudio
小周的C语言学习笔记32 分钟前
鹏哥C语言36-37---循环/分支语句练习(折半查找算法)
c语言·算法·visual studio
y_dd32 分钟前
【machine learning-七-线性回归之成本函数】
算法·回归·线性回归
小魏冬琅1 小时前
K-means 算法的介绍与应用
算法·机器学习·kmeans
凌肖战2 小时前
力扣上刷题之C语言实现(数组)
c语言·算法·leetcode
秋夫人2 小时前
B+树(B+TREE)索引
数据结构·算法