题目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. 16.XML语法、CDATA、约束(DTD、Schema)讲解

    xml主要用来描述数据,比如配置文件,网络之间传输数据等,并且在android中也经常用xml来布局,,接下来便来学习xml常用的东西 1.XML语法 xml语法分为: 1.1 文档声明 必须位于文档 ...

  2. Oracle数据库之SQLPLUS

    三.SQLPLUS ​ SQLPlus 是 Oracle 数据库提供的一个专门用于数据库管理的交互式工具,使用 SQLPlus 可以管理 Oracle 数据库的所有任务,SQLPlus 通过命令的方式 ...

  3. wps10.1中将txt转为excel

    1.将想要保存的内容保存为txt格式,用分隔符分隔好(包括空格.制表符.英文的逗号以及分号四种). 2.打开wps 3.点击数据->导入数据,选择刚才的txt文件 4.一步步操作,即可.

  4. Apache JMeter HTTPS(S) Test Script Recorder

    参考Apache官网资料:http://jmeter.apache.org/usermanual/jmeter_proxy_step_by_step.pdf 1. 进入apache-jmeter-2. ...

  5. SPOJ - VFMUL - Very Fast Multiplication FFT加速高精度乘法

    SPOJ - VFMUL:https://vjudge.net/problem/SPOJ-VFMUL 这是一道FFT求高精度的模板题. 参考:https://www.cnblogs.com/Rabbi ...

  6. HDU2222Keywords Search AC_自动机

    http://blog.csdn.net/niushuai666/article/details/7002823 #include <iostream> #include <cstd ...

  7. 详解RMQ-ST算法 ST模板

    RMQ问题是求解区间最值的问题. 这里分析的是ST算法,它可以对所有要处理的数据做到O(nlogn)的预处理,对每个区间查询做到O(1)查询 ST算法本质是一个DP的过程 这里通过举一个求最大值实例来 ...

  8. essential C++中的一些疑问记录

    关于书中P87下列代码中,less<int>的使用,我目前的理解是 less<int> 是一个类型,& it 是对外部参数的引用.但是为何要加上引用,另外 调用该函数时 ...

  9. 基于SpringBoot从零构建博客网站 - 开发文章详情页面

    文章详情页面是博客系统中最为重要的页面,登录用户与游客都可以浏览文章详情页面,只不过只有登录用户才能进行其它的一些操作,比如评论.点赞和收藏等等. 本次的开发任务只是将文章详情页面展示出来,至于一些收 ...

  10. AoE:如何管理好模型?

    作者:丁超 前言 越来越多的业务会用到AI相关的技术,大多数的AI模型是部署在云端使用的,毕竟服务端计算更快,管理也更容易.随着终端设备性能提升,在终端使用 AI 模型有了更大的价值,可以更好满足业务 ...