C言語関係掲示板

過去ログ

No835 小数第2位の2数の掛け算で160.8になる組み合わせ

[戻る] [ホームページ]
No.10589

条件分岐
投稿者---さぞう(2003/11/17 16:10:48)


初めて書き込ませていただきます
簡単だと思ったのですが大苦戦をしています
単に少数第2位の2数の掛け算で160.8になる
組み合わせを探しております
その組あわせをテキストファイルに出力するというものです
以下のように考えたのですがどうしてもうまくいきません
なにがいけないのでしょうか?
ご教授宜しくお願い致します
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
double x,y,z;
FILE *Tout;
z=0;
if((Tout=fopen("seizu.txt","w")) == NULL){
printf("出力ファイル1がオープンできません\n");
getchar();
exit(1);
}
for(x=0.00;x<=160.80;x=x+0.01){
for(y=0.00;y<=160.80;y=y+0.01){
z=x*y;
if(z==160.80){
   fprintf(Tout,"%f,%f,%f\n",x,y,z);
}
if(z>160.80){
break;
}
}
}
return 0;
}


No.10590

Re:条件分岐
投稿者---JUN2(2003/11/17 16:53:57)


どううまくいかないのでしょうか?
ちなみに、fclose()は呼んでる?

No.10591

Re:条件分岐
投稿者---すがりん(2003/11/17 17:19:17)


浮動小数点数同士を単純に==で比較することはできません。
内部表現が違うかもしれないからですが、こういうときは、
比較の際に2数の差をとって、一定の値以下になれば等しいことにしてしまえばいいのです。

計算は整数でする、という手もあります。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int x,y,z;
    FILE *Tout;

    if((Tout=fopen("seizu.txt","w")) == NULL){
	printf("出力ファイル1がオープンできません\n");
	getchar();
	exit(1);
    }
    for(x=0;x<=16080;x++){
	for(y=0;y<=16080;y++){
	    z=x*y;
	    if(z==1608000){
		fprintf(Tout,"%f,%f,%f\n",x*0.01,y*0.01,z*0.0001);
		break;
	    }
	}
    }
    return 0;
}


No.10592

Re:条件分岐
投稿者---すがりん(2003/11/17 18:26:10)


breakは移動させない方が圧倒的に速いですね。
ちょっと勘違いしてました。

No.10631

ありがとうございます
投稿者---さぞう(2003/11/18 09:51:11)


確かにfloseも忘れていましたし
整数比較、差比較をすればちゃんと160.8を
認識してくれました
結果はできました
ありがとうございました