改善すべき点を教えてください。
趣味で最近Cを始めたのですが、ある本で「0を除く2種類の数字のみで構成された平方数」は、81619の二乗(6661661161)より大きいものはないらしい。
と書かれていたので、確かめたくなり色々調べながらプログラミングしてみました。
なんとか動くようになったのですが、いまいちスピードが遅いように感じるのです。
そこで、こうすればスピードを速くできる、ここが不自然な書き方になっているなど、どこか改善すべき点があれば教えて欲しく質問しました。
あと、char型からint型に数字を変換する時に恐らく不自然な方法でやっているので、正規の方法がありましたらそれも教えていただけると助かります。
よろしくおねがいします。
ここから―――――――――――――――――――――――
#include <stdio.h>
#include <string.h>
int main(void){
double i; //平方根
int m; //整数(for用)
double x; //平方数
char str[100]; //文字列(途中作業用)
int mono[100]; //1桁の数字(途中作業用)
int len; //桁数
int num; //二つ目の数の置場
for( i=1; i<=10000000000; i++){
x=i*i; //二乗
sprintf(str,"%.0f",x); //文字列に平方数を変換
len=strlen(str); //桁数を求める
if(len<=1)
goto PRINT; //平方数が一桁ならPRINTへ
for( m=0; m<len; m++){
mono[m]=str[m]-48; //一桁ずつint型に収納+実際の数に調整。
}
m=(int)i;
if( m%2000000==0)
printf("i=%32.0f:ok - ",i); //進行状況
for( m=0; m<len; m++)
if( mono[m]==0)
goto OUT; //0が含まれていたらOUTへ
for( m=1; m<len; m++){
if( mono[m]==mono[0])
goto WHENSAME; //mono[0]と同じ数字だったらWHENSAMEへ
num=m; //違う数字の一回目の登場場所をnumに代入
break; // →脱出
WHENSAME: //ラベル WHENSAME
}
for( m=num+1; m<len; m++){
if( mono[m]==mono[0]);
else if( mono[m]==mono[num]);
else
goto OUT;
}
PRINT: //ラベル PRINT
printf("%5.0f => %26.0f\n", i, x);
OUT: //ラベル OUT
}
return 0;
}
補足
確かに駐車場は私も明らかに高いと思います! 一般料金よりも安くしてもいいぐらいですよね?? 毎回、入場料無料というわけには行かないでしょうが、月に一回とか無料の日を作って頂けると、みんなこぞってその日に行くかもしれませんね!! 飲食物は問題アリですね!! マズイのに仕方なく食べてる感じがします。 もっと専門飲食店と共同して店を出したり、女性ファンが集まりやすいようにオシャレなカフェとかを設置するべきなのでしょうか?? わざわざご返答ありがとうございました。 生の意見が聞けてとてもよかったです。