階乘(最大公約數與質數判斷)

題目鏈接:https://ac.nowcoder.com/acm/contest/4784/B

題目描述

在這裏插入圖片描述
在這裏插入圖片描述

解析

一開始真的就是去求階乘,發現即使n很小,n!也可以很大。然後我以爲把n!控制在long long int數據內就可以了,發現這樣也是不行的。那應該怎麼辦呢?
其實對於兩個數a,b,如果a是b的倍數,那麼a質因子中一定包含b的所有質因子。所以這道題就可以將p約去與1~n這n個整數所有的質因子,直到p被約爲1或者成爲一個質數(但是成爲質數的情況也要分類討論)。

#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b) {
	return b==0?a:gcd(b,a%b);
}
bool isPrime(int n) {
	if(n==1) return false;
	for(int i=2; i*i<=n; i++) {
		if(n%i==0) return false;
	}
	return true;
}
int main() {
	int t,p;
	cin>>t;
	while(t--) {
		cin>>p;
		int i,flag=0;
		if(isPrime(p)) printf("%d\n",p);
		else {
			for(i=2; p>1; i++) {
				int gcdval=gcd(p,i);
				p/=gcdval;	//約去最大公約數
				if(i<p&&isPrime(p)) {	//注意即使當p成爲質數但是i>p還是不能break
					flag=1;
					break;
				}
			}
			printf("%d\n",flag?p:i-1);
		}

	}
	return 0;
}

這題在比賽的時候就掉了if(i<p&&isPrime(p))中的i<p這個條件…

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