蓝桥基础最简题解--递归法巧解分解质因数

问题描述
  求出区间[a,b]中所有整数的质因数分解。
原题出处
输入格式
  输入两个整数a,b。
输出格式
  每行输出一个数的分解,形如k=a1a2a3…(a1<=a2<=a3…,k也是从小到大的)(具体可看样例)
样例输入
3 10
样例输出
3=3
4=2* 2
5=5
6=2* 3
7=7
8=2* 2* 2
9=3* 3
10=2* 5
数据规模和约定
2<=a<=b<=10000

题目分析
官网给了提示,先找出所有质数存起来,再来想办法分解。

  1. 用个数组保存所有2-10000所有质数。
  2. 遍历a到b,因为我们已经有了所有的质数,所以在a到b中任何一个数num都可以在质数数组里面找到一个数x,使得num%x == 0, 比如(3%3 == 0,6%2==0,8%2 == 0),找到了之后,如果这个数num本身就是质数,那直接输出num=x即可。如果是合数,也就是num%x == 0,我想到了递归法,将原问题(num)变成子问题(num/x),这样不就相当一个新的原问题,重复第二步即可。(这个思路果然可行,我看了看网上参考博客一般是套了好几层if和for,while循环,可读性不高)

代码实现

#include<bits/stdc++.h>
using namespace std;
vector<int> v;
void digui(int num){
    if(num==1) return;
    for(int j=0;j<v.size();j++){
        if(num%v[j]==0){
            cout<<"*"<<v[j];
            digui(num/v[j]);
            break;
            //注意此处的break,已经转化成子问题了,原问题已经输出v[j],已经结束了。
        }
    }
}
//找质数存入数组,这个简单
void find_ZhiShu(){
    v.push_back(2);
    for(int i=3;i<10000;i++){
       int flag=1;
       for(int j=2;j<sqrt(i);j++){
           if(i%j==0) {flag=0;}
       }
       if(flag) {v.push_back(i);}
       ff=1;
   }
}
int main(){
   int a,b;
   cin>>a>>b;
   find_ZhiShu();
   for(int i=a;i<=b;i++){
      cout<<i<<"=";
      for(int j=0;j<v.size();j++){
        if(i%v[j]==0){
            cout<<v[j];
            //开始递归子问题
            digui(i/v[j]);
            break;
            //注意此处的break,已经转化成子问题了,原问题已经输出v[j],已经结束了。
        }
     }
     cout<<endl;
   }
    return 0;
}

(ps:现在是2020年3月底倒数第二天,学校还没开学,手头也有挺多任务,挺多东西得学,方向多了容易迷茫,容易浮躁,有点不知出路在哪,还是先沉淀自己吧,做一行爱一行,就像这题目一样,从之前自己不会就题论题用递归方法,只会看别人写的,到现在自己慢慢熟悉从思考到具体实现。)

发布了17 篇原创文章 · 获赞 15 · 访问量 1868

猜你喜欢

转载自blog.csdn.net/weixin_43723614/article/details/105209419