異なる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でした。