题目1:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 
    1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....

分析:我分析发现其实头两个数不变,然后后面的数字等于前面两个数字相加,这是就这个题目直接可以看出的规律

//那么就存在一个解法pre2+pre1=pre;pre2=pre1;pre1=pre;
//通过不断计算前面的数据 产生新的数据
import java.util.Scanner; public class Test3A {
public static void main(String[] args) {
Scanner scanner =new Scanner(System.in);
int count=scanner.nextInt();
int pre=count;
int now=count;
System.out.printf("%d %d ",pre,now);
for(int i=;i<;i++){
int temp=count;
count=count+pre;
pre=temp;
System.out.printf("%d ",count);
}
}
}

或者一般性的算法,根据面向对象的思想,认为这是一个兔子类 ,有总数和新兔子数,然后不断的用 当前兔子数目=上个月兔子总数+新生兔子数;新生兔子数=上上月兔子数

import java.util.ArrayList;
import java.util.Scanner; public class Test3B {
static class hare{
int count;
int newhare;
}
public static void main(String[] args) {
Scanner scanner =new Scanner(System.in);
int n=scanner.nextInt();
fun(n);
}
private static void fun(int n) {
ArrayList<hare> arrayList =new ArrayList<hare>();
hare h0=new hare();
h0.count=n;
h0.newhare=;
hare h1=new hare();
h1.count=n;
h1.newhare=;
arrayList.add(h0);
arrayList.add(h1);
for(int i=;i<;i++){
hare h=new hare();
h.newhare=arrayList.get(i-).count;
h.count=arrayList.get(i-).count+h.newhare;
arrayList.add(h);
}
for(int i=;i<;i++){
System.out.printf("%d ",arrayList.get(i).count);
}
} }

题目2:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如: 
        153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。 
        1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位

//很常见的水仙花数
public class Test4A { public static void main(String[] args) {
for (int i = 100; i <= 999; i++) {
int[] A = new int[3];
A = test(i);
check(A, i);
}
} private static void check(int[] a, int i2) {
int sum = 0;
for (int i = 0; i < a.length; i++) {
int num = a[i];
sum = testA(num) + sum;
}
if (i2 == sum) {
System.out.println(i2);
}
} private static int testA(int num) {
int temp = 1;
for (int i = 0; i < 3; i++) {
temp = num * temp;
}
return temp;
} private static int[] test(int i) {
int[] A = new int[3];
int j = 0;
int temp = 0;
for (;;) {
if (i >= 10) {
temp = i % 10;
i = i / 10;
A[j++] = temp;
} else {
A[j] = i;
break;
}
}
return A;
}
}

题目3:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 
    程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: 
    (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。 
    (2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。 
    (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。

import java.util.Scanner;

public class Test6A {

    public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
comput(n);
} private static void comput(int n) {
int temp = 0;
for (int i = 2; i <= n; i++) {
if (n % i == 0) {
temp = i;
n = n / i;
break;
}
}
if (temp!=0&&n > 1) {
System.out.printf("%d*", temp);
} else {
System.out.printf("%d", temp);
}
if (n != 1) {
comput(n);
}
return;
} }

改进了一下 可以少算几次 提高一下效率

public class Test6A {

    public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
comput(n,2);
} private static void comput(int n, int j) {
int temp = 0;
for (int i = j; i <= n; i++) {
if (n % i == 0) {
temp = i;
n = n / i;
j=i;
break;
}
}
if (temp!=0&&n > 1) {
System.out.printf("%d*", temp);
} else {
System.out.printf("%d", temp);
}
if (n != 1) {
comput(n,j);
}
return;
} }

题目3:输入两个正整数m和n,求其最大公约数和最小公倍数。 
    1.程序分析:利用辗除法。

import java.util.Scanner;

public class Test8 {

    public static void main(String[] args) {
Scanner scanner =new Scanner(System.in);
int a=scanner.nextInt();
int b=scanner.nextInt();
int first=a;
int second=b;
int temp=0;
if(a<b){
temp=a;
a=b;
b=temp;
}
while(b!=0){
temp=a%b;
a=b;
b=temp;
}
System.out.println("最大公约数:"+a);
System.out.println("最大公倍数:"+first*second/a);
} }

题目4:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

import java.util.Scanner;

public class Test9 {

    public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String string = scanner.nextLine();
char[] arr = string.toCharArray();
int abcCount = 0;
int spaceCount = 0;
int numberCount = 0;
int otherCount = 0;
for (int i = 0; i < arr.length; i++) {
if (Character.isLetter(arr[i])) {
abcCount++;
} else if (Character.isDigit(arr[i])) {
numberCount++;
} else if (Character.isWhitespace(arr[i])) {
spaceCount++;
} else {
otherCount++;
}
}
System.out.println("字母数:" + abcCount);
System.out.println("空格数:" + spaceCount);
System.out.println("数字数:" + numberCount);
System.out.println("其他数:" + otherCount);
} }

题目5:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。

    1.程序分析:关键是计算出每一项的值。

import java.util.Scanner;

public class Test10 {

    public static void main(String[] args) {
Scanner scanner =new Scanner(System.in);
int s=scanner.nextInt();
int temp=0;
for(int i=1;i<10;i++){
int number=ManyNumber(i,0,1,0);
if(s==number){
System.out.println(i);
break;
}
} }
//当前这个数 ,上一次的数据 ,当前是第几个下标
private static int ManyNumber(int i, int sum, int index,int nownumber) { nownumber=i*Ten(index)+nownumber;
sum=sum+nownumber;
if(index==5){
return sum;
}
return ManyNumber(i, sum, index+1,nownumber); }
private static int Ten(int index) {
int temp=1;
for(int i=1;i<index;i++){
temp=temp*10;
}
if(index==1){
return 1;
}
return temp;
} }

题目6:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程 找出1000以内的所有完数。

import java.util.ArrayList;

public class Test11 {

    public static void main(String[] args) {
for(int i=1;i<100;i++){
ArrayList<Integer> arrayList=factor(i);
if(i==sum(arrayList)){
System.out.println(i);
}
}
} private static int sum(ArrayList<Integer> arrayList) {
int temp=0;
for(int i=0;i<arrayList.size();i++){
temp=temp+arrayList.get(i);
}
return temp;
} private static ArrayList<Integer> factor(int i) {
ArrayList<Integer> arrayList= new ArrayList<Integer>();
for (int j = 1; j < i; j++) {
if (i % j == 0 && i != j) {
arrayList.add(j);
}
}
return arrayList;
} }

题目7:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

分析:一次的路径=下落高度+反弹高度

public class Test12 {

    public static void main(String[] args) {
int count = ;
double height = ;
double line = ;
for (int i = ; i <= ; i++) {
count++;
line = height + height / + line;
height = height / ;
if (count == ) {
System.out.println("经过的线路长度:" + line);
System.out.println(height);
break;
}
} } }

题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 
    1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。

我首先弄出了全部的可重排列,然后使用去重的方式进行数组减员

import java.util.Stack;

//1,2,3,4能够组成多少个无重复的三位数
//说白了就是4个数 能够组成多少种三位数
//可以有重复
public class Test13 {
private static int count=0;
private static Stack<Integer> stack =new Stack<Integer>();
public static void main(String[] args) {
int[] A={1,2,3,4};
int k=3;
group(A,k);
System.out.println(count);
}
private static void group(int[] a, int k) {
if(k==1){
for(int i=0;i<a.length;i++){
stack.add(a[i]);
System.out.println(stack.toString());
count++;
stack.remove((Object)a[i]);
}
}else if(k>1){
for(int i=0;i<a.length;i++){
stack.add(a[i]);
group(a, k-1);
stack.remove((Object)a[i]);
}
}else{
return;
}
} }
public class Test13A {
private static int count=0;
private static Stack<Integer> stack =new Stack<Integer>();
public static void main(String[] args) {
int[] A={1,2,3,4};
int k=3;
group(A,k);
System.out.println(count);
}
private static void group(int[] a, int k) {
if(k==1){
for(int i=0;i<a.length;i++){
stack.add(a[i]);
System.out.println(stack.toString());
count++;
stack.remove((Object)a[i]);
}
}else if(k>1){
for(int i=0;i<a.length;i++){
stack.add(a[i]);
group(removeElement(a), k-1);
stack.remove((Object)a[i]);
}
}else{
return;
}
}
private static int[] removeElement(int[] a) {
Stack<Integer> temp=new Stack<Integer>();
for(int i=0;i<a.length;i++){
if(!stack.contains(a[i])){
temp.add(a[i]);
}
}
int[] B=new int[temp.size()];
for(int i=0;i<temp.size();i++){
B[i]=temp.get(i);
}
return B;
} }

这个地方弄的是组合哟 我最苦恼的是在递归调用过程中下标移动这是一个坎 越过了 就好了

import java.util.Stack;

//这个地方是弄的是组合
//重点注意传入值为i哟
public class Test13B {
private static int count = 0;
private static Stack<Integer> stack = new Stack<Integer>(); public static void main(String[] args) {
int[] A = { 1, 2, 3, 4 };
int k = 3;
group(A, 0, k);
System.out.println(count);
} private static void group(int[] a, int index, int k) {
if (k==1) {
for (int i = index; i < a.length; i++) {
stack.add(a[i]);
System.out.println(stack.toString());
count++;
stack.remove((Object) a[i]);
}
} else if (k>1) {
for (int i = index; i < a.length; i++) {
stack.add(a[i]);
group(a, i+1,k-1);
stack.remove((Object) a[i]);
}
} else {
return;
}
} }

java算法基础范例的更多相关文章

  1. Android开发之Java必备基础

    Android开发之Java必备基础 Java类型系统 Java语言基础数据类型有两种:对象和基本类型(Primitives).Java通过强制使用静态类型来确保类型安全,要求每个变量在使用之前必须先 ...

  2. JAVA算法系列 冒泡排序

    java算法系列之排序 手写冒泡 冒泡算是最基础的一个排序算法,简单的可以理解为,每一趟都拿i与i+1进行比较,两个for循环,时间复杂度为 O(n^2),同时本例与选择排序进行了比较,选择排序又叫直 ...

  3. JAVA面试基础

    JAVA相关基础知识1.面向对象的特征有哪些方面 ?1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂 ...

  4. 【重走Android之路】【Java面向对象基础(三)】面向对象思想

    [重走Android之路][基础篇(三)][Java面向对象基础]面向对象思想   1 面向对象的WWH   1.1 What--什么是面向对象         首先,要理解“对象”.在Thinkin ...

  5. Java之--Java语言基础组成—函数

    Java语言基础组成-函数 Java语言由8个模块构成,分别为:关键字.标识符(包名.类名.接口名.常量名.变量名等).注释.常量和变量.运算符.语句.函数.数组. 本片主要介绍Java中的函数,函数 ...

  6. Java之--Java语言基础组成(关键字、标识符、注释、常量和变量、运算符)

    Java语言基础组成-关键字.标识符.注释.常量和变量.运算符 Java语言由8个模块构成,分别为:1.关键字:2.标识符(包名.类名.接口名.常量名.变量名等):3.注释:4.常量和变量:5.运算符 ...

  7. Java 数组基础,java.util.Arrays

    定义数组 方式1(推荐,更能表明数组类型) 方式2(同C语言) 方式3定义时直接初始化 数组运用基础 数组长度 equals() 数组元素不为基本数据类型时 二维数组 二维数组基础 变长的二维数组 j ...

  8. Java入门——(1)Java编程基础

    Java入门--(1)Java编程基础 第二章 Java编程基础   JAVA 代码的基本格式: 修饰符 class 类名{ 程序代码 }   2.1关键字:赋予了特殊含义的单词.   2.2标识符: ...

  9. 【JAVA零基础入门系列】Day10 Java中的数组

    什么是数组?顾名思义,就是数据的组合,把一些相同类型的数放到一组里去. 那为什么要用数组呢?比如需要统计全班同学的成绩的时候,如果给班上50个同学的成绩信息都命名一个变量进行存储,显然不方便,而且在做 ...

随机推荐

  1. js中的数据类型,以及如何检测数据类型

    基本数据类型:string,number,boolean,null,undefined,symbol 引用数据类型:object(array,function...) 常用的检测数据类型的方法一般有以 ...

  2. Spring学习之旅(十三)--使用NoSQL数据库

    除了关系型数据库之外,现在还有一种 NoSQL 数据库非常流行,而 Spring 自然也没有放过对它的支持. NoSQL 数据库有很多种,如: MongoDBGenericJackson2JsonRe ...

  3. Javaweb简介

    Javaweb简介 一.什么是Javaweb? 在Sun的Java Servlet规范中,对Java Web应用作了这样定义:“Java Web应用由一组Servlet.HTML页.类.以及其它可以被 ...

  4. FFmpeg-截取视频图片

    FFmpeg-截取视频图片 标签(空格分隔): linux 安装FFmpeg 官网:http://www.ffmpeg.org/ 这里主要是linux环境下的安装 1. wget http://ffm ...

  5. 牛客多校第二场B discount 基环内向树

    题意: 有n种商品,每种商品有一个价格 p[i] . 每种商品都有2种打折方式: 1. 给你优惠 d[i] 元. 2. 免费送你第 f[i] 种饮料. 现在求每种饮料至少一瓶的最小花费. dp[i][ ...

  6. 杭电多校第二场 hdu 6315 Naive Operations 线段树变形

    Naive Operations Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 502768/502768 K (Java/Other ...

  7. Shell脚本分析服务器性能

    概述 我们原先在服务器上想分析性能指标,需要执行一系列的linux命令.对于linux命令不熟悉的人来说,比较困难 现在有一套集成的shell脚本,把常用的linux命令都包含在里面,一键式分析性能瓶 ...

  8. json_tuple()函数的应用

    直接举栗子说明用法吧: 下面是来自APP埋点脚本获取的一段JSON字符串:通过平台sqoop推数存放在cx_ods_safe.paczcb_paczdata_cz_policy_detail_info ...

  9. 通过原型继承理解ES6 extends 如何实现继承

    前言 第一次接触到 ES6 中的 class 和 extends 时,就听人说这两个关键字不过是语法糖而已.它们的本质还是 ES3 的构造函数,原型链那些东西,没有什么新鲜的,只要理解了原型链等这些概 ...

  10. .NET Core 微信小程序支付——(统一下单)

    最近公司研发了几个电商小程序,还有一个核心的电商直播,只要是电商一般都会涉及到交易信息,离不开支付系统,这里我们统一实现小程序的支付流程(与服务号实现步骤一样). 目录1.开通小程序的支付能力2.商户 ...