7-84連續因子解題思路


7-84 連續因子 (20 分)
一個正整數 N 的因子中可能存在若干連續的數字。例如 630 可以分解為 3×5×6×7,其中 567 就是 3 個連續的數字。給定任一正整數 N,要求編寫程序求出最長連續因子的個數,並輸出最小的連續因子序列。

輸入格式:
輸入在一行中給出一個正整數 N(1<N<2的31次方​​ )。

輸出格式:
首先在第 1 行輸出最長連續因子的個數;然后在第 2 行中按 因子1*因子2*……*因子k 的格式輸出最小的連續因子序列,其中因子按遞增順序輸出,1 不算在內。

輸入樣例:
630
輸出樣例:
3
5*6*7
作者 陳越
單位 浙江大學
代碼長度限制 16 KB
時間限制 400 ms
內存限制 64 MB

先賦上AC代碼,考試的時候沒有進行判斷素數的優化,兩個測試點沒過去。以前做過原題但是現在反而不會做了。。。

 

 1 #include<stdio.h>
 2 #include<math.h>
 3 int a[100];
 4 int isprime(int x)
 5 {
 6     if(x < 2)return 0;
 7     for(int i = 2 ;i <= sqrt(x) ; i ++)
 8         if(x % i == 0)return 0;
 9     return 1;
10 }
11 
12 int main(void)
13 {
14     int n,max = 0;
15     scanf("%d",&n);
16     if(isprime(n)) printf("1\n%d\n",n);
17     else {
18         for(int i = 2 ; i <= sqrt(n) ; i ++)
19         {
20             int x = n,cnt = 0;
21             if(n % i == 0)
22             {
23                 for(int j = i ; x % j == 0 ; j ++, cnt ++) x /= j;
24                 if(cnt > max){
25                     max = cnt;
26                     for(int j = 0,k = i ; j < cnt ;j ++,k ++) a[j] = k;
27                 }
28             }
29         }
30         for(int i = 0 ;i < max ; i ++)
31         {
32             if(!i) printf("%d\n%d",max,a[i]);
33             else printf("*%d",a[i]);
34         }
35     }
36     
37     return 0;
38 }

 

 

 

    1.先判斷是不是素數,如果是素數顯然無法分解成連續因子,所以只能輸出他本身。

  2.從2開始枚舉到n的平方根,(原因與判斷素數只枚舉到n的平方根的原因相同),如果i是n的因子,就判斷接下來有幾個連續數字是n的因子。

  3.如果cnt大於max,則更新max和存入的連續因子。

  4.按格式輸出即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM