どんな数字(0、1,2,5はいりません)(主に素数)でも共通の考え方があれば、その方がいいのですが。
最も簡単なのは、プログラミングすることです。C言語でもJavaでもRubyでもOK!
余り = 対象数 % 17 ;
このコードはJavaであれば、そのまま(日本語のまま)使えます。
何にしても、この程度のプログラムは中学1年生でも理解できるでしょう。
①引けなくなるまで17を引いていく。
②17進数に変換して下1桁を余りとする。
(関数電卓を使う事を仮定してます)
③17の倍数表を作っておいて一番近い小さい倍数との差を計算する。
早速、回答いただきまして、ありがとうございます。
計算機(PC,電卓など)、そろばん、筆算、暗算での計算は禁止してませんからOKです。
でも、桁数が多いと大変ですね。
桁数が多い時(数十桁程度)の時も、考えていただけませんでしょうか。次の回答をお待ちしてます5回まで受け付けますので、どしどし案をお願いいたします)
1. 与えられた数をyとすると、y>17*10^nとなる最大の数を結果が正である範囲で引けるだけ引く。
2. 次に、その結果から、17*10^(n-1)を同様に結果が正である範囲で引けるだけ引く。
3. 同様にnを減らしていって、同様の操作を、17まで続けて、引けなくなったとき、それが求める余りとなる。
(例)365を17で割ったときの余りを割り算を使わずに求めてみる。画面が乱れるので"-"の代わりに"(-"を使いました。0で詰めてあるのも画面を見やすくするためです。
365
170(-
------
195
170(-
------
025
017(-
------
008
実際は、17の倍数表を作っておいて、次のようにする方がいいかも知れません。
17,34,51,68,85,102,136,153
365
340(-
------
025
017(-
------
008
ありがとうございました。
でも、桁数が多いと大変ですね。
桁数が多い時(数十桁程度)の時も、考えていただけませんでしょうか。次の回答をお待ちしてます5回まで受け付けますので、どしどし案をお願いいたします)
早速、回答いただきまして、ありがとうございます。
でも、桁数が多いと大変ですね。
桁数が多い時(数十桁程度)の時も、考えていただけませんでしょうか。次の回答をお待ちしてます5回まで受け付けますので、どしどし案をお願いいたします)
17の場合:102 = 17 x 6 を使うのがいいと思います。
例:927429199218750
1.最上位の桁を取り出す 例:9 と 27429199218750
2.最上位の桁をニ倍する 例:18 と 27429199218750
3.必要ならば残った数字の上二桁に17か34を足しておく (適用するなら 18 と 44_429199218750 などになる)
4.二桁下の部分から引いて新しい数字とする 例:27 - 18 と 429199218750 → 9429199218750
5.1~4を繰り返す 9429199218750 249199218750 45199218750 4399218750 319218750 13218750 3018750
128750 26750 6350 230 26
6.最後の二桁はがんばる 26 = 17 x 1 + 9
あるいは 10000 - 4 = 17 x 588 を使って、4倍して四桁下に足すを使ってもいいと思います。
13なら1001 = 77 x 13 を使い1倍して三桁下からひく
19なら100 - 5 = 19 x 5 を使い5倍してニ桁下に足す
とにかく10^nに近いところを探すことだと思います。
ありがとうございます。段々桁数の多い時にも使えそうな方法が出てきた様で、先は明るくなってきました。
各桁で先に割っておくというのでどうでしょう。
(100 = 17*5+15 だから 506/17 の余りは 15*5+6 = 81 だから余りは13とか。
10000 = 100 * 100 だから 15*15 = 225 は 2*15 + 25 = 55 と一緒で余り4
61235 なら 6*4+15*12+35 = 239 の余りと同じで 余り1)
・100の時点ですでに17の倍数になっていれば何倍しても17の倍数。
・数が増えると余りから17の倍数をもう一度切り取れる。
という二点を実際の物に例えたりして、説明できれば中学一年程度でも理解できると思います。
要するにやってることはmodを使った変形ですが。
私の狙いの方向の回答だろうと思います。
(目的をわざと伏せていましたが)つまり、少ない桁数の時は実際に割り算をしてもそんなに手間は掛からないだろうけど、何十桁もあるときの省力計算法を狙っていたわけです。
もうほかの方が答えてているかもしれませんが、
excelの関数を使うのは如何でしょうか。
=MOD(割られる数,割る数)で、
割る数に17を入れれば数字が出ます。
判定が難しいですね。PCを使うことは禁止しませんでしたが、MOD関数は他人がプログラミングしたものだと言うことで、除外したいのですが・・・。もっともMOD関数(剰余)の意味を理解して使用するのならば、そのやり方もOKとしなければなりませんが。今更ずるいのですが、あくまでも計算機は関数・他人作成のプログラミングの使用をしないと言うことにしたいのですが。
最も簡単なのは、プログラミングすることです。C言語でもJavaでもRubyでもOK!
余り = 対象数 % 17 ;
このコードはJavaであれば、そのまま(日本語のまま)使えます。
何にしても、この程度のプログラムは中学1年生でも理解できるでしょう。
本人がアルゴリズムを理解してプログラミングできればOKです。
1. まず、マジックナンバーを用意します。一度計算すると、後で何回でも利用可能。
これは、自分が計算しておいて、数字だけ天下り的に与えます。実は、Mod(10^n,17)。
1,10,15,14,4,6,9,5,16,7,2・・・
2. 1の位の数に1、10の位の数に10、100の位の数に15、1000の位の数に14、・・・をそれぞれ掛けて足します。(出た結果に何回か繰り返して使ってもよい。)
3. 出た結果を前回の方法を使って余りを求める。
(例)1234567890
1*7+2*16+3*5+4*9+5*6+6*4+7*14+8*15+9*10+0*1=452
もう一回使ってみる。
4*15+52=112
もう一回使ってみる。
1*15+12=27
後は前回の方法。
27
17(-
-----
10
原理的には上の方法ですが、面倒なら、3桁か4桁おきに計算してもいいです。
たとえば、3桁おきならば、マジックナンバーは、1,14,9,7・・・,4桁おきならば、マジックナンバーは、1,4,16・・・となります。
計算の原理は、「中国の剰余定理」です。
http://ja.wikipedia.org/wiki/%E4%B8%AD%E5%9B%BD%E3%81%AE%E5%89%B...
私の求めていた、回答だと思います、これの考えならば除数が何になろうと使えそうです。
マジックナンバーは、3、9ならば1,1,1,1,・・・ 7ならば3,2,3*2=6(≡-1),-1*3=-3(≡=4),-2,-6(≡=1)以下繰り返しと言う具合と考えてよろしいのですね。
ちなみに13ならば、1,10、9(≡-4),12(≡-1),-10,-9,4,1 以下繰り返し
19ならば1、10(≡-9)、5、5*10=50(≡-7or12),-7*10=-70(≡13or-6),13*10=130≡-7*5=-35(≡-3or16),-3*10=-30(≡11or-8),-3*5=-15(≡4or-15),4*5=20(≡-1or18),9or-10,7or-12,-13or6,3or-16,-11or8,-4or15,1以下繰り返し{()内は前の値のほうが計算が簡単 }となります。
3に似てますが、100011が17の倍数というのも使えます。
一番左の数字を消し、同じ数字を左から5番めと6番めから引く(繰り下がりも計算)
というのを全体が5桁になるまで繰り返せます。
5桁になったら、102かな?一番左の数字を消し、それを二倍した数を左から3番めから引く。10以上になる場合は2番めから10の位を引く。これで2桁まで。
何か、前に有ったyahooの質問(7で割れる数の求め方)に考えが似てますね。これならば桁数が多い時、3の場合より面倒になりませんか。
http://d.hatena.ne.jp/hiroyukikojima/20080831に「7の倍数」の判定法が書かれています。
結論からいうと、「十の位以上と一の位を切り離し、前者から後者の2倍を引く。この操作を繰り返して、2桁か1桁になって、それが7の倍数なら元の数も7の倍数」というものである。例えば、「343」を判定するなら、「34-3×2=28」が7の倍数だから元の「343」も7の倍数、ということになる。
このやり方が他の数にも応用できるということは
http://d.hatena.ne.jp/MarriageTheorem/20080831/1220183884
に書いてあるのですが、具体的な方法はありません。
それだと回答にならないので、方法を考えてみました。
17の場合は2倍でなく5倍を引くことで判定できます。
つまり
「十の位以上と一の位を切り離し、前者から後者の5倍を引く。この操作を繰り返して、2桁か1桁になって、それが17の倍数なら元の数も17の倍数」
ということです。
具体例をいくつか出せば、
374 なら 37-4*5=17 となるので17の倍数だということがわかります。
357 なら 35-7*5=0 で0になりますが、0も17で割って余り0だから17の倍数。
119 なら 11-9*5=-34 の-34は負の数ですが、これも17で割り切れるので17の倍数。
他の数、例えば11ならば、十の位以上と一の位を切り離し、前者から後者をそのまま引けば判定できます。
341 なら 34-1=33 なので11の倍数といった具合です。
19なら2倍して足すとか、わりと応用がききそうです。
紹介いただいた「7の倍数」の判定法についてはよく理解できません。
「つまり」から初めてしりました。下の部分は面白いと思います。除数と倍数(17-5)(11-1)(19-2)等の関係がわかれば応用性が有るとおもいます。
本人がアルゴリズムを理解してプログラミングできればOKです。