数学建模社区-数学中国

标题: POJ-1006问题 [打印本页]

作者: maybe_madio    时间: 2010-10-26 23:30
标题: POJ-1006问题
POJ-1006& r+ G6 s& E. _" y/ E; {. H
5 }- K3 ~# Z; X+ E) J- Z9 h
在本地VC6.0下测试,得出正确结果, 为什么提交后总是Wrong Answer
) A" W, R7 C& v# \: a1 s( M$ e
' i/ R& b8 J1 G' [# ^8 B0 D# M" ^现将代码贴出,请帮忙看看:' G! f( o& X( e5 d( ?
  1. #include <iostream>
    5 Q1 v5 v2 @; L$ [; i% N7 c
  2. using namespace std;
    ! R+ [  V6 K0 Z# c) m+ W- O
  3. #define PH      05 d1 D& ?7 B8 c- ~
  4. #define EM      1
    2 T/ ]: C7 R- u. u$ M! z
  5. #define IN      2( @4 g2 W) Y  s' A  }3 G
  6. int get_Top(int days, int kind);8 N! f) F# _0 P$ F
  7. int triple(int ptop, int etop, int itop, int cur);, l$ d0 e2 y4 K+ p1 e% X
  8. bool is_Integer(float n);" A7 F4 S8 _# z6 c: H
  9. int main(): z  L* P3 [# N0 x8 T
  10. {
    % z* s% y" k$ g$ C& e9 q, o
  11. int ptop,  etop,  itop;
    - r" c# X- ~& {* x" |7 o, y0 v
  12. int pdays, edays, idays, curdays;  z7 d8 Z  a3 r/ n
  13. int count =0;5 u1 ~4 l: w: R5 I4 H- Z/ ]
  14. 7 V+ \3 n7 ]7 q7 l% ?" |
  15. while(cin >> pdays >> edays >> idays >> curdays)1 y' v0 R4 o0 J8 {2 S$ D; v. D
  16. {' w: F* K) }# y6 _& f' E% W
  17.   if(pdays==edays&&pdays==idays&&pdays==curdays&&pdays==-1)0 B  Z1 {  l( X: `
  18.    break;
    ' a" ^& C) ?/ r+ f
  19.   count++;& |. K) {  F0 a# a! x8 t0 q
  20.   ptop = get_Top(pdays,PH);
    7 A, _0 L) Z) l+ f4 V! `$ `
  21.      etop = get_Top(edays,EM);
    ! Q+ o5 O$ p2 s* P" Q, y
  22.      itop = get_Top(idays,IN);
    2 Y' u% p$ R. q: m
  23.   cout<<"Case "<<count<<": "<<"the next triple peak occurs in "<<triple(ptop, etop, itop, curdays)<<" days.";' t% g/ K, u5 Y* a9 b
  24. }, u, l) }6 u4 t7 {" \/ }- B6 t! Y
  25. $ g: g3 r" I3 y; h& ]6 {" W4 Y
  26. return 0;# P9 r/ W" ]# h% Z" P, f* t
  27. }
    + F" i: l7 a( U/ z& b- Q% B* t) {4 A
  28. int get_Top(int days, int kind): M' F# `8 ]- ~5 y% f
  29. {
    & ^! e/ M; l: k2 J; w
  30. switch(kind)
    & r: X" ^- x! B/ ^* D) T
  31. {* r) \+ b0 F8 W$ l  o
  32. case 0:0 {2 ?& h1 [/ T4 W3 S
  33.   return days%23;
    : P: n2 S0 y7 S% Z9 Y: d2 |+ s
  34. case 1:
    . `7 Q* |' l6 ?, S  T
  35.   return days%28;1 E  X" s4 L3 H* O0 w* k
  36. case 2:
    % q& ?- ?; P. r& w4 w2 x' m
  37.   return days%33;1 u- s1 k$ m9 n7 i) M6 @! ?
  38. }3 k7 p' S2 [$ O3 k% ~( [$ c  ?
  39. return 0;" X) D3 M0 [$ t* ~
  40. }; R: \7 }- d5 G
  41. & j3 G9 |& l) I& u0 m! g
  42. int triple(int ptop, int etop, int itop, int cur)/ O+ v1 W# Q- E" S# G0 G: o: i5 N2 |
  43. {) L6 l( Z7 r8 X: Y8 P! }8 z. g
  44. float x, y, z;
    5 p2 t( a. F" J5 `7 F. H( N
  45. int m1   = etop-ptop-5,
    8 {' ~5 o9 C- v) w
  46.   m2   = itop-etop-5;
    & J4 n! s3 {. ?' ]9 X9 N- U9 G  s
  47. int temp = 0;
    % z3 t. l6 `  b
  48. for(z=2;  (itop+(z-1)*33) <= 21252;  z++); f5 x5 \$ w5 W+ Z* F' q
  49. {+ D4 Y/ G# a  d! `/ R% g# @
  50.   temp = m2 + 33*z;
    3 s! J( G- U* I" @. {; C
  51.   y = (float)temp/28;
    1 \- u" F" G) @) Q* M
  52.   x = (float)(m1+temp)/23;
    2 M& M& K3 ]* R2 g: Z
  53.   if(x>0 && y>0 && is_Integer(x) && is_Integer(y))4 Q$ Y, ], v; C1 K; @* {
  54.    return itop + (z-1)*33 -cur;6 K% w; w6 x+ F6 Q
  55. }$ M% f7 _6 u- l! Y* D% z
  56. return 0;
    % f5 E& Y  X- W# l4 z( H
  57. }$ w2 I$ ?# `1 |# g. {
  58. 9 F; N+ L/ p  U% F6 i$ v
  59. bool is_Integer(float n)
    $ R7 g; |/ \) q' s
  60. {
    ' \8 N5 z5 m- w8 T, {
  61. if( (int)n - n ==0)
    , W0 J2 e, J# d/ [6 I% h* \* m* o/ y
  62.   return true;: B* }# F8 L9 W" @9 W
  63. else$ l6 D: ]6 L1 K
  64.   return false;6 u% q1 M; o. z  D( w" y3 R, Q
  65. }
    ! H  Y. ~' J1 Z. X9 [0 M4 a

  66.   Z3 b& v2 n8 _: B% \. U
复制代码
3 Y; X! E- e. Y1 @( _$ S

作者: ultra1989    时间: 2010-10-27 08:45
本帖最后由 ultra1989 于 2010-10-27 08:54 编辑
8 J9 K+ B" G3 c3 l7 m  \& Q
9 f, k) A2 o9 n2 n0 {* \& L, q用float可能会有精度问题用中国剩余定理求解
1 H8 x. m+ E. [  _6 O3 f参考程序:. a8 D) k6 k, C$ U

. S" L% j$ G7 \+ m#include<stdio.h>
0 p2 d6 z- D; E  m" w( Sint main(){
0 v2 O. p/ W* n( J5 @9 \/ i/ h. K   int a,b,c,m,n,i,d=1;
& `& v# @5 i7 l6 T0 V   while(scanf("%d%d%d%d",&a,&b,&c,&m)){; ]8 l! M7 D$ x, D

! g3 p/ G' D* k/ d5 ]if(a==-1&&b==-1&&c==-1&&m==-1) break;1 b1 h# `$ ]) N7 Z
* I+ m, P1 Z( Z
n=0;
8 F- B3 i3 H: d! j# ?+ s$ b: e/ N# b0 Y" J( x
i=(5544*a+14421*b+1288*c-m+21252)%21252;. g7 h4 {9 O* E

( Z. j3 h5 s4 ^3 W& ?# iif(!i)+ e, M1 ?4 `8 J0 G( y, S' v- R3 W
2 K; o" w: _6 M! m% U! r2 k
i=21252;
, X) a) O* L0 u% P
& w' A) P/ F+ Zprintf("Case %d: the next triple peak occurs in %d days.\n",d++,i);
/ m: L9 o0 Z; ]$ b- W# c* M6 g3 \7 r
   }/ o/ O- Y) S! O
0 G/ n& W& W0 ^4 j& b* \. e( {
return 0;9 \: r$ N/ R6 U* P! u
}
! O$ }$ T3 i& B0 l
: T3 w! T) [7 g) x
作者: qbist    时间: 2010-10-27 13:20

作者: 小草远在天涯    时间: 2010-10-27 17:27
好复杂啊,我是初级的。。。路过。。。
作者: maybe_madio    时间: 2010-10-27 22:23
回复 ultra1989 的帖子
. H# b: p- a' n( _1 h/ r
6 a7 b& d3 C# L9 K1 J! _8 w6 k5 e* x) T& D% M9 W  L: j! v
    确实这道题使用剩余定理解效率太高了! 哈哈! 学习了!  我还没有看过数论方面的书! 以后肯定要看看
: A/ }' f, x; C1 t: r8 ]+ `. R& W# C  n+ q
两个程序一对比,一下就体现出数学的强大力量! 0 `" P% g* a( b

作者: 39133120    时间: 2010-10-28 23:11
好复杂啊,得仔细
作者: 鸿光满面    时间: 2011-2-4 13:40
好复杂啊         




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5