下記のPythonで組まれたプログラムをC言語になおしていただけないでしょうか。 今ある手持ちの各硬貨の数から○○円の商品を買い、その際、お釣りの総硬貨数が最小になるプロゴラムです。

下記のPythonで組まれたプログラムをC言語になおしていただけないでしょうか。 今ある手持ちの各硬貨の数から○○円の商品を買い、その際、お釣りの総硬貨数が最小になるプロゴラムです。 宜しくお願いします。 # -*- coding: utf-8 -*- import itertools money_type = (10000, 5000, 2000, 1000, 500, 100, 50, 10, 5, 1) def smart_pay(saifu,kakaku): bestPttern=None patterns=[] for mtype in money_type: pattern=[] for c in range(saifu[mtype]+1): pattern.append([mtype,c]) if len(pattern)>1: patterns.append(pattern) for p in itertools.product(*patterns): ptn={x[0]:x[1] for x in p} if coins2price(ptn)>=kakaku: if bestPttern is None: bestPttern=ptn else: if count_coins(price2coins(coins2price(bestPttern)-kakaku)) > count_coins(price2coins(coins2price(ptn)-kakaku)): bestPttern=ptn return bestPttern def price2coins(price): coins = {} for mt in money_type: coins[mt], price = divmod(price, mt) return coins def coins2price(coins): return sum(key * val for key,val in coins.items()) def count_coins(coins): return sum(val for key,val in coins.items()) if __name__ == "__main__": saifu={} print("まずお財布の中身をお聞きします...") for mtype in money_type: saifu[mtype]= int(raw_input(str(mtype)+ "円は何枚?\n>")) kakaku=int(raw_input("いくらの商品を買いますか?\n>")) print("最適な支払い方法は.\n.\n.\n") bestPttern=smart_pay(saifu,kakaku) if bestPttern is None: print("おかねたりないです。。。") else: for key,val in bestPttern.items(): print(str(key)+"円を"+str(val)+"枚") print("です!") 掲載元 http://qiita.com/kurehajime/items/243907cef90eb6766110

C言語関連158閲覧xmlns="http://www.w3.org/2000/svg">500

ベストアンサー

0

何でワザワザ無駄ループからの直積なんて使ってる微妙 コード引っ張って来て直したがってるん?と思ったけど、 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11147127071 どうやら結果さえ出れば手段の形式には拘らない様子。 なら、総当りの検索をCに直したコードでも。 http://www7b.biglobe.ne.jp/~half-dead/javascript/coin-game.html ↑ココで[2000円無いけど]答え合わせした限り動いてるかと。 //ideone.com/RWB1L7#UYXVUl#コメントは自力で #include<stdio.h> #define N 10 int money_type[N]={10000, 5000, 2000, 1000, 500, 100, 50, 10, 5, 1}; int price2coins(int price,int*coins){int mtype,sum=0;   for(mtype=0;mtype<N;++mtype)     sum+=coins[mtype]=price/money_type[mtype],     price%=money_type[mtype]; return sum;} int coins2price(int*coins){int mtype,sum=0;   for(mtype=0;mtype<N;++mtype)     sum+=money_type[mtype]*coins[mtype]; return sum;} int count_coins(int*coins){int mtype,sum=0;   for(mtype=0;mtype<N;++mtype)     sum+=coins[mtype]; return sum;} int smart_pay(int*saifu,int kakaku,int*pay,int*change){   int mtype,shiharai,otsuri,total,best=-1;   int mm,pp[N]={0},cc[N]={0};   for(mtype=N-1;0<=mtype;){     if((shiharai=coins2price(pp))>=kakaku){       otsuri=shiharai-kakaku;       total=price2coins(otsuri,cc);       if(best<0||best>total)         for(best=total,mm=0;mm<N;++mm)           pay[mm]=pp[mm], change[mm]=cc[mm];     }     for(mtype=N-1;0<=mtype;--mtype)       if(++pp[mtype]>saifu[mtype]||           (pp[mtype]-1)*money_type[mtype]>=kakaku)         pp[mtype]=0;       else break;   } return best;} int main(void){int mtype,kakaku,total;   int saifu[N]={0},pay[N],change[N];   printf("まずお財布の中身をお聞きします...\n");   for(mtype=N-1;0<=mtype;--mtype){     printf("%5d円 = ",money_type[mtype]);     scanf("%d",&saifu[mtype]);   }   printf("代金[%5d円以内] = ", coins2price(saifu));   scanf("%d",&kakaku);   total=smart_pay(saifu,kakaku,pay,change);   printf("最適な支払い方法は...");   if(total<0){     printf("おかねたりないです。。。\n");   }else{     printf("%5d円\n",coins2price(pay));     for(mtype=N-1;0<=mtype;--mtype)       printf("%5d円 = %d枚[釣り%3d枚]\n",         money_type[mtype],pay[mtype],change[mtype]);     printf("です![釣り%5d円%3d枚]\n",       coins2price(change),total);   } return 0;}

ThanksImg質問者からのお礼コメント

本当に有難うございました。 期限が月曜まででしたので助かりました。 これからこのソースコードを改良してどの程度簡略化出来るか考えていきたいと思います。

お礼日時:2015/6/27 2:19

その他の回答(1件)

0

GitHubにそれを変換するツール(Py2C)があります。 https://github.com/pradyunsg/Py2C

解答有難うございます。URL拝見しました。 申し訳ないのですが、ページ上のどれを使用して変換するのかが分からないので、変換するまでの流れを説明して頂けたら嬉しいです。 翻訳したのですが分かりませんでした・・・