質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

7回答

4779閲覧

JavaScriptで任意の桁の数字をランダムで取得して細分化、計算するにはどうしたらいいですか?

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

2クリップ

投稿2015/05/27 21:57

編集2015/05/28 06:43

口で説明するのは難しいんで図にしました。
例えば1234(変数a)+9876(変数b)の場合
![画像]WIDTH:600
といった感じです。
暗算ゲーム的なものですがどのように実行したらいいですか?
おそらく5は普通に a + b の答えかと思うのですが1,2,3,4はどうしたらいいかわかりません。ある程度イメージはできるのですが文にできません。すいません。しかし、もし私が考えているのが正しかったら1234 + 987のような桁が違う計算をするには987の前に0を追加して0987にしないと無理っぽいです。何言ってるかわからないかもしれませんが何卒お願いします。

lang

1 2みなさんありがとうございます。質問させていただいてる分際で言うのもなんですが、なんだかだいぶ難しそうなので少しお時間を頂きたいです。いろいろ試行錯誤して何か期待通りに動かなかったときはその時に質問させていただいてもよろしいでしょうか?ベストアンサーを選べなくて本当に申し訳ないのですが、みなさまの貴重な回答はとてもためになりました!誠にありがとうございます!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nekora

2015/05/28 02:15

えっと、これからサンプルコードを書こうとしていたのですが、仕様が把握できないので情報の追記をお願いします。 追記していただきたいことは、    タイトルにランダムに取得とありますが、間違いないですか? 実際の例では  変数aが、1234  変数bが、9876 となってて、  例で、どちらも、左端から数字を取り出した組み合わせになっていますが ランダム取得ならば、状況によっては  1000 70 30 6 200 800 4 9000 こういった組み合わせもあるという認識でよろしいでしょうか? そして、5番の意味が分りません、この合計とは何でしょう? 変数aで言えば、 バラバラに取り出した、1000,200,30,4を出したものと、変数bも同様にして足したものを さらに、足すと言うことでしょうか? まぁ、仰る通り、今書いた通りならば、つまりは a+bになりますが だからと言って、a+bで済ましていいのか?それとも、各切りだした数値を、ちゃんと合計して 結果的にa+bだね。というロジックがほしいのか?どちらでしょうか? 追記いただけると幸いです
退会済みユーザー

退会済みユーザー

2015/05/28 06:36

1~4は数字を桁ごとに分割し、大きい順に並べた数字ですので6桁(235,711)なら上の図で例えると①~⑥までできて①は6桁目の数字+00000、②は5桁目の数字+0000と言った感じでこの場合6まで製作されます。1は200,000、2は30,000、3は5,000、4は700、5は10、6は1となります。 上の図の5ですが変数aと変数bの合計値になります。まだ説明不足かもしれませんがその時はまた、一言ください。
guest

回答7

0

他の方が数学的解決策なので自分は黒魔術でも使っておきます。

lang

1//対象の数字 2var n1=1520,n2=1472; 3 4(function (num1,num2){ 5 //文字列化 6 var string_n1=num1+"",string_n2=num2+""; 7 var returnArray=[];//返却用配列 8 9 //桁数合わせ 10 while(string_n1.length!=string_n2.length){ 11 string_n1.length<string_n2.length ? string_n1="0"+string_n1 : string_n2="0"+string_n2; 12 } 13 14 //乗数の生成 15 function _c1(n){ 16 var r="1"; 17 while(n--){ 18 r+="0"; 19 } 20 return r; 21 }; 22 23 //各桁の数と_c1()で生成した乗数を掛ける 24 function _c2(n,len){ 25 return n*_c1(len); 26 }; 27 28 //桁数の分だけループ 29 for(var i=0,len=string_n1.length-1;i<=len;i++){ 30 returnArray[returnArray.length]=_c2(string_n1[i],len-i)+_c2(string_n2[i],len-i); 31 } 32 33 //出力 34 console.log(returnArray); 35 36}(n1,n2));

マイナス値には対応していません。
以下必要なさそうですが解説。

文字列化することによりlengthの取得と添え字参照による各桁の取得を行っています。
_c1()から出力される値は文字列ですが_c2()内で型変換により数値になります。

for文内len-iですがまずlenはlength-1が代入されており、この例ですと4-1==3となりますね。
最初iは0ですのでlen(3)-i(0)==3となります。
次にiは1ですのでlen(3)-i(1)==2となります。

このことにより乗数の0の数が算出できますね。

以上が黒魔術的コードです。

投稿2015/05/28 14:27

Cf_cwd

総合スコア730

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Cf_cwd

2015/05/28 14:30

あ、変数や関数名の命名は見逃してください……。 ノンプログラマには良い名前が思いつかなかったんです。 もう答え出てるし黒魔術使おうという思い付きだったもので。
guest

0

こんにちは。
swordoneさんの方法をjavascriptで書けないかと考えてみたら思いの外簡単に記述できたので載せておきます。

lang

1var a = 1234; 2var b = 9876; 3// 桁数を得る (桁数が多い方を取得) 4var len = Math.max(("" + Math.abs(a)).length, ("" + Math.abs(b)).length); 5 6// 式を出力 (ここではコンソールに出力してます、必要に応じてHTML要素を挿入するコード等に書き換えて) 7var cnt = 0; 8for (var i = Math.pow(10, len-1); i >= 1; i /= 10) { 9 var val_a = a % (i*10) - a % i; 10 var val_b = b % (i*10) - b % i; 11 var val_sum = val_a + val_b; 12 console.log([(++cnt)+")", val_a, "+", val_b, "=", val_sum].join(" ")); 13} 14console.log([(++cnt)+")", a, "+", b, "=", a+b].join(" "));

実際に使われる数値の範囲は分かりませんが、マイナスでもいけるようですね。

参考になれば幸いです。

===== 追記 =====
ちょっとした違いですが、桁数を得るところはこちらの方がパフォーマンス良さそうですね (計測はしていませんが..)
まあ速度のことを言い出すとキリがないのでこれも参考までに。

lang

1var len = ( "" + Math.max(Math.abs(a), Math.abs(b)) ).length;

投稿2015/05/28 04:05

編集2015/05/28 04:13
MAGP

総合スコア153

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/05/28 06:49

ありがとうございます!実行速度のことまで気にしていただいて助かります!
guest

0

適当に書いてみました。
Node.jsでしかテストしていませんが、たぶん動くはず・・・!

lang

1var a = 1234; 2var b = 9876; 3 4(function ketagoto(a, b){ 5 var _al = (a + '').length; 6 var keta = 1; 7 for(i=0; i<_al-1; i++){ 8 keta *= 10; 9 } 10 if(a >= 10){ 11 var _a = a - (a % keta); 12 var _b = b - (b % keta); 13 console.log(_a + ' + ' + _b + ' = ' + (_a + _b)); 14 ketagoto((a % keta), (b % keta)); 15 } else { 16 console.log(a + ' + ' + b + ' = ' + (a + b)); 17 } 18})(a, b); 19console.log(a + ' + ' + b + ' = ' + (a + b));

桁数の出し方はswordoneさんのやり方の方が性能いいかもしれませんね。
とは言え、そもそも性能気にした書き方はしてないので、ご参考程度に。

投稿2015/05/28 03:29

utun

総合スコア384

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/05/28 06:47

ありがとうございます!とても参考になりました!
guest

0

任意の桁数の数値を取得したいのでしょうか。

であれば、1つの方法として数値を文字列に変換した後、任意の位置の文字を取得、
再度、数値に戻すと言う方法があります。

投稿2015/05/28 00:21

a-kashiwagi

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/05/28 06:44

この発想はありませんでした!素晴らしいアイディアをありがとうございます!
guest

0

見にくかったので新しい回答でコード化しました。

概念的に書いて構文とか無視してるので間違い多いです。
この方法でやるならtry&errerは自分で。

ランダム数字生成

lang

1for(i=0;i<=1;i++){ 2 a[i]=任意の桁数-1 3 b=Math.random() 4 while(b>=Math.pow(10,a[i])){ 5 b=*10 6 } 7 figure[i] = Math.floor(b) 8} 9

みたいな感じで4桁ランダム数字がfigure[]に2個できます。
桁数をどう決めるのか分からないのでそこは自分でお願いします。

細分化

lang

1if(a[0]>=a[1]) 2 c=a[0]; 3else 4 c=a[1] 5▲桁数が高い方をcに代入 6d=c; 7for(i=0;i<=c;i++){ 8 left[i]=Math.floor(figure[0]/Math.pow(10,c))*Math.pow(10,d) 9 right[i]=Math.floor(figure[1]/Math.pow(10,c))*Math.pow(10,d) 10 ▲例1234なら1234/1000で1.234にして整数化して1000を掛けて1000にしているみたいな計算 11 d--; 12}

でleft[]に{1000,200,30,4}と入ってると思います。right[]も同様
この計算の利点は左右で桁が違う場合しっかり計算できるところです。
例1234+987の場合1234は1000になり987は1000で割ると0.987 なので0になり格納される。left[]={1000,200,30,4} right[]={0,900,80,7}となってるはず。

投稿2015/06/03 03:43

miso

総合スコア68

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miso

2015/06/03 03:50

投稿したあとに気づきます。 for(i=0;i<=c;i++){   left[i]=Math.floor(figure[0]/Math.pow(10,c))*Math.pow(10,d)   right[i]=Math.floor(figure[1]/Math.pow(10,c))*Math.pow(10,d)   figure[0]-=left[i]◀︎これ入れないとダメでした   figure[1]-=right[i]◀︎同上 d--; }
swordone

2015/06/03 05:09

わざわざコメントしなくとも,自分の回答はあとから編集できますよと言っておきます
miso

2015/06/03 05:38

なるほど!
guest

0

ランダム関数じゃダメなんですか
Math.random()
で0~1のランダムな数字になるんで欲しい桁数だけ10で乗算して小数点以下切れば終わると思いますよ。
例えば③なら99までなので
Math.floor(Math.random () * 100))
が0〜99までの数字になると思います(たぶん

投稿2015/06/02 19:54

miso

総合スコア68

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MAGP

2015/06/02 21:57

なるほど与えられたランダムな2つの値a, bを桁ごとに区切っていくのではなく、 はじめにa, bの桁数をランダムで決定して 桁毎にランダムな数値を生成していくという手も使えるかもしれませんね…考えつきませんでした ただ、③は十の位の計算なので0~9を十倍した数のどれかで99ということはないはずですよ コードは Math.floor(Math.random()*10) * 10; になると思います。
miso

2015/06/03 03:12

やっとやりたい事がわかりました。 あと勘違いでランダム関数は0.00010758025などという場合もあるので こんな感じでできると思う。 概念的に構文とか無視で書いているので、この方法でやるならtry&errerは自分で。 ランダム数字生成 for(i=0;i++;i=<1){ a[i]=任意の桁数-1 b=Math.random() while(b>=Math.pow(10,a[i])){ b=*10 } figure[i] = Math.floor(b) } みたいな感じで4桁ランダム数字がfigure[]に2個できます。 桁数をどう決めるのか分からないのでそこは自分でお願いします。 細分化 if(a[0]>=a[1]) c=a[0]; else c=a[1] ▲桁数が高い方をcに代入 d=c; for(i=0;i++;i<=c){ left[i]=Math.floor(figure[0]/Math.pow(10,c))*Math.pow(10,d) right[i]=Math.floor(figure[1]/Math.pow(10,c))*Math.pow(10,d) ▲例1234なら1234/1000で1.234にして整数化して1000を掛けて1000にしているみたいな計算 d--; } でleft[]に{1000,200,30,4}と入ってると思います。right[]も同様 この計算の利点は左右で桁が違う場合しっかり計算できるところです。 例1234+987の場合1234は1000になり987は1000で割ると0.987 なので0になり格納される。left[]={1000,200,30,4} right[]={0,900,80,7}となってるはず。
miso

2015/06/03 03:14

不等記号間違えてました。他もあるかもです。 for(i=0;i++;i=<1){ a[i]=任意の桁数-1 b=Math.random() while(b<=Math.pow(10,a[i])){ b=*10 } figure[i] = Math.floor(b) }
Cf_cwd

2015/06/03 19:52

細かいところですがiがグローバルですね
guest

0

javascriptの書き方がわからないので算術的な話だけします.
例えば100の位を取りたければ
a % 1000 - a % 100
で表せます.それぞれの桁数が必要なら,aが0より大きい整数として
log(10)a + 1 (log(10)aは10を底としたaの対数)
の整数部分を取れば得られます.

投稿2015/05/28 00:37

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/05/28 06:45

ありがとうございます!こんな方法があるんですね・・・知りませんでした!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問