问题1:
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……计算第n位的数字是多少;
分析:在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=1,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*),所以很明显的,我们可以用递归进行运算,简单方便,考虑一下,如果不用递归,用循环呢,当然也是可以的,可以使用for循环和while循环,不过我推荐是使用while循环,因为它可以只定义两个变量就可以,简单高效。
代码如下:
package test;
/**
*
* @author 二哈大叔
*
*/
public class Feibonaqie {
public void forXunHuan(int n){
int f1 = 1;
int f2 = 1;
int temp = 0;
for(int i = 3; i <= n; i++){
temp = f2;
f2 = f1 + f2;
f1 = temp;
System.out.println(f2);
}
System.out.println(f2);
}
public void whileXunHuan(int n){
int f1 = 1;
int f2 = 1;
while(n >= 3){
f2 += f1;
f1 = f2 - f1;
n--;
System.out.println(f2);
}
}
public int DiGui(int n){
if(n == 1 || n == 2)
return 1;
return DiGui(n-1) + DiGui(n-2);
}
public static void main(String[] args) {
Feibonaqie feibonaqie = new Feibonaqie();
System.out.println(feibonaqie.DiGui(15));
}
}
问题2:
输入一行字符串,判断字符串中字母、数字、空格、其他字符的个数
分析:把字符串分解为字符数组,逐个判断
代码:
package test;
import java.util.Scanner;
public class AnalyticCharacter {
public static void main(String[] args) {
int letterNumbers = 0;
int numberNumbers = 0;
int spaceNumbers = 0;
int othersNumber = 0;
char[] ch = null;
System.out.println("请输入一段字符串:");
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
ch = input.toCharArray();
for(int i = 0; i < ch.length; i++) {
if(ch[i] >= '0' && ch[i] <= '9')
numberNumbers++;
if(ch[i] >= 'a' && ch[i] <= 'z' || ch[i] >= 'A' && ch[i] <= 'Z')
letterNumbers++;
if(ch[i] == ' ')
spaceNumbers++;
}
othersNumber = ch.length - numberNumbers - letterNumbers - spaceNumbers;
System.out.println("数字的个数:"+numberNumbers);
System.out.println("字母的个数:"+letterNumbers);
System.out.println("空格的个数:"+spaceNumbers);
System.out.println("其他的个数:"+othersNumber);
}
}
问题3:
一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
没什么好分析的,直接代码:
package test;
/**
*
* @author 二哈大叔
*
*/
public class BallRebound {
public static void main(String[] args) {
double sum = 0;
double hight = 100;
for (int i = 1; i <= 10; i++) {
hight = hight / 2 ;
sum += hight * 3;
System.out.println("第"+i+"次反弹高度是:"+hight+" 共经过"+sum+"米");
}
}
}
问题4:
输入两个正整数num1,num2,计算这两个正整数的最大公约数和最小公倍数。
分析:可以利用辗转相除法计算,前提是正整数,所以不存在0,用较大数对较小数取余运算,如果余数不为0,则将较小数作为下一轮的较大数,将余数作为下一轮的较小数,继续计算,下面我使用递归实现的
代码:
package test;
import java.util.Scanner;
/**
*
* @author 二哈大叔
*
*/
public class DivisorAndMutiple {
public int getDivisor(int x,int y){
int divisor = 1;
int num1 = x > y?x:y; //把较大的数赋值给num1,较小的数赋值给num2
int num2 = x <= y?x:y;
if(num1 % num2 == 0){ //如果num1能被num2整除,则num2为最大公约数
divisor = num2;
}
if(num1 % num2 != 0){ //利用辗转相除法求解,使用递归计算
divisor = num2;
num2 = num1 % num2;
num1 = divisor;
return getDivisor(num1,num2);
}
return divisor;
}
public static void main(String[] args) {
DivisorAndMutiple andMutiple = new DivisorAndMutiple();
System.out.println("请输入第一个正整数:");
Scanner scanner = new Scanner(System.in);
int num1 = scanner.nextInt();
System.out.println("请输入第二个正整数:");
Scanner scanner2 = new Scanner(System.in);
int num2 = scanner2.nextInt();
int divisor = andMutiple.getDivisor(num1,num2);
System.out.println("最大公约数"+divisor);
System.out.println("最小公倍数"+num1*num2/divisor);
}
}
问题5:
输入一个正整数number,将其因式分解为质因数,例如:90=2*3*3*5
分析:
(1)首先要分解为质因数,先找到一个最小的质数k,即为2;
(2)如果number是1,则提示没有质因数;如果number=k,则输出k;
(3)如果number>k 且number能被k整除,打印k,并把number除以k的商作为下一轮的number,调到步骤(1)
(4)如果number > k 且number不能被k整除,则k++,跳到步骤(1)
代码:
package test;
import java.util.Scanner;
/**
*
* @author 二哈大叔
*
*/
public class Factorization {
private int k = 2;
public void fenjie(int number){
if(number == 1)
System.out.println("不能被分解为质因数");
if(number == k)
System.out.print(k);
if(number > k && number % k == 0){
number = number / k;
System.out.print(k+"*");
fenjie(number);
}
if(number > k && number % k != 0){
k++;
fenjie(number);
}
}
public static void main(String[] args) {
Factorization factorization = new Factorization();
System.out.println("请输入一个正整数:");
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
System.out.print(num+"=");
factorization.fenjie(num);
}
}
问题6:
有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和
分析:观察分子和分母的变化规律,分子是前一个分数的分子分母的和,分母是前一个分数的分子
代码:
package test;
/**
*
* @author 二哈大叔
*
*/
public class FractionCalculation {
public void calculateFraction(int n){
int molecue = 2;
int denominator = 1;
double sum = 2;
int temp = 0;
for(int i = 1; i < n; i++){
temp = molecue;
molecue = molecue + denominator;
denominator = temp;
sum += (double)molecue/denominator;
System.out.println(molecue+"/"+denominator);
}
System.out.println(sum);
}
public static void main(String[] args) {
FractionCalculation calculation = new FractionCalculation();
calculation.calculateFraction(6);
}
}
问题7:
求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制
分析:第一种办法:定义一个变量b开始等于a的值,然后下一个数是b*10+a,结果为aa
第二种办法:定义变量b=0,然后下一个数计算为b=a+b,a = a* 10;则下一个数同样为aa
代码:
package test;
/**
*
* @author 二哈大叔
*
*/
public class IterativeAdd {
public void add(int a,int numbers){
int sum = 0;
int b = a;
for (int i = 0; i < numbers; i++){
sum += b;
b = b * 10 + a;
System.out.println("b="+b);
}
System.out.println("sum="+sum);
}
public void add2(int a,int numbers){
int sum = 0;
int b = 0;
int i = 0;
while(i < numbers){
b = a + b;
sum += b;
a = a * 10;
i++;
}
System.out.println(sum);
}
public static void main(String[] args) {
IterativeAdd add = new IterativeAdd();
add.add2(1, 5);
}
}
问题8:
判断1-200之间有多少个素数,并输出所有素数。
分析:方法一:用一个数除以2到sqrt(这个数),如果可以被整除,则这个数不是素数,反之,则为素数
方法二:可以用米勒拉宾素数测试的方法来求解,不过这个我明白过程但是没能用代码实现,参考请见http://www.cnblogs.com/skyivben/archive/2010/07/10/1775001.html
代码:
package test;
/**
*
* @author 二哈大叔
*
*/
public class JudgePrime {
public void Xunhuan(int n){
int result = 0;
for(int i = 2; i*i <= n; i ++){
if(n % i == 0){
result ++;
break;
}
}
if(result > 0)
System.out.println(n+"不是素数");
else
System.out.println(n);
}
public static void main(String[] args) {
JudgePrime judgePrime = new JudgePrime();
for (int i = 1; i < 200; i++) {
judgePrime.Xunhuan(i);
}
}
}
问题9:
利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示这个也没什么好分析的,直接代码:
package test;
/**
*
* @author 二哈大叔
*
*/
import java.util.Scanner;
public class JudgeScore {
public int grade(int score){
return score >= 90? 1 :
score >= 60? 2 : 3;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int score = scanner.nextInt();
JudgeScore judgeScore = new JudgeScore();
int grade = judgeScore.grade(score);
if(grade == 1)
System.out.println("A");
if(grade == 2)
System.out.println("B");
if(grade == 3)
System.out.println("C");
}
}
问题10:
猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下 的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少
分析:可以逆向思考一下,问题就迎刃而解
代码:
package test;
/**
*
* @author 二哈大叔
*
*/
public class MonkeyEatPeaches {
public void getPeaches(){
int sum = 1;
for (int i = 1; i < 10; i++) {
sum = (sum+1) * 2;
}
System.out.println("第一天摘的桃子数量是:"+sum);
}
public static void main(String[] args) {
MonkeyEatPeaches eatPeaches = new MonkeyEatPeaches();
eatPeaches.getPeaches();
}
}
问题11:
打印一个99乘法表
代码:
package test;
/**
*
* @author 二哈大叔
*
*/
public class MultiplicationTable {
public static void main(String[] args) {
for (int i = 1; i < 10; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(i+"*"+j+"="+i*j+" ");
}
System.out.println();
}
}
}
问题12:
打印出所有的”水仙花数(narcissus number)”,所谓”水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个”水仙花数”,因为153=1的三次方+5的三次方+3的三次方。
分析:取出个位,十位,百位的数,进行立方相加运算与原来的数相比较,相等则为水仙花数,其实这个也可以用多线程来实现
代码:
package test;
/**
*
* @author 二哈大叔
*
*/
public class NarcissisticNumber extends Thread {
private int start;
private int end;
public NarcissisticNumber(int start,int end){
this.start= start;
this.end = end;
}
public void run(){ //用多线程来实现
int a,b,c;
for (int i = start; i < end; i+=2) {
a = i / 100;
b = (i % 100) / 10;
c = i % 10;
try {
sleep(1);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
if (a*a*a+b*b*b+c*c*c == i) {
System.out.println(i);
}
}
}
public void function(int m){ //普通实现
int bit,ten,hundreds = 0;
hundreds = m / 100;
ten = (m % 100) / 10;
bit = m % 10;
if(hundreds * hundreds * hundreds + ten * ten * ten + bit * bit * bit == m)
System.out.println(m);
}
public static void main(String[] args) {
NarcissisticNumber narcissisticNumber1 = new NarcissisticNumber(101,1000);
NarcissisticNumber narcissisticNumber2 = new NarcissisticNumber(102,1000);
narcissisticNumber1.start();
narcissisticNumber2.start();
try {
narcissisticNumber1.join();
narcissisticNumber2.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/* for (int i = 100; i < 1000; i++) {
narcissisticNumber.function(i);
}*/
}
}
问题13:
有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
分析:
组成所有的排列然后去掉有重复的,采用三层for循环嵌套,但是这样的复杂度就多了,可是我还没想到比较好的办法
代码:
package test;
/**
*
* @author 二哈大叔
*
*/
public class NumberArray {
public void ArrayNumber(){
int hundred[] = {1,2,3,4};
int tens[] = {1,2,3,4};
int bit[] = {1,2,3,4};
int count = 0;
for (int i = 0; i < hundred.length; i++) {
for (int j = 0; j < tens.length; j++) {
for (int j2 = 0; j2 < bit.length; j2++) {
if(hundred[i] != tens[j] && hundred[i] != bit[j2] && tens[j] != bit[j2]){
count ++;
System.out.print(hundred[i]);
System.out.print(tens[j]);
System.out.println(bit[j2]);
}
}
}
}
System.out.println("共有"+count+"个数");
}
public static void main(String[] args) {
NumberArray array = new NumberArray();
array.ArrayNumber();
}
}
问题14:
输入三个整数x,y,z,请把这三个数由小到大输出。
分析:
把最小值赋值给x,x和y比,x和z比,然后y和z比,小的给y
代码:
package test;
/**
*
* @author 二哈大叔
*
*/
public class NumberSort {
public void sortNum(int x, int y, int z){
if(x > y){
x = x ^ y;
y = y ^ x;
x = y ^ x;
}
if(x > z){
x = x ^ z;
z = z ^ x;
x = z ^ x;
}
if(y > z){
y = y ^ z;
z = z ^ y;
y = z ^ y;
}
System.out.println(x+" "+y+" "+z);
}
public static void main(String[] args) {
NumberSort numberSort = new NumberSort();
numberSort.sortNum(9,8,7);
}
}
问题15:
一个数如果恰好等于它的因子之和,这个数就称为 “完数 “。例如6=1+2+3.编程 找出1000以内的所有完数。
分析:
找出该数的所有因子,相加,与该数比较判断
代码:
package test;
/**
*
* @author 二哈大叔
*
*/
public class PerfectNumbers {
public void findPerfectNumber(){
for (int i = 1; i <= 1000; i++) {
int sum = 0;
for (int j = 1; j <= i/2; j++) {
if(i % j == 0){
sum += j;
}
}
if(i == sum){
System.out.println(i);
}
}
}
public static void main(String[] args) {
PerfectNumbers numbers = new PerfectNumbers();
numbers.findPerfectNumber();
}
}
问题16:
打印空心菱形和实心菱形,输入奇数行打印
分析:
实心菱形:可以分为两部分,上面正三角是一部分,下面倒三角是一部分,下面的倒三角行数比上面三角行数少1,所以给出了总行数n,上面的行数为(n+1)/2,下面的行数为(n+1)/2-1,然后每一行都是由空格和组成,空格直接循环就好,的个数为2n-1,下面的倒三角同理
空心菱形:也可以分为上下两部分,只是把输*变成了输出空格,大同小异
代码:
package test;
import java.util.Scanner;
/**
*
* @author 二哈大叔
*
*/
public class PrintDiamond {
public void printShiXin(int n){
n = (n + 1)/2;
for (int i = 1; i <= n; i++) {
for(int x = i; x < n; x++){
System.out.print(" ");
}
for(int y = 0; y < 2*i-1; y++){
System.out.print("*");
}
System.out.println();
}
for(int i = n-1; i > 0; i--){
for(int x = i; x < n; x++){
System.out.print(" ");
}
for(int y=0; y < 2*i-1; y++){
System.out.print("*");
}
System.out.println();
}
}
public void printKongXin(int n){
n = (n + 1)/2;
for(int i=1; i <= n; i++){
for(int x=i; x < n; x++){
System.out.print(" ");
}
System.out.print("*");
for(int y=1; y <= 2*i-3; y++){
System.out.print(" ");
}
if(i != 1)
System.out.print("*");
System.out.println();
}
for(int i = n-1; i > 0; i--){
for(int x=i; x < n; x++){
System.out.print(" ");
}
System.out.print("*");
for(int y=1; y <= 2*i-3; y++){
System.out.print(" ");
}
if(i != 1)
System.out.print("*");
System.out.println();
}
}
public static void main(String[] args) {
PrintDiamond diamond = new PrintDiamond();
System.out.println("请输入菱形的总行数(只能输入奇数行):");
Scanner scanner = new Scanner(System.in);
int lineNumber = scanner.nextInt();
diamond.printShiXin(lineNumber);
System.out.println();
diamond.printKongXin(lineNumber);
}
}
问题17:
企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
代码:
package test;
/**
*
* @author 二哈大叔
*
*/
import java.util.Scanner;
public class ProfitCalculation {
public void money(double profit){
double sum = 0;
if(profit <= 10)
sum = profit * 0.1;
if(profit > 10 && profit <= 20)
sum = (profit-10) * 0.075 + 10 * 0.1;
if(profit > 20 && profit <= 40)
sum = (profit - 20) * 0.05 + 20 * 0.075 + 10 * 0.1;
if(profit > 40 && profit <= 60)
sum = (profit - 40) * 0.03 + 40 * 0.05 + 20 * 0.075 + 10 * 0.1;
if(profit > 60 && profit <= 100)
sum = (profit - 60) * 0.015 + 60 * 0.03 + 40 * 0.05 + 20 * 0.075 + 10 * 0.1;
if(profit > 100)
sum = (profit - 100) * 0.01 + 100 * 0.015 + 60 * 0.03 + 40 * 0.05 + 20 * 0.075 + 10 * 0.1;
System.out.println("总奖金是:"+sum+"万");
}
public static void main(String[] args) {
System.out.println("请输入总利润");
Scanner scanner = new Scanner(System.in);
double profit = scanner.nextDouble();
ProfitCalculation calculation = new ProfitCalculation();
calculation.money(profit);
}
}
问题18:
一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
分析:
在10万以内进行循环判断,加上100再开方对1取余和加上268再开方对1取余,如果余数都为0,则输出这个数
代码:
package test;
/**
*
* @author 二哈大叔
*
*/
public class SqrtNumber {
public void calculatorNumber(){
for (long i = 1; i < 1000000; i++) {
if(Math.sqrt(i+100) % 1 == 0 && Math.sqrt(i+268) % 1 == 0)
System.out.println("这个数是:"+i);
}
}
public static void main(String[] args) {
SqrtNumber number = new SqrtNumber();
number.calculatorNumber();
}
}
问题19:
两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
分析:
这道题出的太不好了,直接就可以写出答案,还要算什么了,应该可以给几个限制条件,让我们列出可能的结果比较好,直接代码吧,其实代码还可以更简单,但是就没法写了,还是让它循环两次吧。。。
代码:
package test;
/**
*
* @author 二哈大叔
*
*/
public class TableTennisMatch {
public void findOpponent(){
char i,j,k;//i是a的对手,j是b的对手,k是c的对手
for(i = 'x';i <= 'z';i++){
for(j = 'x';j <= 'z'; j++){
if(i != j){
for(k = 'x'; k <= 'z'; k++){
if(i != 'x' && k != 'x' && k != 'z' && i != k && j != k){
System.out.println("a的对手是:"+i+" b的对手是:"+j+" c的对手是"+k);
}
}
}
}
}
}
public void findOpponentByOther(){
char i,j,k;//i是a的对手,j是b的对手,k是c的对手
for(i = 'y';i <= 'z'; i++){
for(j = 'x'; j <= 'z'; j++){
if(i != j){
k = 'y';
if(i != k && j != k){
System.out.println("a的对手是:"+i+" b的对手是:"+j+" c的对手是"+k);
}
}
}
}
}
public static void main(String[] args) {
TableTennisMatch match = new TableTennisMatch();
match.findOpponentByOther();
}
}
问题20:
输入某年某月某日,判断这一天是这一年的第几天?
分析:
闰年2月29天,平年2月28天,然后计算
代码:
package test;
/**
*
* @author 二哈大叔
*
*/
import java.util.Scanner;
public class YearMonthDay {
public void getDay(int year,int month,int day){
int days = 0;
int sum = 0;
if(year <= 0 || month <= 0 || month > 12 || day <= 0 || day > 31){
System.out.println("请输入正确的日期!");
System.exit(0);
}
if(month == 4 || month == 6 || month == 9 || month == 11){
if(day <= 0 || day > 30){
System.out.println("请输入正确的日期!");
System.exit(0);
}
}
if(year % 4 == 0 && month == 2){
if(day <= 0 || day > 29){
System.out.println("请输入正确的日期!");
System.exit(0);
}
}
if(year % 4 != 0 && month == 2){
if(day <= 0 || day > 28){
System.out.println("请输入正确的日期!");
System.exit(0);
}
}
for (int i = 1; i < month; i++) {
switch (i) {
case 1:
days = 31;
sum += days;
break;
case 3:
days = 31;
sum += days;
break;
case 5:
days = 31;
sum += days;
break;
case 7:
days = 31;
sum += days;
break;
case 8:
days = 31;
sum += days;
break;
case 10:
days = 31;
sum += days;
break;
case 12:
days = 31;
sum += days;
break;
case 4:
days = 30;
sum += days;
break;
case 6:
days = 30;
sum += days;
break;
case 9:
days = 30;
sum += days;
break;
case 11:
days = 30;
sum += days;
break;
case 2:
if(year % 4 == 0)
days = 29;
if(year % 4 != 0)
days = 28;
sum += days;
break;
default:
break;
}
}
sum += day;
System.out.println(year+"年"+month+"月"+day+"日是这一年的第"+sum+"天");
}
public static void main(String[] args) {
YearMonthDay yearMonthDay = new YearMonthDay();
System.out.println("请输入年份");
Scanner scanner = new Scanner(System.in);
int year = scanner.nextInt();
System.out.println("请输入月份");
Scanner scanner1 = new Scanner(System.in);
int month = scanner1.nextInt();
System.out.println("请输入日期");
Scanner scanner2 = new Scanner(System.in);
int day = scanner2.nextInt();
yearMonthDay.getDay(year, month, day);
}
}
好了,这一篇就到这里了,其余的再写一篇里面写,如果大家对以上的算法有更好的办法,更低的复杂度,或者我写的有什么错误,还请说出来,不胜感激,交流就是进步嘛,一码一世界。