• ベストアンサー

私にはわからない関数のお礼

先週私にはわからない関数で、投稿させていただきました。 おかげさまで何とかお力をかりて、解決することができました。 syouzi08様、178tall様、paperchicken様、Mr.Holland様、本当にありがとうございました。再度お礼を申し上げたくて投稿いたしました。 アルゴリズムを考えるのは本当に難しいですね。数学の力がないと難しいアルゴリズムを考えるのは不可能みたいです。現在49以下で以下のようになるアルゴリズムを考えております。 9→5,4 10→5,5 11→6,5 12→6,6 13→7,6 14→7,7 15→8,7 16→8,8 17→6,6,5 18→6,6,6 19→7,6,6 20→7,7,6 21→7,7,7 22→8,7,7 23→8,8,7 24→8,8,8 25→7,6,6 26→7,7,6,6 27→7,7,7,6 28→7,7,7,7 29→8,7,7,7 30→8,8,7,7 31→8,8,8,7 32→8,8,8,8 33→7,7,7,6,6 34→7,7,7,7,6 35→7,7,7,7,7 36→8,7,7,7,7 37→8,8,7,7,7 38→8,8,8,7,7 39→8,8,8,8,7 40→8,8,8,8,8 41→7,7,7,7,7,6 42→7,7,7,7,7,7 43→8,7,7,7,7,7 44→8,8,7,7,7,7 45→8,8,8,7,7,7 46→8,8,8,8,7,7 47→8,8,8,8,8,7 48→8,8,8,8,8,8 49→7,7,7,7,7,7,7 49までの数字を8,7,6に上の規則で分けていったときの8、7、6の個数を求めるものです。18以下になると5も入ってくるので18以下では規則が崩れてしまって、無理なような気がしますが。 49以上の数字では、ご指導いただいたとおり、以下の式で求まられました。 A=(n-49)/8の商の整数部分 B=n/8のあまり 8の個数=A+B-1 7個の数=8-B 6が混ざってくるとどうなるか、お分かりになる方よろしくお願いいたします。

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

  • ベストアンサー
  • Mr_Holland
  • ベストアンサー率56% (890/1576)
回答No.8

 #6です。  お礼をありがとうございます。  前回のn≧49のケースで検証してみました。 http://oshiete1.goo.ne.jp/qa3113291.html  n≧74のケースでは具体的な数字が掲載されていませんでしたので、前回の#8さん(syouji_08さん)のアルゴリズムでn~1000ぐらいまで作って比較してみたところ、すべて一致していました。(理屈は・・・、もう頭がついていっていないので、説明不能ですが。)  n~1000程度まででよろしければ、#6の式をそのまま拡張して使ってください。  頭が沸騰するぅ

ityounomi
質問者

お礼

ありがとうございます。一週間前まではselect case の分でcase 5,case 6,case 7・・・・case 100と延々とcaseを使って振り分けていました。終いには、VBAさんからお叱りをうけました。「プログラムが大きすぎます!」と。途中から受け付けなくなって、書き足すことができなくなりました。本当に笑い話です。あとは何とか自力でがんばります。VBA立ち上げながら、インターネット見るとPC壊れるんでしょうかね。今日、いきなりハードディスクが壊れてしまいました。初めてです。今までかかって、もう一台のパソコンで書き直ししておりました。あと2時間がんばります。おやすみなさい。お世話になりました。

その他の回答 (8)

noname#47975
noname#47975
回答No.9

#6です。 #8さんへ…。 わざわざ、私のアルゴリズムと比較検証をして頂いて感謝しています。 この結果、#8さんと私の観点は一致している証拠であり、ともにその推測が正しければ、両手法とも有効ですね..。n≧74以降もこの規則に従うのであれば..。 ただ、私のアルゴリズムでは、8の倍数には対応出来ないので、 プログラムの条件分岐を使う必要があります。 ですが、厳密に関数式で表現する場合は、#8さんは全範囲でカバーしているので、私の方の負けです..。w どちらも試してみては如何でしょうか? 質問者さんへ 興味本意でお聞きします。 お答えして頂ければ幸いです。なぜ、このようなアルゴリズムを必要と しているのでしょうか? プライベートに係わるのであれば、お答えはしなくて結構です..。

ityounomi
質問者

お礼

ご教授ありがとうございます。このアルゴリズムについてですが、今行っている仕事でどうしてもクリアーしなくてはならない壁なんです。もちろん私はプログラマーではありませんので、プログラマーの方々にはたぶん簡単なアルゴリズムだとは思うのですが。私は死ぬ思い出試行錯誤。そのあげく、、、今日の4時にいきなりパソコンのハードディスクが壊れてしまいました。私の脳みそと同じ!いきなりです!VBA立ち上げながら、こちらのコーナーを見ていてもう一度VBAの画面にしたら、ん?ん?・・・パソコンの中からいやな音が!カラカラ、カラカラと!そのまま、あとは何もできず。デルのサポートに電話して、F12を3回押してといわれ、結局、「ハードディスクが壊れてます!」との回答。先週苦労して作ったものが、おじゃんになりました。幸いPC2台あったので、もう一度最初から。今までかかってなんとか先週のアルゴリズムの部分を書き直しました。もうかれこれ15時間格闘しております。脳みそもPCも限界です。ありがとうございました。でも、買って2年になるPCなのですが、HD保障してくれるそうです。2ヶ月前にはディスプレイの中がショートしてそれも、新しいのに交換してくれました。良いのやら悪いのやら。すみません。お礼でなく、おしゃべりしてしまいました。ありがとうございました。

noname#47975
noname#47975
回答No.7

#3です。 いい忘れましたが、先日ご質問されたn > 49のケースでも#3のアルゴリズム は、8の倍数以外で適用可能である事は確認済みです。

  • Mr_Holland
  • ベストアンサー率56% (890/1576)
回答No.6

 与えられた文字列は、次の規則に従っているものと思われます。 0a)文字列の文字数は、[(n+7)/8] 個。  (ただし、[x]はガウスの記号で、xより小さい整数を表す。) 0b)同じ文字数の群は、8個。 0c)群内の識別用として mod(-n,8) を使う。 1)文字列は8から4への降順。 2)8が並ぶ個数 N(8) は負でなければ次の値。負になる場合はN(8)=0   N(8)=[(n+7)/8]-mod(-n,8) 3)7が並ぶ個数 N(7) は負でなければ次の値。負になる場合はN(7)=0   N(7)=[(n+7)/8]-|[(n+7)/8]-mod(-n,8)|  (ただし、|x|は絶対値記号。) 4)6が並ぶ個数 N(6) は負でなければ次の値。負になる場合はN(6)=0   N(6)=[(n+7)/8]-|2*[(n+7)/8]-mod(-n,8)-N(8)| 5)5が並ぶ個数 N(5) は負でなければ次の値。負になる場合はN(5)=0   N(5)=[(n+7)/8]-|3*[(n+7)/8]-mod(-n,8)-N(8)-N(7)| 6)4が並ぶ個数 N(4) は負でなければ次の値。負になる場合はN(4)=0   N(4)=[(n+7)/8]-|4*[(n+7)/8]-mod(-n,8)-N(8)-N(7)-N(6)|  もっと詳しい規則もあったはずですが、この暑さで頭で意識が朦朧としていますのでご容赦下さい。(一応、エクセルで上記の規則が正しいことは確認しました。)  それと、うまく拡張すれば、n>49でも使えるかもしれませんが、それも今のところはご容赦下さい。(アツイ!)  念のため、エクセルで作った式を添えておきますので、良ければ参考にしてください。 (nの数) セルA2: (nの入力用) [(n+7)/8] セルB2: =INT((A2+7)/8) mod(-n,8) セルC2: =MOD(-A2,8)  N(8)  セルD2: =IF(B2-C2<0,0,B2-C2)  N(7)  セルE2: =IF(B2-ABS(B2-C2)<0,0,B2-ABS(B2-C2))  N(6)  セルF2: =IF(B2-ABS(2*B2-C2-D2)<0,0,B2-ABS(2*B2-C2-D2))  N(5)  セルG2: =IF(B2-ABS(3*B2-C2-D2-E2)<0,0,B2-ABS(3*B2-C2-D2-E2))  N(4)  セルH2: =IF(B2-ABS(4*B2-C2-D2-E2-F2)<0,0,B2-ABS(4*B2-C2-D2-E2-F2)) (文字列)セルI2: =REPT("8",D2)&REPT("7",E2)&REPT("6",F2)&REPT("5",G2)&REPT("4",H2)

ityounomi
質問者

お礼

ありがとうございます!!!もしかして大学の先生でいらっしゃいますか?普通の人では絶対できないですよね!暑い中本当にありがとうございます。私も上半身裸でやっておりました。 ありがとうございました!!!

noname#47975
noname#47975
回答No.5

何度もご丁寧にお礼を頂きまして大変嬉しく思います。 先ほどのアルゴリズムについて、プログラミングをして検証して 見た結果、8の倍数以外は、#3のアルゴリズムは有効である事を 確認致しました。 8の倍数以外は、8で割った商の数の分だけ8が並ぶという事で 宜しいのではないでしょうか。 また、#3の数列の規則についての箇条書きに若干不備があったので、 ご訂正します。 (3)数字の並びは、2値以下である × (3)数字の並びは、1値もしくは2値であり、 2値になるときはそれらの数字の差は1である。〇

ityounomi
質問者

お礼

ありがとうございます。これだけでも、十分対応できる感じです。 VBAで使っていますので、if で条件分岐していくことができると思います。先週から皆さん方に助けていただいてばっかりです。本当にありがとうございました。

noname#47975
noname#47975
回答No.4

#3です。すみません、Nが8の倍数の時は#3のアルゴリズムが当てはまらない ようですね..。 Nが8の倍数のときは、Nを8で割った商だけ8の数が並ぶ。 それ以外は、#3のアルゴリズムが適用できるかと思いますが、もうすこし 確認してみます。

ityounomi
質問者

お礼

ありがとうございます。一場面の式で無理な場合は、2つの場面に分けて式が2つになってどうにか対処できますので式が2つになってもかまいません。 式1・・・Aの場合 式2・・・Bの場合 私現在2つの場面で考えておりますが、それでもできません。

noname#47975
noname#47975
回答No.3

数列を見る限り、以下のような性質があるようです。 (1)並べた数の和はインデックスの和に等しい (2)先頭に並んでいる数字はできる限り大きく、かつ8よりも大きくならない (3)数字の並びは、2値以下である 以上により、アルゴリズムは以下のとおりになると予想されます。 (1)(N+8)を8で割った商をAとする。 (2){8A-N}をAで割った商をB、余りをCとする。 (3)前に(8-B)を(A-C)個だけ連続させて並べる (4)(3)で並べた後ろに、(7-B)をC個だけ連続させて並べる。

回答No.2

>49までの数字を8,7,6に上の規則で 上の規則ってのがどういうことかわからない。 つまりあらゆる数字を8、7、6の和であらわすってこと? 24だと 6,6,6,6 8,8,8 があるけど、こういうものは両方、書き出すの?それとも8(大きい数)が優先されるの?

ityounomi
質問者

お礼

ありがとうございます。24であれば8,8,8となります。 それから、25が7,6,6となっておりますが7,6,6,6の間違いでした。

  • Mr_Holland
  • ベストアンサー率56% (890/1576)
回答No.1

 わざわざのお礼をありがとうございます。 >25→7,6,6  これは、次の誤記ではありませんか?  25→7,6,6,6  だとしたら、9まで含めて規則性がありそうです。  49から遡っていくと考えやすそう。

ityounomi
質問者

お礼

ありがとうございます。ご指摘のとおり25→7,6,6,6の間違いです。 先週の式を参考にずっと考えておりますが・・・。頭の中が混乱しております。

関連するQ&A

  • エクセル関数の質問

    よろしくおねがいします。 以下のようなA列B列に数字が何行もあるのですが、 A列の数字(時間なのですが)を二つを別シートに記入すると A列の二つ分の期間を参照してB列の数字の合計や個数を計算したいのですが、 VLOOKでは期間分の値を計算できないので 何かいい方法はないでしょうか? A        B 1000      1 2000     -5 3000      8 4000      1 5000      3 6000      5 7000     -3 8000      2 9000      3 別シートにA列の数字を下記の例のよう二つに入力すると A列の期間を参照してB列の値を計算して B列に全合計 C列に+の合計 D列に-の合計 E列に+の個数 F列に-の個数 を表示させる。 <例1> A   B(全合計) C(+の合計) D(-の合計) E(+の個数) F(-の個数) 1000 5000  8        13        -5         4        1 <例2> A   B(全合計) C(+の合計) D(-の合計) E(+の個数) F(-の個数) 6000 9000  7        10        -3         3        1 のような感じで計算したいのですが わかりづらくてすいませんが、分かる方がいたらご教示お願います。

  • エクセルの関数を教えてください。

    A列に数字があって、B列に数字がないものの個数を数える数式を教えてください。ちなみにフィルターを掛けると、表示されたものだけの上記個数がわかる関数を教えて欲しいです。よろしくお願いします。

  • EXCEL関数の”COUNTIF”について教えてください

    セルA1~A10に1~10の数字を入力して、8以上の数字の個数を数えるには【=COUNTIF(A1:A10,">=8")】という関数を使えば、3個と出てきますよね。 例えば3以上~8以下の個数は何個かという式は出来るのでしょうか? 困ってます。教えてください。

  • ■エクセル■ PRODUCT関数で「~ではない」。

    早速ですが、例えば、 ・A1~A10の範囲に1~5が入っている。 ・B1~B10の範囲に文字列「あ」~「お」までが入っている。 ・C1~C10の範囲に個数が入っている(1~99の数字)。 この場合で、D1のセルに「A1~A10の数字が5で、「お」以外の個数の合計」を求めるときはどういった関数を使えばいいのでしょうか?? =SUMPRODUCT((A1:A10=5)*(B1:B10<>"お")*(C1:C10)) と、入力してもエラーが出てしまうので、困ってます。どうしたらできますか?? よろしくおねがいします。

  • 《エクセル2000》SUMPRODUCT関数、この式のどこがいけないのか…

    こんにちは。 A列が1であり、B列とC列に共に数字が入っている(空白でない)ものをカウントしたいと思い、以下の関数を書きました。 =SUMPRODUCT((A1:A50=1)*(B1:B50<>"")*(C1:C50<>"")) ですがこの式ですと、「B列とC列が共に空白なもの」の個数が返って来てしまいます。 「<>」が怪しい気がするのですが、具体的に何がいけないのでしょうか? また、欲しい数字を出すようにするにはどうすればいいのでしょうか。 よろしくお願いします…

  • エクセルの関数を教えてください

    色々やってみたのですがどうしてもうまくいかないので教えてください。 Aのセルが"山田太郎"で、かつBのセルに数字が入っている(時間)セルの個数の出し方 A,B列とも範囲は決まっていません。 よろしくおねがいします。

  • Excel 複数条件+”かつ”

    標題の通りです。 例えば、A1~A100に1~10までの数字が、B1~B100に11~20までの数字が、個数に関係なくランダムに入っているとします。 (1)A列の中で3以上7以下の個数を求めるには、COUNTIFで(7以下の個数)-(3以下の個数)で求めればいいですよね。(SUMPRODUCTを使う方法もあるみたいですが) (2)A=4 かつ B=15の個数を求めるにはSUMPRODUCTを使用すれば求まりますよね。 ここまでは、ネットで調べて理解しました。 ここからが本題です。 (1)と(2)を合体させて、A列の中で3以上7以下 かつ B列の中で11以上13以下の個数を求めるのにどうすればいいのかが分かりません。 A   B 1   12  4   11  4   17  5   13  6   20  3   14  答え:2個 てな具合で個数を求めたいのですが、色々と式を作ってみてもエラーになったりすべての値が0になったりで上手く行きません。 よろしくお願いします

  • エクセルの関数で算出したいものがあります。

    ・合計金額が493,520円 ・商品の種類は4種類 ・商品の個数は980個 ・4種類ある商品の単価の差は1~5円程度 ・980個のうち、何がいくつあるかの内訳は、4等分になるべく近い数字にする。 という条件です。 計算式がわからなかったので、電卓片手に、何度も計算したら、偶然いい数字が見つかりました。 合計金額493,520円 個数は980個 商品A の単価は502円、個数は202個 =101,404 商品B の単価は503円、個数は243個 =122,229 商品C の単価は505円、個数は247個 =124,735 商品D の単価は504円、個数は288個 =145,152 今回は、たまたま闇雲に電卓を打ったら、ぴったりな数字が出てきましたが、今後、随時数字を変えて出てくるそうです。 数字が変わる部分は、合計数字・個数です。商品が4種類あることと、単価の差が1~5円程度ということと、個数の内訳の差がなるべく4等分に近い数字だというのが条件です。 答え合わせは、計算のつじつまが合えばいいので、何種類かパターンが選べる場合もあるでしょうが、1つのパターンさえ出れば問題ありません。また確実な正解データがないので、手計算のつじつまが合えばOKです。 説明下手だと思いますが、規則がありそうで、なさそうなものですが、関数で数字が出るようなものは作れますか?教えて下さい。

  • 私にはできない関数です

    最近このコーナーに助けられております。今日朝からずっと取り組んできましたが、私にはできませんでした。数字を分けていく作業です。 数字は49~200までとします。本当は49以下での規則も見つけたいのですが、数字の条件が変わってますますめんどくさくなりそうなので、明らかに規則性が見える49以上でできるものなのかどうかを確認しようとおもっております。数字の区切り方は以下の通りです。 49→7777777(7ずつ7つに区切る) 50→8777777 51→8877777 52→8887777 53→8888777 52→8888877 53→8888887 54→8888888(8で一杯になったら次からは一つ欄を増やす) 55→87777777 56→88777777 57→88877777 58→88887777 59→88888777 60→88888877 61→88888887 62→88888888 63→877777777 64→887777777 65→888777777 66→888877777 67→888887777 68→888888777 69→888888877 70→888888887 71→888888888 このようにして数字を8で一杯になるまで区切っていくのですが、 任意の数字(n)は8が何個で7が何個かを求める式を知りたいのです。どなたか数学の得意な方、頭脳をお貸しください。

  • 場合の数

    4つの数字1,2,3,4だけからなるn桁の自然数の集合をUとする (1)1が現れないUの要素の個数を求めよ (2)1,2,3の3個の数字のどれもが少なくとも1個あらわれるUの要素の個数を求めよ (1)3^n (2)1が現れる集合、2が現れる集合,3が現れる集合をA、B、CとするとA∩B∩Cの個数をもとめるんですよね?やり方教えてください