LoginSignup
1
0

More than 3 years have passed since last update.

多倍長演算蝦蟇の油売り口上

Last updated at Posted at 2019-06-22

多倍長整数によるガマの油売り口上です。その昔、ASCII-NETで見たものを、再現してみました。

C

多倍長数値は、char型の配列に、1バイトに一桁の数字を、リトルエンディアンで入れています。
多倍長演算と言っても、このプログラムは自然数の数値を2倍する関数しか仕込んでいません。
100000桁に至るまで延々と表示します。高速なので、全部見たかったら、リダイレクトしてお読み下さい。もしくは、ソースコード内のループの制御文*(1)をお好みに変更して下さい。

6/23 虫取り改訂版Ver. 1.1

gama.c
// Version 1.1
#include <stdio.h>
#include <stdlib.h>

#define N 100000
char  a[N];

int gama_koujyou() {
 printf("さあさ、お立ち会い。ご用とお急ぎでない方は ゆっくりと聞いておいで。\n");
 printf("遠出の山越し笠のうち、聞かざるときは物の黒白、善悪がとんとわからない。\n");
 printf("山寺の鐘がゴオーン、ゴオーンと鳴るといえども、童子きたって鐘に\n");
 printf("撞木を与えずば、とんと鐘の音色がわからない。\n");
 printf("さて、お立ち会い。手前ここに取り出したるは陣中膏、蝦蟇の油。\n");
 printf("さーて、お立ち会い。蝦蟇と申しましてもただの蝦蟇とは蝦蟇が違う。\n");
 printf("関東は筑波山の麓、おんばこという露草を食って育った四六の蝦蟇だ。\n");
 printf("四六五六はどこで見分ける。前足の指が四本、うしろ足の指が六本、\n");
 printf("併せて四六の蝦蟇。山中ふかく分け入って捕らえたこの蝦蟇を、\n");
 printf("四面鏡の箱に入れると、蝦蟇は己の姿が鏡に写るのを見て吃驚仰天、\n");
 printf("タラーリ、タラーリと脂汗を流す。これをすき取り、柳の小枝で三七、\n");
 printf("二十と一日トローリ、トローリと煮詰めましたるがこの陣中膏蝦蟇の油。\n");
 printf("蝦蟇の油の効能は、ひびにあかぎれ、しもやけの妙薬。・・まだある。\n");
 printf("出痔、いぼ痔、はしり痔、はれもの一切。まあ、ちょっとお待ち。\n");
 printf("蝦蟇の油の効能はそればかりかというと、まだある。\n\n");
 printf("切れ物の切れ味をとめるという。手前持ちいだしたるは、鈍刀といえど、\n");
 printf("先が斬れて、元が斬れぬ、半ばが斬れぬというのではない。ごらんの通り、\n");
 printf("抜けば玉散る氷の刃だ、お立会い。取り出したるは夏なお寒き氷の刃!\n");
 printf("Hit enter key\n");
 getchar();
}

int gama_koujyou2()
{
  printf("これこの通り、フウッと散らせば 比良の暮雪は 雪降りの型。\n");
  printf("これなる名刀も、ひとたびこの蝦蟇の油をつけるときは、\n");
  printf("たちまち切れ味が止まる。押しても引いても切れはせぬ。\n");
  printf("と言うても、なまくらになったのではないぞー、お立ち会い!\n");
  printf("このようにきれいにふき取るときは、もとの切れ味になって、\n");
  printf("これこのとおり。\n");
  printf("さてお立ち会い。蝦蟇の油の効能が分かったら遠慮はご無用。\n");
  printf("どんどん買ってお行きやれ・・・\n");
}

int mul2(char *a)
{
  int carry=0,d,j;
  char  b[N];
  for(int i=0;i<N;i++)
    b[i]='\0';
  for(j=0;a[j]!='\0';j++) {
    d=(a[j]-'0')*2+carry;
    carry=d/10;
    d%=10;
    b[j]=d+'0';
    }
  if (carry) { b[j]='1'; }
  for(int i=0;b[i]!='\0';i++) {
    a[i]=b[i];
    }
}

int print(char *str)
{
  int l=0;
  while(*str!='\0') {str++; if (++l >= N) break;}
  str--;
  for(int i=0;i<l;i++)
    printf("%c",*str--);
}

int gama()
{
  gama_koujyou();
  for(int i=1;i<N;i++)
    a[i]='\0';
  a[0]='1';

 while(a[N-1]=='\0') {  // *(1)
// for(int k=1;k<=128;k++) { // *(2)
    print(a);
    printf("枚が");
    mul2(a);
    print(a);
    printf("枚、\n");
    }
  gama_koujyou2();
}

int main()
{
  gama();
    return EXIT_SUCCESS;
}


ループの制御文を*(2)にした時の実行結果

さあさ、お立ち会い。ご用とお急ぎでない方は ゆっくりと聞いておいで。
遠出の山越し笠のうち、聞かざるときは物の黒白、善悪がとんとわからない。
山寺の鐘がゴオーン、ゴオーンと鳴るといえども、童子きたって鐘に
撞木を与えずば、とんと鐘の音色がわからない。
さて、お立ち会い。手前ここに取り出したるは陣中膏、蝦蟇の油。
さーて、お立ち会い。蝦蟇と申しましてもただの蝦蟇とは蝦蟇が違う。
関東は筑波山の麓、おんばこという露草を食って育った四六の蝦蟇だ。
四六五六はどこで見分ける。前足の指が四本、うしろ足の指が六本、
併せて四六の蝦蟇。山中ふかく分け入って捕らえたこの蝦蟇を、
四面鏡の箱に入れると、蝦蟇は己の姿が鏡に写るのを見て吃驚仰天、
タラーリ、タラーリと脂汗を流す。これをすき取り、柳の小枝で三七、
二十と一日トローリ、トローリと煮詰めましたるがこの陣中膏蝦蟇の油。
蝦蟇の油の効能は、ひびにあかぎれ、しもやけの妙薬。・・まだある。
出痔、いぼ痔、はしり痔、はれもの一切。まあ、ちょっとお待ち。
蝦蟇の油の効能はそればかりかというと、まだある。

切れ物の切れ味をとめるという。手前持ちいだしたるは、鈍刀といえど、
先が斬れて、元が斬れぬ、半ばが斬れぬというのではない。ごらんの通り、
抜けば玉散る氷の刃だ、お立会い。取り出したるは夏なお寒き氷の刃!
Hit enter key

1枚が2枚、
2枚が4枚、
4枚が8枚、
8枚が16枚、
16枚が32枚、
32枚が64枚、
64枚が128枚、
128枚が256枚、
256枚が512枚、
512枚が1024枚、
1024枚が2048枚、
2048枚が4096枚、
4096枚が8192枚、
8192枚が16384枚、
16384枚が32768枚、
32768枚が65536枚、
65536枚が131072枚、
131072枚が262144枚、
262144枚が524288枚、
524288枚が1048576枚、
1048576枚が2097152枚、
2097152枚が4194304枚、
4194304枚が8388608枚、
8388608枚が16777216枚、
16777216枚が33554432枚、
33554432枚が67108864枚、
67108864枚が134217728枚、
134217728枚が268435456枚、
268435456枚が536870912枚、
536870912枚が1073741824枚、
1073741824枚が2147483648枚、
2147483648枚が4294967296枚、
4294967296枚が8589934592枚、
8589934592枚が17179869184枚、
17179869184枚が34359738368枚、
34359738368枚が68719476736枚、
68719476736枚が137438953472枚、
137438953472枚が274877906944枚、
274877906944枚が549755813888枚、
549755813888枚が1099511627776枚、
1099511627776枚が2199023255552枚、
2199023255552枚が4398046511104枚、
4398046511104枚が8796093022208枚、
8796093022208枚が17592186044416枚、
17592186044416枚が35184372088832枚、
35184372088832枚が70368744177664枚、
70368744177664枚が140737488355328枚、
140737488355328枚が281474976710656枚、
281474976710656枚が562949953421312枚、
562949953421312枚が1125899906842624枚、
1125899906842624枚が2251799813685248枚、
2251799813685248枚が4503599627370496枚、
4503599627370496枚が9007199254740992枚、
9007199254740992枚が18014398509481984枚、
18014398509481984枚が36028797018963968枚、
36028797018963968枚が72057594037927936枚、
72057594037927936枚が144115188075855872枚、
144115188075855872枚が288230376151711744枚、
288230376151711744枚が576460752303423488枚、
576460752303423488枚が1152921504606846976枚、
1152921504606846976枚が2305843009213693952枚、
2305843009213693952枚が4611686018427387904枚、
4611686018427387904枚が9223372036854775808枚、
9223372036854775808枚が18446744073709551616枚、
18446744073709551616枚が36893488147419103232枚、
36893488147419103232枚が73786976294838206464枚、
73786976294838206464枚が147573952589676412928枚、
147573952589676412928枚が295147905179352825856枚、
295147905179352825856枚が590295810358705651712枚、
590295810358705651712枚が1180591620717411303424枚、
1180591620717411303424枚が2361183241434822606848枚、
2361183241434822606848枚が4722366482869645213696枚、
4722366482869645213696枚が9444732965739290427392枚、
9444732965739290427392枚が18889465931478580854784枚、
18889465931478580854784枚が37778931862957161709568枚、
37778931862957161709568枚が75557863725914323419136枚、
75557863725914323419136枚が151115727451828646838272枚、
151115727451828646838272枚が302231454903657293676544枚、
302231454903657293676544枚が604462909807314587353088枚、
604462909807314587353088枚が1208925819614629174706176枚、
1208925819614629174706176枚が2417851639229258349412352枚、
2417851639229258349412352枚が4835703278458516698824704枚、
4835703278458516698824704枚が9671406556917033397649408枚、
9671406556917033397649408枚が19342813113834066795298816枚、
19342813113834066795298816枚が38685626227668133590597632枚、
38685626227668133590597632枚が77371252455336267181195264枚、
77371252455336267181195264枚が154742504910672534362390528枚、
154742504910672534362390528枚が309485009821345068724781056枚、
309485009821345068724781056枚が618970019642690137449562112枚、
618970019642690137449562112枚が1237940039285380274899124224枚、
1237940039285380274899124224枚が2475880078570760549798248448枚、
2475880078570760549798248448枚が4951760157141521099596496896枚、
4951760157141521099596496896枚が9903520314283042199192993792枚、
9903520314283042199192993792枚が19807040628566084398385987584枚、
19807040628566084398385987584枚が39614081257132168796771975168枚、
39614081257132168796771975168枚が79228162514264337593543950336枚、
79228162514264337593543950336枚が158456325028528675187087900672枚、
158456325028528675187087900672枚が316912650057057350374175801344枚、
316912650057057350374175801344枚が633825300114114700748351602688枚、
633825300114114700748351602688枚が1267650600228229401496703205376枚、
1267650600228229401496703205376枚が2535301200456458802993406410752枚、
2535301200456458802993406410752枚が5070602400912917605986812821504枚、
5070602400912917605986812821504枚が10141204801825835211973625643008枚、
10141204801825835211973625643008枚が20282409603651670423947251286016枚、
20282409603651670423947251286016枚が40564819207303340847894502572032枚、
40564819207303340847894502572032枚が81129638414606681695789005144064枚、
81129638414606681695789005144064枚が162259276829213363391578010288128枚、
162259276829213363391578010288128枚が324518553658426726783156020576256枚、
324518553658426726783156020576256枚が649037107316853453566312041152512枚、
649037107316853453566312041152512枚が1298074214633706907132624082305024枚、
1298074214633706907132624082305024枚が2596148429267413814265248164610048枚、
2596148429267413814265248164610048枚が5192296858534827628530496329220096枚、
5192296858534827628530496329220096枚が10384593717069655257060992658440192枚、
10384593717069655257060992658440192枚が20769187434139310514121985316880384枚、
20769187434139310514121985316880384枚が41538374868278621028243970633760768枚、
41538374868278621028243970633760768枚が83076749736557242056487941267521536枚、
83076749736557242056487941267521536枚が166153499473114484112975882535043072枚、
166153499473114484112975882535043072枚が332306998946228968225951765070086144枚、
332306998946228968225951765070086144枚が664613997892457936451903530140172288枚、
664613997892457936451903530140172288枚が1329227995784915872903807060280344576枚、
1329227995784915872903807060280344576枚が2658455991569831745807614120560689152枚、
2658455991569831745807614120560689152枚が5316911983139663491615228241121378304枚、
5316911983139663491615228241121378304枚が10633823966279326983230456482242756608枚、
10633823966279326983230456482242756608枚が21267647932558653966460912964485513216枚、
21267647932558653966460912964485513216枚が42535295865117307932921825928971026432枚、
42535295865117307932921825928971026432枚が85070591730234615865843651857942052864枚、
85070591730234615865843651857942052864枚が170141183460469231731687303715884105728枚、
170141183460469231731687303715884105728枚が340282366920938463463374607431768211456枚、
これこの通り、フウッと散らせば 比良の暮雪は 雪降りの型。
これなる名刀も、ひとたびこの蝦蟇の油をつけるときは、
たちまち切れ味が止まる。押しても引いても切れはせぬ。
と言うても、なまくらになったのではないぞー、お立ち会い!
このようにきれいにふき取るときは、もとの切れ味になって、
これこのとおり。
さてお立ち会い。蝦蟇の油の効能が分かったら遠慮はご無用。
どんどん買ってお行きやれ・・・

python3

pythonは、多倍長整数が扱えるので、とてもシンプルになります。

gama.py
#!/usr/bin/python3

def gama_koujyou():
  print("さあさ、お立ち会い。ご用とお急ぎでない方は ゆっくりと聞いておいで。")
  print("遠出の山越し笠のうち、聞かざるときは物の黒白、善悪がとんとわからない。")
  print("山寺の鐘がゴオーン、ゴオーンと鳴るといえども、童子きたって鐘に")
  print("撞木を与えずば、とんと鐘の音色がわからない。")
  print("さて、お立ち会い。手前ここに取り出したるは陣中膏、蝦蟇の油。")
  print("さーて、お立ち会い。蝦蟇と申しましてもただの蝦蟇とは蝦蟇が違う。")
  print("関東は筑波山の麓、おんばこという露草を食って育った四六の蝦蟇だ。")
  print("四六五六はどこで見分ける。前足の指が四本、うしろ足の指が六本、")
  print("併せて四六の蝦蟇。山中ふかく分け入って捕らえたこの蝦蟇を、")
  print("四面鏡の箱に入れると、蝦蟇は己の姿が鏡に写るのを見て吃驚仰天、")
  print("タラーリ、タラーリと脂汗を流す。これをすき取り、柳の小枝で三七、")
  print("二十と一日トローリ、トローリと煮詰めましたるがこの陣中膏蝦蟇の油。")
  print("蝦蟇の油の効能は、ひびにあかぎれ、しもやけの妙薬。・・まだある。")
  print("出痔、いぼ痔、はしり痔、はれもの一切。まあ、ちょっとお待ち。")
  print("蝦蟇の油の効能はそればかりかというと、まだある。\n")
  print("切れ物の切れ味をとめるという。手前持ちいだしたるは、鈍刀といえど、")
  print("先が斬れて、元が斬れぬ、半ばが斬れぬというのではない。ごらんの通り、")
  print("抜けば玉散る氷の刃だ、お立会い。取り出したるは夏なお寒き氷の刃!")
  print("Hit enter key")
  input()

def gama_koujyou2():
  print("これこの通り、フウッと散らせば 比良の暮雪は 雪降りの型。")
  print("これなる名刀も、ひとたびこの蝦蟇の油をつけるときは、")
  print("たちまち切れ味が止まる。押しても引いても切れはせぬ。")
  print("と言うても、なまくらになったのではないぞー、お立ち会い!")
  print("このようにきれいにふき取るときは、もとの切れ味になって、")
  print("これこのとおり。")
  print("さてお立ち会い。蝦蟇の油の効能が分かったら遠慮はご無用。")
  print("どんどん買ってお行きやれ・・・")

gama_koujyou()
k=0
while(k<1000000):
    print(2**k,"枚が",2**(k+1),"枚、",sep="")
    k+=1
gama_koujyou2()
1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0