前提・実現したいこと
C言語において黄金比
φ = (1 + √5) / 2
の値を用いて、標準入力から a + b φ (a, b は整数) の形の 2 つの数に対し,1つめの方が大きければ 1 を,2 つめの方が大きければ -1 を,どちらも等しければ 0 を標準出力に出力するプログラムを作成するにおいて、
入力a ,bの整数をlong long int型で絶対値は10^10以下で考えて良いという問題なのですが、
比の値が小数点を含んでおり、整数部と少数部に切り離し、例1のような負の少数部の影響で結果に影響が出ないように小さい負の方の少数を両方に絶対値で足してあげ、繰り上がった分は整数部に足してあげるという方法で数値比較を行ったのですが、**大きい入力を与えた時オーバーフローしているのか、整数部が正しく表示されておらずと正しい結果が出力されません。**改善のご教示願います。
###例1
入力
5 -3
-3 2
としたとき
s_int = 1, t_int = 0, s_dec = -0.854102, t_dec = 0.236068
となり大きい方の整数部から比較し、判定していくと
s > t
となり1が出力されますが
実際は小数部も足し合わせると
s<tでー1が正しい出力となるので
s_decの絶対値をs_dec, t_decに加算し繰り上がった場合も整数部に加算してあげた。
###入出力例
入力例1 出力
5 -3 -1
-3 2
入力例2 出力
3 -1 1
-2 2
入力例3 出力
3 -2 0
3 -2
入力例4 出力
1392 -1209 1
-2789 1375
入力例5 出力
51630685 -25993565 1
-113949456 76340590
入力例6 出力
495915634 -498021163 -1
-1340396269 636882007
入力例4くらいの桁まではうまくいくのですが入力例5くらいの桁になってくるとと
s_int=9572214 t_int=9572213 s_dec = 0.000000 t_dec = 1.000000
となり整数部がうまくいってない上に繰り上がりもできていない、、、
該当のソースコード
C
1#include<stdio.h> 2#include<math.h> 3 4struct golden { 5 long long int a; 6 long long int b; 7}; 8 9 10int compare(struct golden x, struct golden y) { 11 long long int s_int, t_int; //整数部 12 double s_dec, t_dec, q; //少数部 13 14 q = ( 1 + sqrt(5))/2; //黄金比 15 16//整数部と少数部の分離 17 s_int = x.a + (int)(x.b * q);//少数部は切り捨てだからこれで良いと思う 18 t_int = y.a + (int)(y.b * q); 19 s_dec = x.b * q - (int)(x.b * q); 20 t_dec = y.b * q - (int)(y.b * q); 21 22//デバック用 23printf("少数部変更前s_int=%lld t_int=%lld s_dec=%f t_dec=%f\n",s_int ,t_int,s_dec,t_dec); 24 25 //少数部がマイナスだと結果に支障をきたすためその分両方に足して正にする 26 if(s_dec < t_dec) {//2つの少数部のうち小さい方を両方に足せば良い 27 28 if(s_dec < 0.) { //小さい方で、かつ足すのは影響が出る負の場合 29 t_dec += fabs(s_dec); 30 s_dec += fabs(s_dec); 31 32 if(t_dec >= 1.) {//負の小数点の絶対値を足したことによって(少数部>1.)となった時、繰り上げ 33 t_int++; 34 t_dec -= 1; 35 } 36 } 37 } else if(t_dec < 0.) { //同様 38 s_dec += fabs(t_dec); 39 t_dec += fabs(t_dec); 40 41 if(s_dec >= 1.) {//繰り上げ 42 s_int++; 43 s_dec -= 1; 44 } 45 } 46 47//デバック用 48 printf("少数部変更かつ繰り上げ後s_int=%lld t_int=%lld s_dec=%f t_dec=%f\n",s_int,t_int,s_dec,t_dec); 49 50 if(s_int == t_int) { //整数部が等しかったら少数部で比較 51 if(s_dec == t_dec){ 52 return 0; 53 } else if(s_dec > t_dec) { 54 return 1; 55 } else { 56 return -1; 57 } 58 } 59 60 if(s_int > t_int){ return 1;} //整数部が等しくなかったら 61 else { return -1; } 62} 63 64int main(void) { 65 struct golden x, y; 66 int n; 67 scanf("%lld %lld",&x.a, &x.b); 68 scanf("%lld %lld",&y.a, &y.b); 69 n = compare(x, y); 70 printf("%d\n",n); 71 return 0; 72} 73 74
補足情報(FW/ツールのバージョンなど)
Unix gccコンパイラ

回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/20 10:51