• ベストアンサー

○進数の計算

直接VisualBasicとは関係ないですが、VBAのプロジェクトで ○進数の考え方で、英字を数値へ 数値を英字へ変換しているのですがどうしても理解できない事があります。 A B C AA AB AC BA ・ ・ ・ 上記のような法則があるとします。 A-Cを数字に置き換えます。 A -> 0 B -> 1 C -> 2 文字→数値の計算式は 1桁目 A-Cの数値×3回毎に繰り上がるので3×1桁目は0乗 2桁目 A-Cの数値×3回毎に繰り上がるので3×2桁目は1乗 Aを数字に置き換えると 1桁目 Aは、0*3の0乗=0です。 期待通りです。 AAを数字に置き換えると 1桁目 Aは、0*3の0乗=0です。 2桁目 Aは、0*3の1乗=0です。 0 + 0 = 0 期待している値は3です。 BCを置き換えると 1桁目 Cは、2*3の0乗=2 2桁目 Bは、1*3の1乗=3 2 + 3 = 4 期待している値は8です。 3を文字に置き換えると 数字÷3回毎に繰り上がるので3 = 商 ・・・余り 余りで、文字列を引いてきます。 3÷3=1 ・・・0 -> A 2桁目は、1回目の商÷3       1÷3=切捨てで0 ・・・1 - > B B + A = BA 期待値はAAです。 これらは、1つずれて期待している値とは違う値が返ってきていると思うのですが、考え方で理解することができません。 どうしてこのようなことになるのでしょうか? 頭が混乱して考えても分かりません。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • chiezo2005
  • ベストアンサー率41% (634/1537)
回答No.3

#2です。 これ問題がおかしいですよ。 N進数という0のあるものに置き換えるから変な風になるので、 単純に A,B,C,AA,AB,AC,AAA・・・ という順にならぶ文字列ととらえればよいのでは? 上記の配列自身は規則性はありますし、全く問題はありません。 この配列をN進数の数字に置き換えるから変になってしまいます。 前の回答にも書きましたが最初のAは実はN進数では AAAAAAAAAAAAAAAAAAAA・・・AAAA と同じですからね。 たぶん問題を出した人が、なんとなくN進数と似ているからそんな問題文にしただけと思います。 その人も0の意味を理解していませんね。

kei2543
質問者

お礼

ありがとうございます。 >これ問題がおかしいですよ。 やはりその時点で間違ってるんですね。 担当者と話し合ってみます。 どうもありがとうございました!

その他の回答 (2)

  • chiezo2005
  • ベストアンサー率41% (634/1537)
回答No.2

最初にかいたAがなにを意味するかですね。 これが0だとするとインド人が発見したといわれている0の意味が判っていませんね。 Aが0なら A=AA=AAA=AAAA・・・・です。 最初の1はあえて書くなら 1=・・・AAAAAAAA・・・・・AAAAAB となります。この不要のAを書かないというのがN進法の表記です。 つまり A B C BA BB BC CA CB CC BAA BAB と続くのが正しい書き方です。

kei2543
質問者

お礼

>これが0だとするとインド人が発見したといわれている0の意味が判っていませんね。 奥深そうですね・・・ >この不要のAを書かないというのがN進法の表記です。 ありがとうございます。理解しました。 実は、進法は全く勉強した事がなかったので、いきなり実践したのがまずかったみたいですね。

kei2543
質問者

補足

考えて見ましたが、やはり混乱してきました・・・ 実は実践では、A-Zでインクリメントしていくという問題なのですが A->B->C・・・Z Zの次はAA・・・ZZの次はAAA といった感じです。このインクリメントに26進法?見たいなのを使ってうまくできないかと考えていたのですが難しくて・・・ イメージとしては、 文字列→数値→数値+1→文字列 といった感じで文字列のインクリメントをしようかと考えているのですが、数値に変換しないとインクリメントできませんよね・・・ う~ん・・・難しい・・・この方法は間違ってるのでしょうか 単純にIF文でZの時は・・・と書いても良いのですが変更が加わったりするとかなり変更しなければいけなくなりそうなので

回答No.1

Aを0と考えているとのことですが、ご質問の例を単純に3進数に置き換えてみましょう。 A → 0 B → 1 C → 2 AA → 00 AB → 01 AC → 02 BA → 10 : : わかりましたか? Aを0と考えると、AとAAは、0と00、つまり同じになってしまうのです。 0は特別なものと見なし、記号に置き換えない方が無難です。

kei2543
質問者

お礼

ありがとうございます。 >0は特別なものと見なし、記号に置き換えない方が無難です。 0が何か邪魔な数値だとは思っていましたが、例で書いて頂くとやはりそうですね 2進数では、0は無意味な数値で扱われているのに私の考えてたのは0が意味するのでやりにくいと感じていました ↑ちょっとわかりにくいですが。。

関連するQ&A

  • 有効桁数について

    ある数値を5回測定したとします A 5.039 B 5.075 C 5.092 D 5.064 E 5.058 有効桁数はすべて4桁ですよね? 次にA~Eの平均を取ると (A+B+C+D+E)/5=5.0656 と関数電卓で結果がでますが、4桁に丸めて5.066とすれば有効桁数の扱い方としては問題ないですか? そしてA~Eの平均の2乗をするときは、上記の平均を有効桁数4桁に丸めた5.066を2乗して (5.066)^2=25.664356 となり、そして5.066の有効桁数4桁に合わして25.66とすればいいのでしょうか? それとも平均の値を4桁に丸める前の電卓で出た値のまま2乗した後、最終的に4桁に丸めるのがいいのでしょうか?この数値だとどちらでやっても4桁にした値は変わりませんが・・・ 有効桁数の扱い方で問題があったら教えてください、また平均の2乗を求めるときはどちらが正しいのでしょうか? (平均の値の2乗は平均×平均なのだから平均の値を4桁にせず5桁として計算すると平均の2乗は有効桁数5桁と考えるので、やはり正しく平均の値を測定値の有効桁数4桁に丸めて出した平均の値を2乗する方が正しいですかね・・・)    また、上記の平均の計算をしたときのよな、「5」などの数字の有効桁数は何桁ですか?1桁なんでしょうか?もし1桁なら割り算をしているので有効桁数はいちばん桁数の少ないものに合わせるので有効桁数1となると平均の値が「5」となりおかしいとおもうんですが・・・ 上記の平均を取ったときの「5」や、測定回数の数値や、測定していない数で100で割れと書いてあったりしたときは、それらの数字の桁数も考えなければならないんでしょうか? 読みづらい文章かもしれませんが、ご回答待っています。

  • 16進数で表現される色をRGB値になおす計算

    例えば、「#F30485」という色を出したいとき、RGB値になおす場合計算方法は、 「0~9」の値はそのままで、「A~F」は「A=10」「B=11」「C=12」「D=13」「E=14」「F=15」として、2桁ずつそれぞれR・G・Bの値なので、R値は「15*16+3=243」、G値は「0*16+4=4」、B値は「8*16+5=133」で、「rgb(243,4,133)」。 つまり、計算式は、 「それぞれの最初の桁の数字*16+それぞれの2番目の桁の数字」 ということで合っているでしょうか? 回答よろしくお願いします。

    • ベストアンサー
    • HTML
  • 計算式について

    セルA5に入力されている(6桁の数値)値をセルE1(10000)で割った商の整数部分がセルE2(10)の値以上である場合で、セルA5の値をセルE1(10000)で割った商の整数部分がセルE3(70)以下であるばあには○を表示し、そうでない(70より上)場合は×を表示し、それ以外(10未満)の場合には×を表示させるという内容の計算式を教えて下さい。 セルA5の6桁の数値の上2桁が10以上で70以下:○を表示 セルA5の6桁の数値の上2桁が10以上で70以上:×を表示 セルA5の6桁の数値の上2桁が10未満:×を表示 という処理です。

  • 計算結果を別セルに分割して入力したい

    教えてください。A1からA10に2桁の単価数字から4桁の単価数字が入力される表があり、B1からB10に利用回数を1桁数字から2桁数字を入力して掛けた結果をC1からC10に反映させた表があります。このC1の値をD1からI1のセルへ桁数ごと分けて、右よせで数字を反映させたいのですが可能でしょうか。 たとえば A1:180 掛ける B1:5  結果C1:900 このC1:900を G1:9 H1:0 I1:0 としたいのです。 よろしくおねがいします。

  • 数学 計算

     数学の計算をしていて、分からない箇所があるので教えてください。  -1/3(B-A)(-B2+2BA-A2)=1/3(B-A)3 半角の数字は~乗を表してます。 公式を使っているのは分かるのですが、マイナスが付くとどう整理していいのかわからなくなってしまいます。計算の過程を丁寧に教えて下さい。

  • 場合の数の問題

    1から5まで書かれているカードがある.これらのカードを使って3桁の数字を作る. 同じカードは何回使っても良いとする. A. 何種類の数字を作ることができるか. B. 偶数の数字は何通り作ることができるか. C. 6の倍数の数字は何通り作ることができるか. という問題なのですが, A:5^3 B:5*5*2=50 と分かりましたが,Cがわかりません. A,Bが正しいかとCの解き方を教えて頂ければ幸いです。 よろしくお願いします.

  • a-b=√3   ab=1 をみたす正の数 abがある

    次の問題の解き方,回答が分からず,困っています. どうか教えてください. なお,二乗の数字や,√数字,分数がうまくかけませんでした.ご理解のほどよろしくお願いします. a-b=√3     ab=1  をみたす正の数 abがある (1)a2(二乗) + b2(二乗) の値と a + b の値をそれぞれもとめよ . (2)x=a2(二乗) -√7b, y= b2(二乗) - √7aのとき x + y の値と x-y の値をもとめよ. (3)(2)のとき x /|x|+ y / |y| の値をもとめよ ※分数の部分がうまくかけませんでした.             

  • 高一、数IIの計算式

    数IIの問題です 恥を忍んで質問しますので、よろしくおねがいします (a-b)(b-c)/ca + (b-c)(c-a)/ab + (c-a)(a-b)/bc この式を計算しろ、という問題です。 /は(a-b)(b-c)分のcaという意味です。記憶がおぼろげなので、表記が逆の意味だったらすいません。 これは通分して、 =(a-b)(b-c)(c-a)/ca(c-a)+ab(a-b)+bc(b-c) =(a-b)(b-c)(c-a)/c二乗a-ca二乗+a二乗b-ab二乗+b二乗c-bc二乗 として、分子で因数分解をするらしいのですがどうも計算式が間違っているのか解けません。 アドバイスよろしくおねがいします。

  • 計算の仕方がわかりません 

    計算の仕方がわからないので教えてほしいです。 (X3乗+ax2乗+bx+1)÷(x2乗-2x+1) 商は?余りは? もし割り切れるならa=? b=? 答えはわかっています 商 x+a+2  余り (2a+b+3)x-a-1 a=-1 b=-1 お願いします

  • isalpha()関数について

    isalpha()関数について ◆開発環境 OS:Linux(Ubuntu9.10) コンパイラ:gcc4.4 IDE:eclipse 言語:C 《質問内容》 現在、char型配列A[8](最大8桁の文字列が格納されるため)に英字から始まる文字列(英字・数字)を入力し、 2文字目の文字を英字かどうか判別し、if文で分岐させようとしているのですが、 この2文字目の文字をisalpha()にかけても、英字と判別せず、思い通りの処理ができない状態で 困っています。 現状、以下のソースですと、"D0"ならelse ifに入りますが、"SM0"と入れるとifに入らずに、else ifに入ってしまいます。(2文字目は英字なのに…) 以下に、参考ソースを添付します。 どなたか、お分かりの方いらっしゃいましたら、ご教授お願いします。 できれば、isalphaの使い方等も詳しく教えていただけたら幸いです。(webで調べるとisalpha(int c)と書いてあり、文字の判別にint?とかなり疑問です。一応、ソース上ではchar型にキャストしてますが。) 《ソース》 char A[9]="";      //最大8桁の文字列(英字・数字)が入る char B[3]="";        //A,B入れ替え用バッファ char C[7]=""; //最大6桁の文字列(数字)が入る char code[2]="";      //判別用バッファ int C_val; //Cの10進値格納変数(後で使う) fscanf(stdin,"%s",&A); strncpy(code,,A+1,1);                  //code[2]に"0"をコピー if( (unsigned char)isalpha(code) != 0){          //codeが英字なら先頭2文字は英字 strncpy(B,A,2);             strncpy(C,A+2,strlen(A)-2); C_val=atoi(C); //Cの10進化 strcpy(A,"");    //Aの初期化 strcpy(A,B); strcpy(B,""); //Bの初期化 } else if( (unsigned char)isalpha(code) == 0){    //codeが英字でないなら先頭1文字が英字 strncpy(B,A,1); strncpy(C,A+1,strlen(A)-1); C_val=atoi(C);          //Cの10進化 strcpy(A,""); //Aの初期化 strcpy(A,B); strcpy(B,""); //Bの初期化 }