• ベストアンサー

計算式(関数)を教えてください

No1~No401のデータがあります。それを用紙1枚に4つずつ順番に印刷します。当然1枚目にはNo1~No4、2枚目にはNo5~No8のデータが印刷されます。そして101枚目にはNo401のデータが印刷されます。この101枚の用紙を重ねて4つに切り分けます。ところがそうすると切れた紙はNo1,No5,No9・・・と重なっており、順番通りに並べるには1枚ずつ拾っていくしかありません。そこで元のデータをある関数式を使って並べかえて、切り分けたときに上からNo1,No2,No3・・・と重なっているようにしたいのです。データの件数が変わっても応用が利くような関数式はないでしょうか。

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

  • ベストアンサー
  • tomtak
  • ベストアンサー率34% (153/440)
回答No.5

データがNまであったとして、任意の整数nを変換する関数をf(n)とします。  x = (n-1) mod 4 (n-1を4で割った余り、という意味です)  y = (n-1-x)/4  X = N mod 4  Y = (N-X)/4 とおくと、求める関数は、 f(n) = 1+y+Y*x+x  (x<Xのとき),     1+y+Y*x (x≧Xのとき)     ではないでしょうか? 例として、N=23, n=11の場合を考えて見ます。 x = 2,y = 2,X = 3,Y = 5,となるので  f(11)=1+2+2*5+2=15 です。実際、 1, 2, 3, 4    1, 7,13,19 5, 6, 7, 8    2, 8,14,20 9,10,11,12 →  3, 9,15,21 13,14,15,16    4,10,16,22 17,18,19,20    5,11,17,23 21,22,23     6,12,18 なので11→15になっています。 どうでしょう?

その他の回答 (4)

  • stomachman
  • ベストアンサー率57% (1014/1775)
回答No.4

No.1の回答の補足では、 1,4,6,8 2,5,7,9 3 と並べていらっしゃる。つまり、全部重ねて短冊に切って、最後の紙の余白の分(0~3枚)を捨ててから、短冊の束4つを束ねる。 でもNo.1のご回答の通り 1,4,7,(10) 2,5,8,(11) 3,6,9,(12) と並べておいても手間はほぼ同じでしょう。全部重ねて短冊に切って、短冊の束4つを重ねてから、最後の少し(0~3枚)を捨てれば良い。ここで(10)~(12)は何でもよくて、たとえば空白にしておきます。(どうせ捨てちゃうのね。)ですから、No.1の回答がダメってことはないと思いますよ。 というわけで、まずはNo.1の方式を式で表してみましょう。 各ページにM項目印刷し、全部でNページ印刷するとします。だから、印刷する項目の個数は最小=M(N-1)+1、最大=MNであるけれども、余計な項目(空白など)を末尾に付け加えて丁度MN個にしておく。 さて、No.1の方式でj番目に印刷すべき項目が何番の項目であるかをp(j)とすると、 p(j)=floor((j-1)/M)+1+((j-1) mod M)N ここでfloor()は切り捨て関数、 a mod b はaをbで割った余りです。EXCEL風に書くなら =INT((j-1)/M)+MOD(j-1,M)*N+1 ってことです。 逆に、k番の項目を何番目に印刷すべきかをf(k)とすれば f(k)=floor((k-1)/M)+((k-1) mod N)M+1 EXCEL風に書くなら =INT((k-1)/N)+MOD(k-1,N)*M+1 です。 しかしやっぱり、No.1の補足でご要望の方式で並べたい、とするなら、どうすりゃいいか。 全部でM(N-1)+J項目(1≦J≦M)を印刷するとします。つまり、1枚の紙にM項目づつ、全部でN枚の紙に印刷するが、最後の紙に印刷する項目の個数はJ。で、k番目の項目を何番目に印刷すれば良いかをg(k)とすると、 g(k)=f(k+max(0,floor((k-JN-1)/(N-1)))) ここに、max(a,b)はa,bのうちの大きい方。f()はNo.1の方式で出てきた関数です。 EXCEL風に書くなら =INT((MAX(0,INT((k-J*N-1)/(N-1)))-1)/N)+MOD(MAX(0,INT((k-J*N-1)/(N-1)))-1,N)*M+1 となりますね。

  • kony0
  • ベストアンサー率36% (175/474)
回答No.3

#1の補足を踏まえて・・・ 1~Nまでのデータがあるとしましょう。(問題例だとN=401) Q=[N/4](N/4を超えない最大の整数), R=N-4Qとします。(N=401だと、Q=100, R=1) ○i枚目(i=1,2,...,Q)のk番目(k=0,1,2,3)は i+k*Q+min{R,k} ○R≠0のときだけQ+1枚目が存在し、そのk番目(k=0,1,...,R-1)は、(k+1)(Q+1) これでどう?

回答No.2

直接のお答えになっていません。ごめんなさい。 1.No1~No401のデータは,No.1~No.400までで区切って,No.401のデータだけ別扱いしてください。また,もしNo.402までとかのときも,最後の2件は別扱いしてください。(用途の記述から見て,これでも実用にはなんとか間に合うかも・・・) 2.するとデータの個数Nは4で割り切れる数になります。 N=n*4(N=400のとき n=100)です。 3.No.1~No.Nのデータそれぞれの番号を X=a*n+i(a=0,1,2,3 i=1,2,・・・,n) と表します。 (例えば  a=0,i=1ならば X=0*n+1=1  a=2,i=3ならば X=2*n+3=203 ) ( a=int((X-1)/n) i=mod(X-1,n)+1 ) 4.このとき,   y=a+4*iー3  という式(一応関数です)にあてはめて,第X番目のデータ(No.Xのデータです)に 値yを割り当てます。 5.このyの昇順に整列すれば,とりあえず目的の並びになります。 401個,402個など(4で割って)余りが出る個数の場合にも対応する一般式は出せませんでした。m(__)m  

  • okinawan
  • ベストアンサー率21% (3/14)
回答No.1

ちょっと考えてみました。 データに対して4で割ってみます、キレイに割り切れない場合は+1繰り上げます。 その値をnとしましょう。 すると一枚目は、NO1、NO1+n、NO1+2n、NO1+3n。二枚目はNO2、NO2+n、NO2+2n、NO2+3n。・・・ってな感じでやるといいのではないでしょうか?

jajamen
質問者

補足

さっそくのご返答ありがとうございます。 説明不足ですみません。もっと単純に考えると 全部で9件のデータがあったとすると 1,4,6,8 2,5,7,9 3 つまり、データの並べ替えのために 1→1 2→5 3→9 4→2 5→6 6→3 7→7 8→4 9→8 という変換をさせる関数であればいいのです。そうするとokinawanさんのやり方ではうまくいかないことになってしまうのです。

関連するQ&A