Korean, Edit

C 言語を使用して連続する自然数を求める

上位カテゴリ : 【C言語】 C言語インデックス


a. GitHub



Q. 少なくとも 2 つの連続する自然数を合計して、特定の数を作る方法の数を求めてください。例えば、

15 = 7 + 8 = 4 + 5 + 6 = 1 + 2 + 3 + 4 + 5

方法は全部で4つあります。



補題

N を与えられた数とし、N = a × b、a = 2k の形となり、2 は b を割りません。すると、問題で要求されるウェイの数は、b の約数の数に等しくなります。



証拠。

k 個の自然数に n を加算することを考えます。


描画


描画

この場合、k は 2N の約数であることがわかります。

2N の任意の約数 k について、n を定義すると、次の条件が必要十分です。


描画

2n + k - 1 と k はパリティが異なるため、一方が 2N の奇数の約数であれば、もう一方は偶数の約数になります。 (第二条件)

まず、2n + k - 1 > k という条件を無視して考えてみましょう。

2n + k - 1 は偶数、k は奇数、または 2n + k - 1 は奇数、k は偶数にすることができます。

(2N は偶数であることに注意してください。)

いずれの場合も、ウェイの数が b の約数の数に等しいことは簡単に確認できます。

ただし、2n + k - 1 と k はパリティが異なるため、等しくすることはできません。

また、2n + k - 1 と k は対称なので、2n + k - 1 > k と k > 2n + k - 1 の場合の数は同じになります。

したがって、2n + k - 1 > k を考慮すると、次のようになります。


描画


#include <stdio.h>
#include <stdlib.h>
/* This source applies integer factorization to get the number of divisors of a certain number */

int main(int argc, char *argv[]) {
	long long int n;
	scanf("%lld", &n);
	int Count_Divisor = 1;
	int i = 3;
	int count = 0;
    
	while(1){
		if(n % 2 == 1) break;
		n = n / 2;
	}
    
	while(1){
		if(n == 1){
			Count_Divisor = Count_Divisor * (count + 1);
			break;
		}
		if(n % i == 0){
                        count ++;
                        n = n / i;
                        i -= 2;
		}
		else{
			Count_Divisor = Count_Divisor * (count + 1);
			count = 0;
		}
		i += 2;
	}
	printf("%d", Count_Divisor);
	return 0;
}




入力: 2016.02.17 23:50

results matching ""

    No results matching ""