hdu1215七夕節求因子和

hdu 七夕節

題目鏈接

題目描述

有T個樣例,每個樣例給定一個N,將所給N的所有因子相加求和。N的因子就是所有比N小又能被N整除的所有正整數。如12的因子有1,2,3,4,6。(T(1<=T<=500000),N(1<=N<=500000))

解題思路

這個題思路很簡單,可能你首先想到了不就是從1到n進行遍歷,找他的因子,再用一個變量計算因子和不就可以了麼。但是我們觀察到,樣例個數T和給定的N都可能會很大,假如直接遍歷1到N,那麼時間複雜度就會很大,會導致超時。所以我們就想,怎麼可以簡化這個循環遍歷的過程呢。

我們就可以想到,這些數字是有相關性的,比如當你遍歷發現2是10的因子,那麼10/2=5,5也是10的因子,這樣我們就簡化了循環,只需要遍歷到 i * i <= N的情況。也就是如下代碼:

int sum = 0;
for(int i = 1; i*i<=n; i++) {
	if(n%i==0) {
		sum += (i+n/i);
	}
}

但是有幾個小細節需要注意,比如因爲題目中說,因子要小於N,那麼在變量 i 循環到 1 的時候,就不能把N/1=N加進去,還有當i * i剛好爲N時,我們只需要加一遍 i 就可以了,而不需要把 i 和 N/i 都加進去。所以要判斷一下這兩種特殊情況。

具體代碼

對於我上面提到的兩種特殊情況,也可以用其他的方法進行處理。

#include<cstdio>
#include<algorithm>
using namespace std;

int main() {
	int t;
	scanf("%d",&t);
	while(t--) {
		int n;
		scanf("%d",&n); 
		int sum = 1; //初始化sum = 1,相當於把 i = 1的情況已經處理了。
		for(int i = 2; i*i<=n; i++){ //直接從2開始循環
			if(i*i == n) { //特殊判斷 i*i=n的情況
				sum += i;
			}
			else if(n%i==0) {
				sum += (i+n/i);
			}
		}
		if(n==1) printf("0\n");
		else {
			printf("%d\n",sum);
		}
	}
} 

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