PAT1096--浙大2015機試題--Consecutive Factors (20)

這道題題意就是:

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;
    
}
    


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章