Quantcast
Channel: 円周率近似値の日に生まれて理系じゃないわけないだろ! - knifeのblog
Viewing all articles
Browse latest Browse all 5376

1万円札の両替は何パターン? -プログラミング編-

$
0
0

問題1
日本において、現行の紙幣と硬貨は、以下の通りである。
10000円札、5000円札、2000円札、1000円札、500円硬貨、100円硬貨、50円硬貨、10円硬貨、5円硬貨、1円硬貨、の10種類。
これを踏まえて、10000円札を両替は何通り?

これをプログラミングするんだけど、どうしましょうかね。
 

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

int main(int argc, char *argv[])
{
    int a, b, c, d, e, f, g, h, i, x;
    unsigned long long p=0;

    if ( argc==2 ) {
        x=atoi(argv[1]);
    }
    if ( x > 10000 || x == 0 ) {
        x = 10000;
    }
    
    for (a=x/10000; a>=0; a--)
    for (b=(x-a*10000)/5000; b>=0; b--)
    for (c=(x-a*10000-b*5000)/2000; c>=0; c--)
    for (d=(x-a*10000-b*5000-c*2000)/1000; d>=0; d--)
    for (e=(x-a*10000-b*5000-c*2000-d*1000)/500; e>=0; e--)
    for (f=(x-a*10000-b*5000-c*2000-d*1000-e*500)/100; f>=0; f--)
    for (g=(x-a*10000-b*5000-c*2000-d*1000-e*500-f*100)/50; g>=0; g--)
    for (h=(x-a*10000-b*5000-c*2000-d*1000-e*500-f*100-g*50)/10; h>=0; h--)
    for (i=(x-a*10000-b*5000-c*2000-d*1000-e*500-f*100-g*50-h*10)/5; i>=0; i--) p++;
    if ( x==10000 || x==5000 || x==2000 || x==1000 || x==500 || x==100 || x==50 || x==10 || x==5 ) p--;
    printf("%d\t%llu\n", x, p);

    return EXIT_SUCCESS;
}


すんごいネストしているけど、これ自分の出した結論。
こういう問題は、今どきだとマシンパワーでゴリゴリと計算させるに限る。
随分と昔は、再帰処理で書いた記憶があるが、コンパイラの性能が良くても、どうしても再帰処理になると遅いという印象からか、よっぽど再帰処理に適したものしか使わないようになってしまった。

a: 10000円札
b: 5000円札
c: 2000円札
d: 1000円札
e: 500円玉
f: 100円玉
g: 50円玉
h: 10円玉
i: 5円玉
と、これらの変数は枚数を表して、多項式として考えている。

1万円札の両替なのだから、1万円札を使う必要がないのは明白だろう。
なので、パターン数のカウントしている変数pをデクリメントしているのだ。

1万円以下を調べられるようにと、実行時のパラメータでいろいろと確認出来る。

2011年モデルのボロパソコンでも、1秒も掛からずに答えを返すので、これで事足りるということだろう。

他の類題の答えは、

問題2の答え
33672307232106通り

問題3の答え
2512684266通り


ではでは


Viewing all articles
Browse latest Browse all 5376

Trending Articles