• ベストアンサー

範囲指定の重複を除いた数の算出方法

100件の印刷データがあり、 ページ範囲を指定し印刷し、 ページ範囲のFromとToはデータベースに保存します。 このFromとToを元にすでに印刷済みの件数が 何件あるか算出する計算式はあるでしょうか? 1 - 50 1回目の印刷 30 - 50 2回目の印刷 60 - 100 3回目の印刷 の例の場合、90件印刷済みと表示させたいです。 よろしくお願いします。

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

  • ベストアンサー
  • pancho
  • ベストアンサー率35% (302/848)
回答No.3

ソート機能が使えるなら、3つの変数を確保するだけで計算できますよ。 ----------------------------------------- 用意する変数:[開始ページ:WSP][終了ページ:WEP][印刷済み件数:WCT] ----------------------------------------- 0)3つの変数を初期化する。(0ですね) 1)印刷範囲を開始ページ・終了ページ順にソートする。  (解り易いように、それぞれspとepと名付けておきます.) 2)印刷した範囲を読み込む。  (1回目なら、1-50 ですね。印刷範囲が無くなったら終了) 3)WEPとspを比較する。  ここで場合分けが必要です。 3a)WEP >= sp ならば、印刷範囲が重なっていることになるので、WEP に ep を代入する。 (連続した印刷範囲の最大を求めています。) 3b)WEP < sp ならば、(WEP-WSP+1)をWCTにプラスする。  WSP WEP に sp ep を代入する。 (印刷されていない場所が現れたことになるので、そこまでの印刷範囲を変数に格納する。)  どちらの場合でも2に戻る。 ----------------------------------------- この手順でできるはずですが、注意点が2点あります。 ・ソート対象が1項目のみのときは開始ページ順として、3a)でWEPとepの大きいほうをWEPに格納し直す。 ・3b)で初回のみWSPとWSPがともに0であるのに無意味な1ページをカウントしてしまうので、この補正を行う。 以上。

matchori
質問者

お礼

回答ありがとうございます。やはり方法はあったのですね。ただ注意点は、なんとなく理解できたのですが、 WCTが90にする方法は難しくてわかりませんでした。 1 - 50 1回目の印刷 30 - 50 2回目の印刷 60 - 100 3回目の印刷 の例だと、 一回目のループで、3b) WCTが+(0-0+1)=+1 二回目のループで、3a)を通る 三回目のループで、3b) WCTを+(50-1+1)=+50 四回目は、2)で終了 WCTが51になってしまいます。

その他の回答 (3)

  • pancho
  • ベストアンサー率35% (302/848)
回答No.4

#3の者です。 実際のデータを使って補足します。 初期値: WSP=0 WEP=0 WCT=0 1回目のループ: sp=1 ep=50 ---> WSP=1 WEP=50 WCT=1 2回目のループ: sp=30 ep=50 ---> WSP=1 WEP=50 WCT=1 3回目のループ: sp=60 ep=100 ---> WSP=60 WEP=100 WCT=1+(50-1+1)=51 終了処理: ・WSP=60 WEP=100 ---> WCT =51+(100-60+1)=92 ・「-1」の補正をして印刷済みは「91件(ページ)」 --------------------------------------------- 終了時に「最後に印刷した範囲を加える」処理、つまり3b)の処理が必要でしたね。 質問に例示された印刷範囲は、1~100件の内51~59件目のみ印刷されていないので、91件が正解です。 (60~100件目の印刷では、41件が印刷されていますよね。) 以上。

matchori
質問者

お礼

理解できました。すごいです。これは何か他の時にも使えそうなロジックです。数学は奥深いですね。

  • gimmick
  • ベストアンサー率49% (134/270)
回答No.2

>ただ、数十万という場合もあるので配列を作るとメモリーをかなり消費してしまうかなと思います。 メモリ消費量を抑えたいという事でしたら、チェックする範囲を分割すれば良いかと思います。例えば、1~10000ページの印刷済みページ数をチェックし、次に10001~20000ページの印刷済みページ数を...と調べていき、最後に合計を計算します。残念ながら、これ以上の方法は私には思いつきそうにありません。 #メモリ消費量は私も少し気になったのですが、仮に1バイト×100万ページで1MB、最小だと1ビット×100万ページで128KB、これ位ならまあいいかなと思って投稿しました。

matchori
質問者

お礼

メモリ消費量を抑える方法。ならびに、メモリ消費量まで計算していただき感謝します。128kなら充分許容範囲と思います(^^)ありがとうございました。

  • gimmick
  • ベストアンサー率49% (134/270)
回答No.1

プログラムを組むという前提で回答します。計算式ではありませんが、 (1)要素数100の配列を用意して0で初期化 (2)1回目に印刷したページに対応する要素を1にする   (この例では1から50) (3)2回目に印刷したページに対応する要素を1にする (4)3回目に印刷したページに対応する要素を1にする (5)配列の中で1となっている要素の数を数える のようにすると印刷済みページ数が求まります。

matchori
質問者

お礼

回答ありがとうございます。そうですね。私もこれは思いつきました。ただ、数十万という場合もあるので配列を作るとメモリーをかなり消費してしまうかなと思います。

関連するQ&A