問題
消費税は売価に比例した定率を課す税である.
私たちの店では,以下のルールによって税込価格を計算する.
消費税率が x% のとき, 税抜価格が p 円である商品の税込価格は, p (100+x) / 100 円を小数点以下切り捨てたものである.
複数の商品についてまとめて支払う際の税込合計価格は,個々の商品の税込価格の合計額とする.
消費税率はしょっちゅう変更される. 私たちの店の会計係は, 「税込合計価格が同じだった2商品の組が,消費税率の変更後に異なる税込合計価格になりうる」 ことに気付いた. たとえば, 消費税率が 5% から 8% に上がると,引上げ前に税込合計価格 105 円であった2商品の税込合計金額は, 下表に示すとおり 107 円,108 円,109 円のいずれかとなる.
2商品の税抜価格 消費税率 5% 時の税込価格 消費税率 8% 時の税込価格
20, 80 21 + 84 = 105 21 + 86 = 107
2, 99 2 + 103 = 105 2 + 106 = 108
13, 88 13 + 92 = 105 14 + 95 = 109
会計係が消費税率変更の影響を調査している. 2つの商品の消費税率変更前の税込合計価格を元に, 新消費税率での税込合計価格が最大いくらになるかを計算するプログラムを作って欲しい.
【入力】
複数のデータセットからなる. 各データセットは1行からなり, その行は空白で区切られた3つの整数 x, y, s からなる. x は変更前の消費税率(パーセント), y は変更後の消費税率(パーセント), s は消費税率変更前の 2 商品の税込合計価格である. これらの整数は,0 < x < 100, 0 < y < 100, 10 < s < 1000,x ≠ y を満たす. 商品の税抜価格として 1 円から s -1 円のすべてを考慮に入れよ.
入力の終わりは,空白で区切られた3つのゼロからなる行によって示される.
【出力】
各データセットについて, 消費税率が y% になったときにとりうる税込合計価格の最大値を1行で出力せよ.
(最後の行の末尾にも改行を出力すること。)
【例】
入力例
5 8 105
8 5 105
1 2 24
99 98 24
12 13 26
1 22 23
1 13 201
13 16 112
2 24 50
1 82 61
1 84 125
1 99 999
99 1 999
98 99 999
1 99 11
99 1 12
0 0 0
出力例
109
103
24
24
26
27
225
116
62
111
230
1972
508
1004
20
7
質問内容(解決:下の追記に新たな問題点を書かせていただきました)
前の税率で税込み価格から税抜き価格になおすときに,その税込み価格になる最大の税抜き価格の計算がうまくいきません.どのように工夫すればうまくいくのか教えていただきたいです.よろしくお願いします.
旧コード
C
1#include<stdio.h> 2#include<math.h> 3int main(void){ 4 int a[100000],b[100000],c[100000],ans; 5 int cal,ori; 6 double prerate,postrate; 7 int i=0; 8 while(1){ 9 scanf("%d %d %d",&a[i],&b[i],&c[i]); 10 ans=0; 11 if(a[i]==0&&b[i]==0&&c[i]==0) break; 12 int j; 13 prerate=1+(double)a[i]/100; 14 postrate=1+(double)b[i]/100; 15 printf("%f ",prerate); 16 ori=c[i]/prerate; 17 int k=1; 18 while(1){ 19 printf("%d ",(int)((ori+k)*prerate)); 20 if((int)((ori+k)*prerate)>c[i]) break; 21 else ori+=k; 22 } 23 printf("(%d) ",ori); 24 for(j=1;j<ori;j++){ 25 if(j==1) ans=j*(double)(1+b[i]/100)+(ori-j)*postrate; 26 else if((cal=j*(double)(1+b[i]/100)+(ori-j)*postrate)<ans) break; 27 else if((cal=j*(double)(1+b[i]/100)+(ori-j)*postrate)>ans) ans=cal; 28 } 29 printf("%d\n",ans); 30 i++; 31 } 32 return 0; 33}
実行結果
5 8 105
1.050000 105 106 (100) 107
8 5 105
1.080000 105 106 (98) 102
1 2 24
1.010000 24 25 (24) 24
99 98 24
1.990000 25 (12) 22
1 13 201
1.010000 202 (199) 224
0 0 0
ご指摘いただいて書き直したコード(まだ正確なものは表示されない)
C
1#include<stdio.h> 2#include<math.h> 3int main(void){ 4 int a[1000],b[1000],c[1000],ans; 5 int cal,ori; 6 int i=0; 7 while(1){ 8 scanf("%d %d %d",&a[i],&b[i],&c[i]); 9 ans=0; 10 if(a[i]==0&&b[i]==0&&c[i]==0) break; 11 int j; 12 ori=(c[i]*100+99)/(100+a[i]); 13 printf("(%d) ",ori); 14 double postrate=1+(double)b[i]/100; 15 for(j=1;j<ori;j++){ 16 if(j==1) ans=j*(double)(1+b[i]/100)+(ori-j)*postrate; 17 else if((cal=j*(double)(1+b[i]/100)+(ori-j)*postrate)<ans) break; 18 else if((cal=j*(double)(1+b[i]/100)+(ori-j)*postrate)>ans) ans=cal; 19 } 20 printf("%d\n",ans); 21 i++; 22 } 23 return 0; 24}
実行結果
入力
5 8 105
8 5 105
1 2 24
99 98 24
12 13 26
1 22 23
1 13 201
13 16 112
出力 ()内は税が変わる前の税抜き価格の最大値が表示されています.この中の値が正確に答えと一致しません.
(100) 107
(98) 102
(24) 24
(12) 22
(24) 26
(23) 27
(199) 224
(99) 114
#追記
現時点での問題点
大方の答えは一致するが,数値が小さい入力の際に答えより大きい結果が出てしまう場合がある.
再度書き直したコード
C
1#include<stdio.h> 2#include<math.h> 3int main(void){ 4 int a,b,c,ans; 5 int cal,ori; 6 int p1max,p2max; 7 int q1max,q2max; 8 int i,j; 9 while(1){ 10 scanf("%d %d %d",&a,&b,&c); 11 ans=0; 12 if(a==0&&b==0&&c==0) break; 13 for(i=1;i<=c;i++){ 14 p1max=(i*100+99)/(100+a); 15 p2max=((c-i)*100+99)/(100+a); 16 q1max=p1max*(100+b)/100; 17 q2max=p2max*(100+b)/100; 18 if(ans<(q1max+q2max)) ans=q1max+q2max; 19 } 20 printf("%d\n",ans); 21 } 22 return 0; 23}
*間違っている箇所を☆で表しました.
入力の一部
5 8 105
8 5 105
1 2 24
99 98 24
12 13 26
1 22 23
1 13 201
13 16 112
2 24 50
1 82 61
1 84 125
1 99 999
99 1 999
98 99 999
1 99 11 ☆
99 1 12
11 36 332
11 84 498
出力の一部
109
103
24
24
27
28
225
116
62
111
230
1972
508
1004
21
7
408
828
模範解答
109
103
24
24
26
27
225
116
62
111
230
1972
508
1004
20 ☆
7
408
828
回答2件
あなたの回答
tips
プレビュー