異なる3乗数の和では表すことのできない最大の数とは何でしょうか?
※例えば、954ならば、2^3 + 1^3 + 4^3 + 3^3 + 9^3 で表せますよね。
しかしどんな(重複しない)数の三乗の和でも書けない数があります。しかもその数には最大(上界)の数が存在します。この問の答えの数以上はすべてそのように表せます。その数を知りたいですよね(数オタはw)
この問いをc言語を使って解いてみます。
// 機能:相異なる立方数の和で表せられない(MAX_N未満の)自然数について、個数と最大値を表示する。
#include<stdio.h>
#define CUBED_LENGTH(26) // 値引いてくれるはずなので26^3=17576以上は検討不要
static int cubed[CUBED_LENGTH]; // 立方数のテーブル(計算時間の短縮用)
const int MAX_N = 17000; // 値引いてくれるはずなので17000以上は検討不要
int f(int, int);
int main(void) {
int n; // 自然数
int answers_max; // 「相異なる立方数の和で表せられない自然数」の最大値
int answers_count; // 「相異なる立方数の和で表せられない自然数」の個数
// あらかじめ立方数を計算しておく
int i;
for (i = 0; i < CUBED_LENGTH; ++i){
cubed[i] = i * i * i;
}
answers_max = 0;
answers_count = 0;
for (n = 0; n < MAX_N; ++n){
if (f(n, CUBED_LENGTH -1) == 0){
// printf("%d ", n); // 相異なる立方数の和で表せられない数を表示する
answers_max = n;
++answers_count;
}
}
printf("相異なる立方数の和で表せられない (%d未満の) 自然数は%d個存在し、その最大値は%dです。 ", MAX_N, answers_count, answers_max);
}
// 非負整数nが相異なる立方数(ただしb^3以下)の和で表せられるときに1を、そうでないときに0を返す関数。
int f(int n, int b){
if (n == 0){
return 1;
} else if (n < 0 || b < 0){
return 0;
} else {
return (f(n - cubed[b], b - 1) || f(n, b -1)); // nを表すときにb^3を 使うor使わない で場合分け
}
}
※ということで、答えは12758でした。