【藍橋杯】BASIC-16 分解質因數

  • 2019 年 11 月 13 日
  • 筆記

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/weixin_42449444/article/details/102984695

題目描述:

求出區間[a,b]中所有整數的質因數分解。

【提示】先篩出所有素數,然後再分解。

輸入描述:

輸入兩個整數a,b(2<=a<=b<=10000)。

輸出描述:

每行輸出一個數的分解,形如k=a1*a2*a3…(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

解題思路:

開局一個TLE,水題直接運行超時把我勸退。後來發現我超時的原因是判斷素數的那段代碼導致的。我一開始寫的isPrime函數判斷素數的時候不夠快。

AC代碼:

#include <bits/stdc++.h>  using namespace std;  #define Up(i,a,b) for(int i = a; i <= b; i++)    //萬惡的TLE 超時了  // bool isPrime(int n)  // {  //     if(n <= 1) return false;  //     Up(i,2,sqrt(n))  //     {  //         if(n%i == 0) return false;  //     }  //     return true;  // }    int isPrime(int n)  //很神奇,以後我不要用上面的方法來判斷素數啦  {      if(n <= 1) return 0;      else if(n==2 || n==3)      {          return 1;      }      else      {          for(int i = 2; i*i < n; i++)          {              if(n%i == 0) return 0;          }          return 1;      }  }    int main()  {      ios::sync_with_stdio(false);      cin.tie(0),cout.tie(0);      int a,b;      cin >> a >> b;      Up(i,a,b)      {          int _ = i;          cout << _ << "=";          bool virgin = true;          while(_ != 1)          {              Up(j,2,_)              {                  if(isPrime(j) && _%j==0)                  {                      _ /= j;                      cout << (virgin?"":"*") << j;                      virgin = false;                      break;                  }              }          }          cout << endl;      }      return 0;  }