PAT1096--浙大2015機試題--Consecutive Factors (20)
阿新 • • 發佈:2019-01-14
這道題題意就是:
1,如果是素數,printf("1\n%d",N);因為1不算。
2,,如果不是素數但是沒有連續整數乘積形式的因子,則printf("1\n%d",x),其中x 是N的最小非1的因子。
3,有連續整數乘積形式的因子,則輸出最長的那個,如果最長的有多個,則輸出最小的那個因子。
這道題我一開始看到的時候,很驚慌,2^31的數,這來回得算多少啊!後來想到可以算31個連續整數的積,30個,29個。。找到最大的。。但是這樣處理顯然不方便。再後來,想到可以從2~N迴圈(外迴圈),每個數做31次連乘(內迴圈),第一次就是自己,i,第二次為i*(i+1),第三次為i*(i+1)*(i+2)。。。如果遇到一個積不是N的因子,則退出,繼續下一個外迴圈,否則,根據和max比較,決定是否記錄i,和連乘次數time。
以下是程式碼,請結合上述敘述來看。
#include<stdio.h> #include<math.h> int main(){ int i,j,time,max,start; long long N; max=1; start=N; bool flag=false; scanf("%lld",&N); int n; n=(int)sqrt((double)N)+2; for(i=2;i<=n;i++){ long long res=1; j=i; for(time=1;time<=31;time++){ res=res*((long long)(j)); j++; if(res>N || N%res!=0)break; if(N%res==0){ if(!flag || time>max){ max=time; start=i; flag=true; } } } } if(!flag){ printf("1\n%d",N); return 0; } printf("%d\n",max); for(i=0;i<max;i++){ if(i==0){ printf("%d",start); } else{ printf("*%d",start+i); } } return 0; }