PKU ACM-1006题 java Biorhythms

从现在开始写报告吧!不能只贴代码了。这题是典型的中国剩余定理(孙子定理)题。具体(百度搜索下~)根据题意其实就是一个数被23整除余数是Lp=p % 23(p被23整除的余数),被28整除余数是Le=e % 28((e被28整除的余数),被33整除余数是Li=i % 33(i被33整除的余数),求这个数的最小正整数。这里之说以要p % 23而不是直接p是因为题目中提示并不是第一次到达最佳状态。

做法:
首先算出能被23整除余1并且能被28和33同时整除的数,能被28整除余1并且能被23和33同时整除的数,能被33整除余1并且能被23和28同时整除的数。所以ei=28*33=924,pi=23*33=759,pe=23*28=644,i=23*28*33=21252;
所以如果924*n % 23==1的话那么这个924*n就应该是我们在上一步中所要求的第一个数,其他三个数同理,记作P,E,I;因为余数是p,e,i并不是1所以最后都应该乘上去,结果就是(P*p+E*e+I*i) % 21252。
最后要对算出来的日期和题目所给的d进行比较,如果相等直接输出21252,如果比给的日期大,那么输出还必须减去d。如果比结果小必须输出21252-(d-结果);下面是代码。
import java.util.Scanner; public class Main{ public static void main(String[] args)throws Exception{ Scanner cin=new Scanner(System.in); int m=1; while(cin.hasNext()){ int p=0,e=0,i=0,d=0,lp=1,le=1,li=1,finalNum=0; p=cin.nextInt() % 23; e=cin.nextInt() % 28; i=cin.nextInt() % 33; d=cin.nextInt(); if(p==-1||e==-1||i==-1||d==-1)break; while((924*lp) % 23!=1){ lp++; } while((759*le) % 28!=1){ le++; } while((644*li) % 33!=1){ li++; } finalNum=(924*lp*p+759*le*e+644*li*i) % 21252; System.out.println(finalNum); if(finalNum==d){ finalNum=21252; }else if(finalNum<d){ finalNum=21252-(d-finalNum); }else if(finalNum>d){ finalNum=finalNum-d; } System.out.println("Case "+m+": the next triple peak occurs in "+finalNum+" days."); m++; } } }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值