【程序1】
題目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一
对兔子,假如兔子都不死,问每个月的兔子总数为多少?
分析:由于题目存在生兔子的逻辑,所以在刚开始分析时,并没有直接分析数列的规律。而是通过把每个月的兔子数目分成:兔子总数vs可生育兔子数。通过这两列数据的每月变换的联系,分析出了A(n+1)=A(n)+A(n-1) 这样的规律。即是著名的斐波那契数列的一种,1,1,2,3,5,8,13,21....
分析出公式以后,感觉到了挫败感。明明一眼就看出的数列规律,我居然画图找了半天生兔子的逻辑。。但是又转念一想,虽然这样的思考方式很迂回,但是更符合这个数列被发现时的过程,而不是像高中时学习的那样,简单的看数字。至少,更加有趣。
代码:
斐波那契数列本来就表达了一种递归关系,因此可以用这种逻辑来完成编写。
public class demo01 {
public static void main (String args[]){
for (int month=1;month<8;month++){
Dser a = new Dser();
int sum = a.SumRabit(month);
System.out.println("第"+month+"个月: "+sum+"只兔子");
}
}
}
class Dser{
public int SumRabit(int month ){
if (month==1||month==2)
return 1;
else
return SumRabit (month-1)+SumRabit (month-2);
}
}
结果吻合。
思考:当month很大时,计算机递归的速度会相当慢,如何降低时间复杂度o(n)?
斐波那契数列资料:https://zh.wikipedia.org/wiki/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97
【程序2】
题目:判断101-200之间有多少个素数,并输出所有素数。
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,
则表明此数不是素数,反之是素数。
题目自带分析,逻辑清楚,只需要实现了。虽然这题的逻辑分析比第一题简单,但是编程稍微复杂一点。
public class demo01 {
public static void main (String args[]){
PrimNum a=new PrimNum();
int num=12;
a.Show(num);
}
}
class PrimNum{
int sum;
public boolean Compare(){
for(int i=2;i
结果吻合:
【程序3】
题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:
153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
public class demo01 {
public static void main (String args[]){
for(int i=100;i<1000;i++){
Shuixian a=new Shuixian(i);
a.Show();
}
}
}
class Shuixian{
int two,ge,shi,bai,num;
public Shuixian(int num){
this.num=num;
this.two = num/10 ;this.ge = num%10;
this.shi = two%10; this.bai = two/10;
}
public void Show(){
int a= (int)Math.pow(this.ge,3)+(int)Math.pow(this.shi,3)+(int)Math.pow(this.bai,3);
if(a==this.num)
System.out.println(this.num+"是水仙数");
}
}
【程序4】
题目:将一个正整数分解质因数。例如:输入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的值,重复执行第一步。
public class demo01 {
public static void main (String args[]){
int num = 90;
Fenjie a=new Fenjie(num);
System.out.print(num+"=");
a.Process();
}
}
class Fenjie{
int num;
public Fenjie(int num){
this.num=num;
}
public int Zhishu(){
for(int i=2;i
结果吻合。
【程序5】
题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下
的用C表示。
1.程序分析:(a>b)?a:b这是条件运算符的基本例子。
public class demo01 {
public static void main (String args[]){
Pinggu a=new Pinggu(97);
a.fenji();
}
}
class Pinggu{
int note;
char stu;
public Pinggu(int note){
this.note=note;
}
public void fenji(){
this.stu=(this.note>90)?'A':(this.note<60)?'C':'B';
System.out.println("分数是 "+this.note+" 等级是 "+this.stu);
}
}
结果吻合。
【程序6】
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
1.程序分析:利用辗除法。
public class demo01 {
public static void main (String args[]){
liangshuyunsuan a=new liangshuyunsuan(112,9);
a.gongyue();
a.gongbei();
}
}
class liangshuyunsuan{
int numo;
int numt;
int gongyin;
public liangshuyunsuan(int a,int b){
this.numo=(a>b?a:b);
this.numt=(a>b?b:a);
System.out.println("两数是:"+this.numo+" 和 "+this.numt);
}
public void gongyue(){
int a=this.numo;
int b=this.numt;
int r1=a%b;
while(r1!=0){
a=b;
b=r1;
r1=a%b;
}
System.out.println("最大公因数是:"+b);
this.gongyin= b;
}
public void gongbei(){
System.out.println("最大公倍数是:"+this.numo*this.numt/this.gongyin);
}
}
结果吻合。
【程序7】
题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
1.程序分析:利用while语句,条件为输入的字符不为'\n'.
public class demo01 {
public static void main (String args[]){
zifutongji a=new zifutongji("wozhidao我知道了 12345 &¥&%¥");
a.tongji();
a.show();
}
}
class zifutongji{
String input;
int chara,alph,spa,nub,oth=0;
zifutongji(String input)
{
this.input = input;
}
public void tongji()
{
for(int i=0;i
Java中文编码的办法(Unicode):
https://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/
【程序8】
题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),
几个数相加有键盘控制。
1.程序分析:关键是计算出每一项的值。
import java.util.Scanner;
public class demo01 {
public static void main (String args[]){
while(true)
{
Scanner sc = new Scanner(System.in);
System.out.println("请输入每位数: ");
int num = sc.nextInt();
System.out.println("请输入最大相加个数: ");
int fach = sc.nextInt();
addsame a=new addsame(num,fach);
a.adds();
System.out.println("和为: "+a.sum);
System.out.println("请问是否结束? y/n ");
String flag=sc.next();
if(flag.equals("y"))
break;
else if (flag.equals("n"))
continue;
else
System.out.println("输入错误,自动结束 ");
sc.close();
}
}
}
class addsame{
int gewei,num,fach=0;
int sum=0;
addsame(int num,int fach)
{
this.gewei=this.num =this.sum= num;
this.fach=fach;
}
public void adds()
{
for(int i=1;i
发现了两个问题:
1.java键盘输入的三种方法:System.in/System.out , BufferedReader,Scanner.
2.String,int ,char 三者相互转换。判断字符串相等的小语句 A.equals.(B)
【程序9】
题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程 找出1000以内的所有完
数。
public class demo01 {
public static void main (String args[]){
for(int i=1;i<=1000;i++)
{
int num = i;
WanshuPD a=new WanshuPD(num);
a. Zhishu();
}
}
}
class WanshuPD{
int num;
int sum=0;
WanshuPD(int num)
{
this.num=num;
}
public void Zhishu(){
for(int i=1;i
【程序10】
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多
少米?第10次反弹多高?
public class demo01 {
public static void main (String args[]){
float hig = 100;
int time=10;
BallFall a=new BallFall(hig,time);
a.sum();
System.out.println("第"+time+"次,球的高度是"+a.hig+"米");
System.out.println(" "+"球经过"+a.lang+"米");
}
}
class BallFall{
float hig;
int time;
double lang=0;
BallFall(float hig,int time)
{
this.hig=hig;
this.time=time;
}
private void Faall(){
this.lang=this.lang+1.5*this.hig;
this.hig=this.hig/(float)2;
}
public void sum()
{
for(int i=1;i<=this.time;i++)
{
this.Faall();
}
}
}
结果吻合。
【程序11】
题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。
public class demo01 {
public static void main (String args[]){
NummerSum a= new NummerSum();
a.NumSer();
}
}
class NummerSum{
private int sum=0;
public void NumSer()
{
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
for(int k=1;k<=4;k++)
{
if(i!=j&&j!=k&&i!=k)
{
sum++;
System.out.println(i+j*10+k*100);
}
}
}
}
System.out.println("各位不重复的三位数一共有"+sum+"个");
}
}
结果吻合。
【程序12】
题目:企业发放的奖金根据利润提成。利润(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,求应发放奖金总数?
1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。
import java.util.Scanner;
public class aufgabe12 {
private double bonus;
private double profit;
aufgabe12(double profit)
{
bonus=0;
this.profit=profit;
}
void kalku()
{
if(profit<=10)
bonus=profit*0.1;
else if(profit>10 && profit<=20)
bonus=1+(profit-10)*0.075;
else if(profit>20 && profit<=40)
bonus=1+0.75+(profit-20)*0.05;
else if(profit>40 && profit<=60)
bonus=1.75+1+(profit-40)*0.03;
else if(profit>60 && profit<=100)
bonus=2.75+0.6+(profit-60)*0.015;
else
bonus=3.35+0.6+(profit-100)*0.01;
}
double show_bonus()
{
return this.bonus;
}
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
System.out.println("please input the profit:");
double profit = sc.nextDouble();
sc.close();
aufgabe12 bonus=new aufgabe12(profit);
bonus.kalku();
System.out.println("the bonus is $"+bonus.show_bonus());
}
}
【程序13】
题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足
如下条件,即是结果。请看具体分析:
public class aufgabe13 {
private String unknown;
aufgabe13()
{
unknown="the numbers are:\n ";
}
void find()
{
for(int i=0;i<10000000;i++)
{
if(Math.sqrt(i+100)%1==0 && Math.sqrt(i+268)%1==0) //double 型模1,可取得其小数部分。
unknown=unknown+i+"\n";
else
continue;
}
}
void show()
{
System.out.println(unknown);
}
public static void main(String[] args)
{
aufgabe13 test=new aufgabe13();
test.find();
test.show();
}
}
结果吻合。
【程序14】
题目:输入某年某月某日,判断这一天是这一年的第几天?
1.程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且
输入月份大于3时需考虑多加一天。
import java.util.Scanner;
public class aufgabe14 {
private int year;
private int month;
private int day;
private int permutation;
aufgabe14(int year,int month,int day)
{
this.year=year;
this.month=month;
this.day=day;
this.permutation=0;
}
boolean leapyear()
{
if(this.year%4==0 && this.year%100!=0||this.year%400==0)
return true;
else
return false;
}
void permutation()
{
int offs=0;
if(leapyear())
offs=1;
if(this.month<=2)
this.permutation=(this.month-1)*31+this.day;
else if(this.month>2 && this.month<8)
this.permutation=31+28+offs+(this.month-3)/2*61+(this.month-3)%2*31+this.day;
else if(this.month>7 && this.month<13)
this.permutation=212+offs+(this.month-8)/2*61+(this.month-8)%2*31+this.day;
}
void show()
{
if(leapyear())
System.out.println(this.year+" is a leapyear");
System.out.println(this.year+"/"+this.month+"/"+this.day+" : "+this.permutation);
}
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
System.out.println("please input year,month and day:");
int year = sc.nextInt();
int month = sc.nextInt();
int day = sc.nextInt();
sc.close();
aufgabe14 test=new aufgabe14(year,month,day);
test.permutation();
test.show();
}
}
结果吻合。
【程序15】
题目:输入三个整数x,y,z,请把这三个数由小到大输出。
1.程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x
与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。
import java.util.Scanner;
public class aufgabe15 {
private int x,y,z;
aufgabe15(int x,int y,int z)
{
this.x=x;
this.y=y;
this.z=z;
}
void compare()
{
int temp;
if(x>y)
{
temp=x;
x=y;
y=temp;
}
else if(y>z)
{
if(x>z)
this.show(z,x,y);
else
this.show(x,z,y);
}
else
this.show(x,y,z);
}
void show(int a,int b,int c)
{
System.out.println(a+"<"+b+"<"+c);
}
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
System.out.println("please input three numbers ");
int x = sc.nextInt();
int y = sc.nextInt();
int z = sc.nextInt();
sc.close();
aufgabe15 test=new aufgabe15(x,y,z);
test.compare();
}
}
结果吻合。
【程序16】
题目:输出9*9口诀。
1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列。
public class aufgabe16 {
static void printout()
{
for(int i=1;i<10;i++)
{
for(int j=0;j
1.程序分析:采取逆向思维的方法,从后往前推断。
public class aufgabe17 {
private int sum;
private int day;
aufgabe17(int day)
{
sum=1;
this.day=day;
}
void peachkalku()
{
for(int i=1;i
结果吻合。
之是素数。
public class aufgabe18 {
public static void main(String[] args)
{
char[] list={'n','n','n'};
char[] member={'x','y','z'};
for(int i=2;i>=0;i--)
{
for(int j=0;j<3;j++)
{
if((i==0 && j==0) || (i==2 && j==0) || (i==2 && j==2))
continue;
if(member[j]=='n')
continue;
list[i]=member[j];
member[j]='n';
break;
}
}
for(int i=0;i<3;i++)
{
int offs=(int)'a'+i;
char temp=(char)offs;
System.out.println(temp+"-------"+list[i]);
}
}
}
结果吻合。
行,第二层控制列。
public class aufgabe19 {
public static void main(String[] args)
{
int[] a={1,3,6,8,6,3,1};
for(int i=0;i<4;i++)
{
for(int j=1;j<=a[i];j++)
System.out.print("*");
System.out.println();
}
for(int i=4;i<7;i++)
{
for(int j=1;j<=a[i];j++)
System.out.print("*");
System.out.println();
}
}
}
结果吻合。
1.程序分析:请抓住分子与分母的变化规律。
public class aufgabe20 {
private double sum;
private int number;
aufgabe20(int number)
{
this.number=number;
this.sum=0;
}
int series(int k,int c)
{
switch(c){
case 0:
if(k==1 || k==0)
return 1;
else
return series(k-1,0)+series(k-2,0);
case 1:
if(k==0)
return 1;
else if(k==1)
return 2;
else
return series(k-1,1)+series(k-2,1);
default:
return 1<<32;
}
}
void sum()
{
for(int i=1;i<=number;i++)
{
sum+=(double)series(i,1)/(double)series(i,0);
System.out.print(series(i,1)+"/"+series(i,0)+" ");
}
System.out.println();
}
void show()
{
System.out.println("the sum of all "+number+" terms is : "+sum);
}
public static void main(String[] args)
{
int number=20;
aufgabe20 test=new aufgabe20(number);
test.sum();
test.show();
}
}
结果吻合。
1.程序分析:此程序只是把累加变成了累乘。
public class aufgabe21 {
private int bound;
private int sum;
aufgabe21(int bound)
{
this.bound=bound;
this.sum=0;
}
int factor(int k)
{
if(k==1)
return 1;
else
return factor(k-1)*k;
}
void kalkul()
{
for(int i=1;i<=this.bound;i++)
sum+=factor(i);
}
void show()
{
System.out.println("the factor of "+this.bound+" is : "+this.sum);
}
public static void main(String[] args)
{
int bound=20;
aufgabe21 test=new aufgabe21(bound);
test.kalkul();
test.show();
}
}
结果吻合。
1.程序分析:递归公式:fn=fn_1*4!
public class aufgabe22 {
static int factor(int k)
{
if(k==1)
return 1;
else
return factor(k-1)*k;
}
public static void main(String[] args)
{
System.out.println(aufgabe22.factor(5));
}
}
依次类推,推到第一人(10岁),再往回推。
public class aufgabe23 {
static int age(int k)
{
if(k==1)
return 10;
else
return age(k-1)+2;
}
public static void main(String[] args)
{
System.out.println(aufgabe23.age(5));
}
}
结果吻合。
题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
public class aufgabe24 {
private int num;
private int[] temp=new int[5];
private int digit;
aufgabe24(int num)
{
this.num=num;
this.digit=0;
for(int i=0;this.num>1;i++)
{
temp[i]=this.num%10;
this.num=this.num/10;
digit++;
}
}
void show()
{
System.out.print("each digit is : ");
for(int i=0;i
结果吻合。
public class aufgabe25 {
private int num;
private int[] temp=new int[5];
aufgabe25(int num)
{
this.num=num;
int a=this.num;
for(int i=0;i<5;i++)
{
temp[i]=a%10;
a=a/10;
}
}
boolean judgement()
{
for(int i=0;i<2;i++)
if(temp[i]!=temp[4-i])
return false;
return true;
}
void show()
{
if(this.judgement())
System.out.println(this.num+" is palindromic");
else
System.out.println(this.num+" is not palindromic");
}
public static void main(String[] args)
{
int num=83409;
aufgabe25 test1=new aufgabe25(num);
test1.judgement();
test1.show();
aufgabe25 test2=new aufgabe25(13631);
test2.judgement();
test2.show();
}
}
结果吻合。
完成了一半了~ 撒花~~