- ベストアンサー
romanize() を使って・・・
はじめまして。今年からプログラミングをやりはじめた超初心者です。 皆様にとっては簡単なものかもしれませんが私にはどうしてもわからずこちらに投稿させていただきました。 数を入力し、ローマ字を表示するというプログラムなのですが、たとえば 483を入力してromanize(483, 1, ’a’),romanize(483, 5, ’b’),romanize(483, 10, ’c’),romanize(483, 50, ’d’),romanize(483, 100, ’e’)のようにすると eeeedcccaaa と表示するプログラムを作りたいのです。私がわからないのは入力された数字の中に1, 5, 10などの数字がいくつ含まれているか、また含まれていた場合どのようにしてletter文字 aやbなどのローマ字を表示するかです。 今まではなんとか間違っていてもなんらかを書いていろいろ試し、自力でやっていたのですがどうにも手がつけられないので質問させていただきました。 ご回答のほうよろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
#2です。 >romanize()は提供された関数です。 もし、そうならば、それを n = romanize(n, 100, 'e'); n = romanize(n, 50, 'd'); n = romanize(n, 10, 'c'); n = romanize(n, 5, 'b'); n = romanize(n, 1, 'a'); のように呼び出せばすむ話ですが、そうではないのでしょうか? とすると、romanize()とおなじものを自分で作りたいということでしょうか? >a,b,cとしたとき aは入力された数、bは元となる数,cはローマ字(letter文字)となっています。aを入力したときbがいくつ含まれているかを求めていき、それからその数だけcを表示する、という方法です。 この説明によれば、romanize(483,1,'a')には1が483個含まれるから'a'を483個印字すれば良いように解釈できますが、どうもそうでは、ないようです。 補足説明から、あなたの望んでいることは、以下のことであると、解釈して、回答します。 1.romanize(a,b,c)関数を自分で作成したい。 2.romanize(a,b,c)関数の仕様は以下の通り。 1)aは0以上の数値が指定される(負の数は想定しなくてよい) 2)bは1,5,10,50,100のいずれかの数値が指定される (この数値以外の数値が指定されるケースは想定しなくて良い) 3)cは任意の1文字が指定される 4)上記の条件で数値が指定されたとき、その数値内に、1,5,10,50,100がいくつ含まれるかを求める。ただし、いくつ含まれるかの数は、100,50,10,5,1の順に判定する。 5)上記4)でいくつ含まれるかが、それぞれ求められた時、bで指定された数値に該当する数がいくつ含まれるを求め、その数分、cを印字する。 以下が回答です。 基本的には aを100で割った商-->100がいくつ含まれるかの答え (aを100で割った余り)を50で割った商-->50がいくつ含まれるかの答え (aを100で割った余り)を50で割った余りを10で割った商-->10がいくつ含まれるかの答え のようにして、 100,50,10,5,1がいくつ含まれるかを求めます。 その次に、bが1,5,10,50,100のいずれかを判定し、その数 に対応した含まれる数を求め、その分印字します。 上記が素直に計算した方法です。 もっと簡単にするなら bの1つ上のランクの数値でaを割った余りをbで割った商が求める印字回数となります。(ただしb=100の場合はbで割った商) 例: b=1の時、(aを5で割った余り)/bの商が答え b=5の時、(aを10で割った余り)/bの商が答え b=10の時、(aを50で割った余り)/bの商が答え b=50の時、(aを100で割った余り)/bの商が答え b=100の時、a/bの商が答え のようになります。
その他の回答 (5)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
すみません、#4には、間違いがありました。 再掲 ------------------------------------------ #include <stdio.h> #include <stdlib.h> /* roman は0<= n < 4000 */ /* buff は10以上必要 */ typedef struct radix { int digit; char roman; char romanNext; } RADIX; char *roman(int num, char *buff){ static RADIX table[4]={ { 1000, 'M', '?' }, /* 5000って知らん */ { 100, 'C', 'D' }, { 10, 'X', 'L' }, { 1, 'I', 'V' } }; int tableSize = sizeof(table)/sizeof(RADIX); int i, j, n; char *p; if(num < 0 || num >=4000){ /* 4000未満の正の数 */ *buff='\0'; return NULL;/* 通常は buffを返す */ } for(i=0,p=buff;i<tableSize;i++){ n = num / table[i].digit; if( 1 <= n && n <=3 ){ for(j=0;j<n;j++) *p++=table[i].roman; } else if(n == 4){ *p++=table[i].roman; *p++=table[i].romanNext; } else if(n == 5){ *p++=table[i].romanNext; } else if(6<= n && n <=8){ *p++=table[i].romanNext; for(j=0;j< n-5;) *p++=table[i].roman; } else if(n == 9){ *p++=table[i].roman; *p++=table[i-1].roman; } num -= n * table[i].digit; } *p='\0'; return buff; } int main(int argc, char **argv){ char buff[10]; // printf("3999 as roman:%s\n",roman(3999, buff)); if(argc < 2){ printf("roman number\n"); return -1; } printf("%s is %s\n",argv[1],roman(atoi(argv[1]), buff)); return 0; } ------------------------------------------------------------- ところで、 #2の補足のような仕様だと 例えば、39は、ローマ数字でXXXIXですが、 含まれるXはと言われたら XXXX になって、 質問文のように実行すると、結果として、正しいローマ数字を表すようになりませんよ??
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
サンプルを作ってみました。 -------------------------- #include <stdio.h> #include <string.h> /* roman は0<= n < 4000 */ /* buff は10以上必要 */ typedef struct radix { int digit; char roman; char romanNext; } RADIX; char *roman(int num, char *buff){ static RADIX table[4]={ { 1000, 'M', '?' }, /* 5000って知らん */ { 100, 'C', 'D' }, { 10, 'X', 'L' }, { 1, 'I', 'V' } }; int tableSize = sizeof(table)/sizeof(RADIX); int i, j, n; char *p; if(num < 0 || num >=4000){ /* 4000未満の正の数 */ *buff='\0'; return NULL;/* 通常は buffを返す */ } for(i=0,p=buff;i<tableSize;i++){ n = num / table[i].digit; if( 1 <= n && n <=3 ){ for(j=0;j<n;j++) *p++=table[i].roman; } else if(n == 4){ *p++=table[i].roman; *p++=table[i].romanNext; } else if(n == 5){ *p++=table[i].romanNext; } else if(n <= 6 && n <=8){ *p++=table[i].romanNext; for(j=0;j< n-5;) *p++=table[i].roman; } else if(n == 9){ *p++=table[i].roman; *p++=table[i-1].roman; } num -= n * table[i].digit; } return buff; } int main(void){ char buff[10]; printf("3999 as roman:%s\n",roman(3999, buff)); return 0; }
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
よくある金種計算のように大きい桁から解決していくようなことになると思います。 仕様として、関数にローマ数字の表記を渡さなければならない理由がよく分かりません。 アラビア数字とローマ数字の対応表は、関数の中で持っていればいいことの様に思います。
- tatsu99
- ベストアンサー率52% (391/751)
すいません。基本的なことなのですが、 romanize()という関数は、すでに提供されている関数なのですか。それとも、いま、あなたが作ろうとしている関数なのでしょうか。 また、romanize(a,b,c)としたときの、各引数a,b,cの意味について説明していただけませんでしょうか。 また、引数a,b,cが与えられたとき、romanizeはどのように動作すべきものなのでしょうか。要は、romanize()の仕様はどのようになっておりますでしょうか?
- bulgaris
- ベストアンサー率50% (8/16)
あなたの質問から表示の法則性を推測しましたが、 私の推測した法則に基づいた回答は、あなたの質問とは合致しなくなります。 そこで逆に質問です。 1) romanizeが呼ばれる順序は逆ではないですか? 2) 483の部分は何かの変数ではないですか? 3) 本当に全てのromanizeに483の値が渡されていますか? また公開できるならば、ソースコードを一部抜粋して提示すると、回答しやすくなるかも知れません。
補足
すみません。かなりあいまいに質問を提示してしまったみたいですね・・・。 コードの一部としましては int romanize(int a, int b, char letter) { aの中にbがいくつ含まれるかにより letterをその個数だけ表示 } main() { int number; n = input_number(); n = romanize(n, 100, 'e'); n = romanize(n, 50, 'd'); n = romanize(n, 10, 'c'); n = romanize(n, 5, 'b'); n = romanize(n, 1, 'a'); putchar('\n'); } というものです。(日本語で書いてある部分はわかりません)483という数字の部分はプログラムを実行したときに自分で入力する数字のことを表しています。
補足
ご回答ありがとうございます。romanize()は提供された関数です。 a,b,cとしたとき aは入力された数、bは元となる数,cはローマ字(letter文字)となっています(すみません。説明が下手で・・)aを入力したときbがいくつ含まれているかを求めていき、それからその数だけcを表示する、という方法です。 先ほどの補足でmain()内の int number;と書きましたが int n;、input_number → input_n が正しいです。間違えました。。