7-84 連續因子 (20 分) 一個正整數 N 的因子中可能存在若干連續的數字。例如 630 可以分解為 3×5×6×7,其中 5、6、7 就是 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.按格式輸出即可。