题意:

斐波拉契数列的另外一个变型,如果F(n)能被3整除,则输出yes,否则输出no。(n<1000000)

解题思路:

看到(n<1000000)这个条件,有点感觉递归量有点大,因此要将递归转为循环~不过有没更巧妙地做法呢,暂且不知。

递归java代码实现:(结果当然是Time Limit Exceeded)

import java.util.*;

import java.io.*;

public class Main{

    public static void main(String[] arg){
Scanner scan = new Scanner(new BufferedInputStream(System.in));
while(scan.hasNextInt()){
int n =scan.nextInt();
if(check(n)){
System.out.println("yes");
continue;
}
System.out.println("no");
} scan.close(); } static boolean check(int n){//检测F(n)能不能整除3
int result = getResult(n);
return result%3==0;
} static int getResult(int n){
if(n==0){
return 7;
}
if(n==1){
return 11;
}
return getResult(n-1) + getResult(n-2);
} }

于是我立刻就把递归改为了循环:(结果竟然是Wrong Answer),可能是数字越界了 吧,或者算法有错,或者其他原因~

    /*
* 循环实现
* */
static int getResult2(int n){
int result = 0;
if(n==0){
return result += 7;
}
if(n==1){
return result += 11;
}
int preNum1 =7;
int preNum2 =11;
int len = n + 1;
for(int i = 2 ; i != len ; i ++){
int temp = preNum2;
preNum2 = preNum1 + preNum2;
preNum1 = temp;
result = preNum2;
}
return result;
}

在找错误的过程中,想到是被3整除,因此这道题的巧妙解法就诞生了。只需要求出前两个数的取余结果相加就行了。

另外一点,往往这种函数都是有周期性的:观察得取余结果的周期为8(1 2 0 2 2 1 0 1)

不得不惊叹数学的巧妙,哈哈哈

结果当然Accepted

import java.util.*;

import java.io.*;

public class Main{

    public static void main(String[] arg){
Scanner scan = new Scanner(new BufferedInputStream(System.in));
while(scan.hasNextInt()){
int n =scan.nextInt();
if(resultArray[n%8]==0){
System.out.println("yes");
continue;
}
System.out.println("no");
}
scan.close();
} static int[] resultArray = createResultArray(); /*
* 观察得取余结果周期为8
* 因此生产取余结果周期表(0-2序列)
* */
static int[] createResultArray(){
int[] resultArray = new int[8];
for(int i = 0 ; i != 8 ; i ++ ){
resultArray[i] = getResult(i);
}
return resultArray;
} /*
* 由于该题的特殊环境,能不能被3整除
* 因此只需要求出前两个数的取余结果相加就行了
* */
static int getResult(int n){
int result = 0;
if(n==0){
return result += 7%3;
}
if(n==1){
return result += 11%3;
}
int preNum1 =7%3;
int preNum2 =11%3;
int len = n + 1;
for(int i = 2 ; i != len ; i ++){
int temp = preNum2%3;
preNum2 = (preNum1 + preNum2)%3;
preNum1 = temp;
result = preNum2;
}
return result;
} }

HDOJ-ACM1021(JAVA)的更多相关文章

  1. hdoj 1753 (Java)

    刚刚开始用Java,代码难免不够简洁. import java.math.BigDecimal; import java.util.Scanner; public class Main { publi ...

  2. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  3. HDOJ/HDU 2203 亲和串(简单的判断~Java的indexOf()方法秒)

    Problem Description 人随着岁数的增长是越大越聪明还是越大越笨,这是一个值得全世界科学家思考的问题,同样的问题Eddy也一直在思考,因为他在很小的时候就知道亲和串如何判断了,但是发现 ...

  4. HDOJ(HDU) 2192 MagicBuilding(用Java的Map做了下)

    Problem Description As the increase of population, the living space for people is becoming smaller a ...

  5. HDOJ(HDU) 2133 What day is it(认识下Java的Calendar类---日期类)

    Problem Description Today is Saturday, 17th Nov,2007. Now, if i tell you a date, can you tell me wha ...

  6. hdoj 1753 大明A+B 高精度/java

    大明A+B Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  7. hdoj 1002 A + B Problem II 高精度 java

    A + B Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  8. HDOJ 1009. Fat Mouse' Trade 贪心 结构体排序

    FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  9. HDOJ 2317. Nasty Hacks 模拟水题

    Nasty Hacks Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  10. HDOJ 1326. Box of Bricks 纯水题

    Box of Bricks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

随机推荐

  1. Lucas定理的理解与应用

    Lucas定理:用于计算组合数模除素数后的值,其实就是把(n,m)分别表示为p进制,累乘各位的可能取的个数,得到最终的结果: 推论:(n & m) == m则C(n,m)为奇数:即C(n,m) ...

  2. WebService 学习总结

    一.概念 Web Web应用程序 Web服务( Web Serivce), SOAP, WSDL, UDDI .Net 框架 ASP.net IIS C#, 代理(委托) 二.实践 1.创建WebSe ...

  3. Class.forName()的作用与使用总结(转载)

    转载自:Class.forName()的作用与使用总结 1.Class类简介: Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识.这项信息纪录了每个对象所属的类.虚拟机 ...

  4. SDC(5)–FPGA系统级同步输入的约束

    此时计算最大/最小输入延时时,是不应该考虑FPGA本身的tSU/tH的,因为数据进来之后不一定马上送到DFF. 例如: 此时约束如下:

  5. 对于shell脚本参数获取时的一点小技巧

    问题如下: 根据脚本参数的个数$#进行一个循环,在依次输出每个参数$1 $2 $3...... 我有一个循环变量i $i 取到这时的i为1,我想使用这个1再去调用$1,也是就是打印出第一个参数 就是$ ...

  6. Angular2经典文章集锦

    Angular Metadata 等基础知识 http://www.jianshu.com/p/aeb11061b82c Metadata告诉Angular如何处理一个类,只有我们将它通告给Angul ...

  7. LINUX Shell 下求两个文件交集和差集的办法

    http://blog.csdn.net/autofei/article/details/6579320 假设两个文件FILE1和FILE2用集合A和B表示,FILE1内容如下: a b c e d ...

  8. ZOJ 3490 String Successor

    点我看题目 题意 : 给你一个字符串,让你按照给定规则进行处理. 如果字符串里有字母或者是数字就忽略非字符数字,如果没有,就让最右边的那个字符+1. 增量都是从最右边的字母或者数字开始的. 增加一个数 ...

  9. PHP basename() 函数

    定义和用法 basename() 函数返回路径中的文件名部分. 语法 basename(path,suffix) 参数 描述 path 必需.规定要检查的路径. suffix 可选.规定文件扩展名.如 ...

  10. [Gauss]HDOJ3976 Electric resistance

    题意: 一看图就明白了 要求的是1与n端点间的等效电阻 重点在于转化成考虑电流 根据KCL定理:在任一瞬间流出(流入)该节点的所有电流的代数和恒为零 U = IR 可以令1点的电势为零 那么n点的电势 ...