dポイントプレゼントキャンペーン実施中!

整数の3乗の関係を求めるプログラムです。パソコンのOSはwin7、32ビット。環境はVisual Studio1998のようです。いずれ、かなり古いバージョンです。プログラムは以下のように単純ですが、計算する数の桁がとても大きくなります。
かなり以前に作ったプログラム(スペックのかなり落ちるバソコンで作った)では、
1^3+6^3+8^3=(0^3+1^3+2^3)^3=9^3、
4^3+24^3+32^3=(1^3+2^3+3^3)^3=36^3、
11^3+66^3+88^3=(2^3+3^3+4^3)^3=99^3、
24^3+144^3+192^3=(3^3+4^3+5^3)^3=216^3 
という4つは作り出すことができました。とりあえず10組くらいは探したいと思っています。前回は、マイクロソフトのCもしくはC++だったと思います。今回も、(1^3+6^3+8^3)=(0^3+1^3+2^3)^3=9^3、一組だけは出てくるのですが、二組目以降は出てきません。beki、sigmaの定義かと思って、long int を unsigned long long int にすると、エラーではじかれてしまいます。i、j、k の最大値は、アバウトに決めています。kを10000にすると、明らかなエラーを出します。 よろしくお願いします。(ちなみに、Visual Studio の最新版は、使い方がよくわかりません。)

int main()
{
int i,j,k;
long int beki,sigma;

FILE *file;

file = fopen("bekijyo_3.txt","w");

for (i=1 ; i<300 ; i++ )
{
for (j=i+1 ; j<500 ; j++)
{
for (k=j+1 ; k<2000 ; k++)
{
beki = pow(i,3) + pow(j,3) + pow(k,3);
sigma = pow((i-1),3) + pow(i,3) + pow((i+1),3);
if(beki == pow(sigma,3))
{
printf("ファイルに書き込みます。\n ");
printf("(%d ,%d ,%d)=(%d ,%d ,%d)=(%d) \n",i,j,k,(i-1),i,(i+1),sigma);
fprintf(file, "(%d ,%d ,%d)=(%d ,%d ,%d)=(%d) \n",i,j,k,(i-1),i,(i+1),sigma);
break;
}
}
}
}
  fclose(file);
printf("処理が終了したよ~ん!");
return 0;
}

質問者からの補足コメント

  • うーん・・・

    補足。計算が無用のために、ファイル書き込みでは、3乗を省いています。ああ、ここに書いておくべきだったのでしたね。
    このプログラムは使いまわしをしているために、下記のインクルードがあります。
    #include <stdio.h>
    #include <math.h>
    #include <stdlib.h>
    #include <iostream>
    #include <conio.h>
    本文とこれ以外には、1行もありません。よろしくお願いします。

      補足日時:2021/01/18 01:26
  • HAPPY

    tatsumaru77さん、Tacosanさん、本当にありがとうございました。今回は、 tatsumaru77さんにベストアンサー賞を差し上げたいと思います。

    No.4の回答に寄せられた補足コメントです。 補足日時:2021/01/18 18:33

A 回答 (4件)

以下のようにしてください。


#include <stdio.h>
#include <math.h>
#include <stdlib.h>
unsigned long pow3(unsigned long a,int e)
{
return (a*a*a);
}
int main()
{
int i, j, k,z;
int ctr = 0;
unsigned long int beki, sigma,temp;

FILE *file;

file = fopen("bekijyo_3.txt", "w");

for (i = 1; i < 300; i++) {
for (j = i + 1; j < 500; j++) {
for (k = j + 1; k < 2000; k++) {
beki = pow3(i, 3) + pow3(j, 3) + pow3(k, 3);
for (z = 1;z < 2000;z++){
sigma = pow3((z-1), 3) + pow3(z, 3) + pow3((z + 1), 3);
temp = pow3(sigma, 3);
if (beki == temp) {
if (ctr == 0){
printf("ファイルに書き込みます。\n");
}
ctr++;
printf("(%d ,%d ,%d)=(%d ,%d ,%d)=(%d) \n", i, j, k,
(z - 1), z, (z + 1), sigma);
fprintf(file, "(%d ,%d ,%d)=(%d ,%d ,%d)=(%d) \n", i,j, k,
(z - 1), z, (z + 1), sigma);
}
if (beki < temp) break;
}
}
}
}
fclose(file);
printf("処理が終了したよ~ん!");
return 0;
}
実行結果
ファイルに書き込みます。
(1 ,6 ,8)=(0 ,1 ,2)=(9)
(4 ,24 ,32)=(1 ,2 ,3)=(36)
(11 ,66 ,88)=(2 ,3 ,4)=(99)
(18 ,24 ,30)=(1 ,2 ,3)=(36)
(24 ,144 ,192)=(3 ,4 ,5)=(216)
(26 ,102 ,208)=(3 ,4 ,5)=(216)
(30 ,164 ,178)=(3 ,4 ,5)=(216)
(45 ,270 ,360)=(4 ,5 ,6)=(405)
(48 ,76 ,212)=(3 ,4 ,5)=(216)
(76 ,456 ,608)=(5 ,6 ,7)=(684)
(102 ,117 ,195)=(3 ,4 ,5)=(216)
(108 ,144 ,180)=(3 ,4 ,5)=(216)
(108 ,360 ,648)=(5 ,6 ,7)=(684)
(125 ,240 ,370)=(4 ,5 ,6)=(405)
(125 ,387 ,1576)=(7 ,8 ,9)=(1584)
(216 ,320 ,652)=(5 ,6 ,7)=(684)
(216 ,368 ,1576)=(7 ,8 ,9)=(1584)
(279 ,297 ,648)=(5 ,6 ,7)=(684)
処理が終了したよ~ん!

もし、これより多くの数値をのぞむなら、あなたのコンパイラでは無理かと思います。8バイト整数型(long long int)を扱うことのできるコンパイラ
が必要になります。
Mingw32ならそれが可能です。
もし、更に多くを望むのであればMingw32をインストールしてください。
下記が参考になるかと。
https://gist.github.com/Hamayama/362f2eb14ae26d9 …
この回答への補足あり
    • good
    • 1
この回答へのお礼

tatsumaru77 さん、ありがとうございました。助かりました。プログラムそのもので、実は、他の項でも使おうと考えていたので、バッチグー!! です。

お礼日時:2021/01/18 18:28

ひょっとすると余計なことかもしれんが.



1^3+6^3+8^3=(0^3+1^3+2^3)^3=9^3、
4^3+24^3+32^3=(1^3+2^3+3^3)^3=36^3、
11^3+66^3+88^3=(2^3+3^3+4^3)^3=99^3、
24^3+144^3+192^3=(3^3+4^3+5^3)^3=216^3
って, 全部本質的に同じじゃね?
    • good
    • 2
この回答へのお礼

確かに、今まで気づきませんでした。おっしゃる通り、2行目は1行目の4^3倍、3行目は1行目の11^3倍、4行目は1行目の24^3倍ですね。これは、大きな発見です。ありがとうございました。1、4、11、24、‥‥の数列に規則を見出せば、それでよいかもしれませんが、ちょっとデータが少ないですね。

ただ、もしプログラムが間違っていなければ、これら4行とも結果に出てくるはずですよね。ところが1つしか出てこないのでこうやって、広くお願いしたのです。

お礼日時:2021/01/18 17:17

あなたの求めていることをやっていないという意味では「バグ」なんだろうけど....



例えばこのプログラムでそれぞれの変数がどういう値のときに
4^3+24^3+32^3=(1^3+2^3+3^3)^3=36^3
(に対応するもの) が出力されるのか, 説明できますか?
    • good
    • 0
この回答へのお礼

ご連絡、ありがとうございます。

(i,j,k)=(4,24,32)というセットのときです。i が1ずつふえていくのは、確認しました。そのiが1つ増える間に、iもkも増えているはずです。

改めて確認したところ、(i,j,k)=(1,69,1290)でbeki=2147017510ですが、(i,j,k)=(1,69,1291)でbeki=-2142953615 とマイナスに変わっていました。beki は long int なので、2147483647 の上限を超えてしまったようです。unsigned long long int が現環境で使えないものか、何か代替案がないものか、教えてください。jを100、kを500に変えてみましたが、桁数が減ったものの、新たな解は引き出せませんでした。

お礼日時:2021/01/18 17:15

本当にこれだけのプログラム?



ほかには 1行もない?
    • good
    • 0
この回答へのお礼

うーん・・・

早速の連絡、ありがとうございます。

プログラムは使いまわしのため、冒頭に下記のようなインクルードがあります。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <iostream>
#include <conio.h>

ほかには、1行もありません。

よろしくお願いします。

お礼日時:2021/01/18 01:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!