【程序1】
題目:古典問題:有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子對數爲多少?
程序分析:兔子的規律爲數列1,1,2,3,5,8,13,21….
做這種題目,最好的做法就是找出規律,跟高中的數列一樣
本題有:a[n]=a[n-1]+a[n-1],而第一第二項都知道了,後面的值也可以求得
public class Programme1 {
public static void main(String[] args) {
System.out.print("請輸入你想知道的兔子數量的月份:");
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();//獲取輸入的整數
System.out.println("第"+n+"個月兔子總數爲"+fun(n));
scanner.close();
}
//求得所需月份的兔子的數量,返回值爲兔子的數量
private static int fun(intn){
if(n==1 ||n==2)
return 1;
else
returnfun(n-1)+fun(n-2);
}
}
【程序2】
題目:判斷101-200之間有多少個素數,並輸出所有素數。
程序分析:
* 素數是:只能被1或本身整除的數,如:3,5,7,11,131...
*判斷素數的方法:用一個數分別去除2到sqrt(這個數),
*其實用這個數分別去除2到他本身少1的數也可以,但是運算時間增加了
*如果能被整除,則表明此數不是素數,反之是素數。
public class Programme2 {
public static void main(String[] args) {
int sum=0;
for (inti = 100; i < 200;i++) {
if (IsRightNum(i)) { //判斷這個數是不是素數
System.out.print(i+" ");
sum++;
if (sum%10==0) { //十個一行
System.out.println();
}
}
}
System.out.println("素數的整數:"+sum);
}
//判斷這個數是不是素數的具體代碼
private static boolean IsRightNum(inti) {
for (intj = 2; j < Math.sqrt(i);j++) {
if (i%j==0) { //如果能整除,就說明不是素數,可以馬上中斷,繼續對下一個數判斷
return false;
}
}
return true;
}
}
【程序3】
題目:打印出所有的”水仙花數”,所謂”水仙花數”是指一個三位數,其各位數字立方和等於該數本身。例如:153是一個”水仙花數”,因爲153=1的三次方+5的三次方+3的三次方。
程序分析:利用for循環控制100-999個數,每個數分解出個位,十位,百位。
public class Programme3 {
public static void main(String[] args) {
int sum=0;//水仙花的總數
for (inti = 100; i < 1000;i++) {
intbite=i%10; //求得個位
intten=i/10%10; //求得十位
inthundred=i/100;//求得百位
//如果符合水仙花條件的數打印出來
if (i==(bite*bite*bite)+
(ten*ten*ten)+(hundred*hundred*hundred)) {
System.out.print(i+" ");
sum++;
}
}
System.out.println("總共有水仙花個數:"+sum);
}
}
【程序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 Programme4 {
public static void main(String[] args) {
System.out.print("請輸入一個你要分解的正整數:");
Scanner scanner=new Scanner(System.in);
int input=scanner.nextInt();//獲取輸入的數字
System.out.println();
System.out.print(input+"=");
for (inti = 2; i < input+1; i++) {
while(input%i==0&&input!=i) {
input=input/i;
System.out.print(i+"*");
}
if(input==i){//上面的都不能整除,說明這是一個質數
System.out.print(i);
break;
}
}
scanner.close();
}
}
【程序5】
題目:利用條件運算符的嵌套來完成此題:學習成績>=90分的同學用A表示,60-89分之間的用B表示,60分以下的用C表示。
程序分析:(a>b)?a:b這是條件運算符的基本例子。
public class Programme5 {
public static void main(String[] args) {
System.out.println("請輸入你的分數:");
Scanner scanner=new Scanner(System.in);
int input=scanner.nextInt();//獲取輸入
//等級判斷
String belong=input>=90?"A":(input>=60?"B":"c");
System.out.println(input+"分屬於:"+belong);
scanner.close();
}
}
【程序6】
題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。
程序分析:利用輾除法。
*這裏有一個知識點要記住的,最大公約數和最小公倍數的求法
*1、先求最大公約數bigDivisor
*2、就可以很方便獲得最小公倍數multiple=input1*input2/bigDIvisor
*這裏最重要的就是求最大公約數:求法如下
*(1)用大的數對小的數求餘
*(2)把小的數賦值給大的數,把求餘獲得的結果賦值給小的數,
*(3)循環上一步的操作,直到求餘的結果爲零
*(4)上一步被求餘的數就是我們要的最大公約數,不信的話,你可以動手試試
public class Programme6 {
public static void main(String[] args) {
int bigDivisor=0;//定義最大公約數
int multiple=0;//定義最小公倍數
System.out.println("請輸入兩個整數:");
Scanner scanner = new Scanner(System.in);
int input1 = scanner.nextInt();//獲取第一個數
int input2 = scanner.nextInt();//獲取第二個數
multiple=input1*input2;//這個值保存,求公約數後,方便求得最小公倍數
int temp =1;// 交換用的中間數
if (input2 >input1) {//確保第一個數不小於第二個數
temp=input1;
input1=input2;
input2=temp;
}
while (temp!=0) { //求餘結果不等於零,就一直循環
temp=input1%input2;//求餘結果
input1=input2;//大的數已經沒用了,用小的數替代
input2=temp;//把求餘的結果賦值給小的數
}
bigDivisor=input1;//最後一次求餘結果爲零時,被求餘的數
multiple=multiple/bigDivisor;
System.out.println("最大公約數是:"+bigDivisor );
System.out.println("最小公倍數是:"+multiple);
scanner.close();
}
}
【程序7】
題目:輸入一行字符,分別統計出其英文字母、空格、數字和其它字符的個數。
程序分析:
這裏的需要的知識點:
1、獲取一行字符串,nextLine()
2、把字符串的每一個字符賦值到一個數值中
3、對比每一個數值在ASK碼的範圍,就可以確定它符號的類別
4、char字符ASK碼的範圍
(1)數字0到9: 48~57
(2)字母A到Z:65到90 a到z:97到122
(3)空格是32
public class Programme7 {
public static void main(String[] args) {
int num=0;//數字的個數
int letter=0;//字母的個數
int space=0;//空格的個數
int others=0;//其他的個數
System.out.println("請輸入一串字符:");
Scanner scanner=new Scanner(System.in);
String string=scanner.nextLine();//獲取一行字符串
//把字符串裏面的值賦值給一個字符型數組
char[]arr=string.toCharArray();
//遍歷字符串裏面的所有值
for (inti = 0; i < arr.length; i++) {
if (arr[i]>=48&&arr[i]<=57) {//字符是數字
num++;
} else if((arr[i]>=65&&arr[i]<=90)||(arr[i]>=97&&arr[i]<=122)) {
letter++;
}else if (arr[i]==32) {
space++;
}else {
others++;
}
}
System.out.println("數字:"+num+"個,字母:"+letter+"個,空格:"+space+"個,其他:"+others+"個");
scanner.close();
}
}
【程序8】
題目:求s=a+aa+aaa+aaaa+aa…a的值,其中a是一個數字。例如2+22+222+2222+22222(此時共有5個數相加),幾個數相加有鍵盤控制。輸出結果的形式如:2+22+222=246;
程序分析:關鍵是計算出每一項的值。
比如獲取的數字爲:a,出現的項數爲:n
總結一下,可以得到一下規律:
1、第一項有一個a,最後一項有n個a
2、 第1和第2項相差2*10,第2和第三項相差2*100,第k和第k+1項相差2*(10的k次方)
public class Programme8 {
public static void main(String[] args) {
int n=0,a=0;
Scanner scanner=new Scanner(System.in);
System.out.println("請輸入a的值:");
a=scanner.nextInt();
System.out.println("請輸入n的值:");
n=scanner.nextInt();
int[] arr=new int[n];//創建數組長度爲輸入的項數
int i=1;//while循環初始化的值
arr[0]=a;//數組的第一個值爲3
//把每一項的值賦值給數組裏面的數
while (i<n) {
a*=10;
arr[i]=a+arr[i-1];
i++;
}
//求和
int sum=0;
for(ints:arr){
sum+=s;//累加求和
if (s==arr[n-1]) {
System.out.print(s);
break;//最後一次只輸出結果
}
System.out.print(s+"+");//前面的值輸出結果,後面還要加一個加號
}
System.out.println("="+sum);//完美結束
}
}
【程序9】
題目:一個數如果恰好等於它的因子之和,這個數就稱爲”完數”。例如6=1+2+3.編程找出1000以內的所有完數。
判斷完數的方法:
* 利用for循環判斷所有因數的和是否和輸入的值是否相等,相等的話輸出
* 求因數的方法:
* (1)兩個嵌套循環,並用i%j==0,關於i和j的值範圍:i從1到1000逐個遍歷,j只需不大於i/2+1即可
* 比如:48,最大的因數才24,99最大的因數是33,因數不會大於本身數的一半
* (2)j就是我們所求的因數,把所有的j相加,就可以得到因數總和
* (3)因數總和已經包含1了,因爲第一次就保存1了
public class Programme9 {
public static void main(String[] args) {
System.out.println("1000以內的因數有:");
for (inti = 1; i <=1000;i++) {
intsum=0;//所有因數的總和
for (intj = 1; j < i/2+1; j++) {
if (i%j==0) {//判斷範圍內的所有j相加,就是因數總和
sum=sum+j;
if (i==sum) {
System.out.print(i+" ");
}
}
}
}
}
}
【程序10】
題目:一球從h米高度自由落下,每次落地後反跳回原高度的一半;
再落下,求它在 第n次落地時,共經過多少米?第n次反彈多高?
1
程序分析:反彈的高度:(1/2)的n次方*h
* 經過的距離:這個可以總結得到:第一次落地經過:h,第二次落地經過:h+(h/2)*2,
* 第三次落地經過:h+(h/2)*2+(h/2/2)*2
* 那麼第n次落地經過: h+(h/2)*2+(h/2/2)*2 +...+h/(2的n-1次方)*2
public class Programme10 {
public static void main(String[] args) {
System.out.println("請輸入小球下落的高度和落地的次數:");
Scanner scanner=new Scanner(System.in);
float h=scanner.nextFloat();
float n=scanner.nextFloat();
//float h=100,n=3;
float sum=h;//經過的路徑總和
h/=2;//第一次下落是在最高點,sum中不會有兩倍的h,所以寫在外面,循環從第二次開始
for (inti = 2; i <=n; i++) {
//經過的距離的總和
sum+=h*2;
//第N次反彈的高度爲
h /=2;
}
System.out.println("在"+100+"米,經過"+n+"次後,能反彈:"+h+"米,經過的距離:"+sum);
scanner.close();
}
}
【程序11】
題目:有1、2、3、4個數字,能組成多少個互不相同且無重複數字的三位數?都是多少?
程序分析:可填在百位、十位、個位的數字都是1、2、3、4。這裏要用3個for循環
用if判斷條件是否符合,符合條件的數字打印出來,並計算個數總和
1
public class Programme11 {
public static void main(String[] args) {
int sum=0;
for (intbite = 1; bite < 5;bite++) {
for (intten = 1; ten < 5;ten++) {
for (inthundred = 1; hundred < 5;hundred++) {
if (bite!=ten&&bite!=hundred&&ten!=hundred) {//符合條件的數字
System.out.print((hundred*100+ten*10+bite)+" ");
sum++;//計算個數
if (sum%10==0) {//十個一行
System.out.println();
}
}
}
}
}
System.out.println("\n總共有:"+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,求應發放獎金總數?
程序分析:請利用數軸來分界,定位。注意定義時需把獎金定義成長整型。
超過 10萬 20萬 40萬 60萬 100萬
10*0.1 10*0.075 20*0.05 20*0.03 40*0.015 0.01
1 1.75 2.75 3.35 3.95
public class Programme12 {
public static void main(String[] args) {
System.out.println("請輸入你創造的利潤(單位:萬元):");
Scanner scanner=new Scanner(System.in);
while (!scanner.hasNextDouble()) {
System.out.println("請輸入金額數字:");
scanner.next();
}
doubleprofit=scanner.nextDouble();
doublebonus=0;
if (profit<=10) {
bonus=profit*0.1;
}else if(profit<=20){
bonus=(profit-10)*0.075+1;
}else if (profit<=40 ) {
bonus=(profit-10)*0.05+1.75;
}else if (profit<=60 ) {
bonus=(profit-10)*0.03+2.75;
}else if (profit<=100 ) {
bonus=(profit-10)*0.015+3.35;
}else {
bonus=(profit-100)*0.01+3.95;
}
System.out.println(profit+"萬元利潤,可以獲得:"+bonus+"萬元");
scanner.close();
}
}
【程序13】
題目:一個整數,它加上100後是一個完全平方數,再加上168又是一個完全平方數,請問該數是多少?
程序分析:在10萬以內判斷,
用for循環判斷:先將該數加上100後再開方,再將該數加上268後再開方,
如果開方後的結果再平方後分別和i+100,i+268相等,即是結果。
public class Prog13{
public class Programme13 {
public static void main(String[] args) {
for (inti = 0; i <10000;i++) {
intnum1=(int)Math.sqrt(i+100);//開方,值已固定了
intnum2=(int)Math.sqrt(i+268);
if ((num1*num1==(i+100))&&(num2*num2==(i+268))) {//符合條件的打印出來
System.out.println(i+" ");
}
}
}
}
【程序14】
題目:輸入某年某月某日,判斷這一天是這一年的第幾天?
程序分析:以3月5日爲例,應該先把前兩個月的加起來
,然後再加上5天即本年的第幾天,特殊情況,閏年且輸入月份大於3時需考慮多加一天。
閏年的條件:year除以400能整除,或者year除以4能整除,但是不能是100的倍數
public class Programme14 {
public static void main(String[] args) {
System.out.println("請輸入年月日(用空格隔開):");
Scanner scanner=new Scanner(System.in);
int year=scanner.nextInt();//獲取年份
int month=scanner.nextInt();//獲取月份
int day=scanner.nextInt();//獲取天數
int sum=0;//天數總和
//創建一個包含月份天數的數組,先按小年計算,如果是閏年,並且在三月以後再加1
int[] arr={31,28,31,30,31,30,31,31,30,31,30,31};
sum=day;//輸入的天數肯定是要加的
for (inti = 1; i < month; i++) { //加上包含的月份天數
sum+=arr[i];
}
//最後判斷是否是閏年,如果是的話再加1,否則sum就是結果了,條件比較長,我就抽出來寫了
booleanisRight=(((year%4==0)&&(year%100!=0))||(year%400==0))&&(month>2);
if (isRight) {
sum+=1;
}
System.out.println(year+"年"+month+"月"+day+"日,是這年的第"+sum+"天");
}
}
【程序15】
題目:輸入三個整數x,y,z,請把這三個數由小到大輸出。
程序分析:我們想辦法把最小的數放到x上,先將x與y進行比較,如果x>y則將x與y的值進行交換,然後再用x與z進行比較,如果x>z則將x與z的值進行交換,這樣能使x最小。
最後兩個數也使z>y就可以了
public class Programme15 {
public static void main(String[] args) {
System.out.println("三個整數:");
Scanner scanner=new Scanner(System.in);
int num1=scanner.nextInt();//獲取整數
int num2=scanner.nextInt();
int num3=scanner.nextInt();
int temp=0;//最爲一個交換數
if (num1>num2) {//保證num2>num1
temp=num1;
num1=num2;
num2=temp;
}
if (num1>num3) {//保證num3>num1
temp=num1;
num1=num3;
num3=temp;
}
if (num2>num3) {//保證num3>num2
temp=num2;
num2=num3;
num3=temp;
}
System.out.println("這三個數從小到大排列:"+num1+" "+num2+" "+num3);
scanner.close();
}
}
【程序16】
題目:輸出9*9口訣。
程序分析:分行與列考慮,共9行9列,i控制行,jC列。
表達式: i+”*”+j+”=”+i*j,這裏要用兩個for循環控制輸出和換行
public class Programme16 {
public static void main(String[] args) {
for (inti = 1; i <= 9;i++) {
for (intj = 1; j <=i ;j++) {
System.out.print(i+"*"+j+"="+i*j+" ");//輸出結果
}
System.out.println();//換行
}
}
}
【程序17】
題目:猴子喫桃問題:猴子第一天摘下若干個桃子,當即吃了一半,還不癮,又多吃了一個第二天早上又將剩下的桃子喫掉一半,又多吃了一個。以後每天早上都吃了前一天剩下的一半零一個。到第10天早上想再喫時,見只剩下一個桃子了。求第一天共摘了多少。
程序分析:採取逆向思維的方法,從後往前推斷。
天 數 1 2 3 4 5 。。。10
桃子數 1 4 10 22 46 ?
* 所以桃子數計算方法:前一天桃子數*2+2
1
public class Programme17 {
public static void main(String[] args) {
int sum=1;//第一天桃子的數量
for (inti =2; i <=10;i++) {//第二天才開始計算
sum=sum*2+2;
}
System.out.println("猴子摘的桃子數爲:"+sum);
}
}
【程序18】
題目:兩個乒乓球隊進行比賽,各出三人。甲隊爲a,b,c三人,乙隊爲x,y,z三人。已抽籤決定比賽名單。有人向隊員打聽比賽的名單。a說他不和x比,c說他不和x,z比,請編程序找出三隊賽手的名單。
程序分析:???感覺不能下手!
* 這道題目使用的是構造方法,還有arrayList的知識!標準答案的答案!
* 但是,還是被我用for循環給解決了
這裏重要的是使用賦值,還有充分使用給出的條件,還有一個就是互不衝突的常識,比如第一個if的使用!
public class Programme18 {
public static void main(String[] args) {
String a = null,b=null,c=null;//甲隊成員
String[] racer = {"x","y","z"};//乙隊成員
for(inti=0;i<3;i++){
for (intj = 0; j <3;j++) {
for (intk = 0; k < 3;k++) {
if (i!=j&&i!=k&&j!=k) {
a=racer[i]; b=racer[j];c=racer[k];
if (!a.equals("x")&&!c.equals("z")&&!c.equals("x")) {
if (a.equals(racer[i])&&b.equals(racer[j])&&c.equals(racer[k])) {
System.out.println("a的對手是:"+racer[i]+",b的對手是:"+racer[j] +",c的對手是:"+racer[k] );
}
}
}
}
}
}
}
}
【程序19】
題目:打印出如下圖案(菱形)
*
*
程序分析:先把圖形分成兩部分來看待,前四行一個規律,後三行一個規律,
利用雙重 for循環,第一層控制行,第二層控制列。
詳細分析第一部分圖形的規律:1、這是一個等腰三角形,*的打印次數1、3、5、7等差數列
2、還要注意空格打印的 次數3、2、1、0逐漸遞減
* 第二部分同理可得!
public class Programme19 {
public static void main(String[] args) {
//打印上面部分:
int n=4;
for (inti = 0; i < n; i++) { //控制行
for (intk =3-i; k > 0 ; k--) { //控制*前面空格的輸出
System.out.print(" ");
}
//輸出符號,但不要換行
for (intj = 0; j <=2*i;j++) { //控制列
System.out.print("*");
}
//輸出完符號馬上換行
System.out.println();
}
//打印下面部分
n=3;
for (inti = n; i > 0; i--) { //控制行
for (intk =3-i+1; k > 0 ; k--) { //控制*前面空格的輸出,第一行要加空格
System.out.print(" ");
}
//輸出符號,但不要換行
for (intj = 0; j <=2*i-2;j++) { //控制列
System.out.print("*");
}
//輸出完符號馬上換行
System.out.println();
}
}
}
【程序20】
題目:有一分數序列:2/1,3/2,5/3,8/5,13/8,21/13…求出這個數列的前20項之和。
程序分析:請抓住分子與分母的變化規律。分數:fraction
1、第一項是2/1
2、前面一項分子和分母相加的和,爲下一項的分子
*3、前面一項分子,爲下一項的分母
public class Programme20 {
public static void main(String[] args) {
float up=2;//分子
float down=1;//分母
float fraction=up/down;//分數
float temp=0;//交換數
float sum=0;//總和
for (inti = 0; i <20;i++) { //前面20項
sum+=fraction; //分數相加
temp=up+down;//先把分子分母的和賦值給一個交換數,不能馬上賦值給分子,因爲分子的值下面還有用
down=up; //把分子的值賦值給下一下的分母
up=temp; //把交換數的值賦值給下一項分子
fraction=up/down;//下一項的分數值
}
System.out.println(""+sum);
}
}
【程序21】
題目:求1+2!+3!+…+20!的和
程序分析:此程序只是把累加變成了累乘。
1、先求該項階乘的值
* 2、累加求求
public class Programme21 {
public static void main(String[] args) {
int sum=0;//總和
for (inti = 1; i <= 20;i++) {
sum+=factorial(i);//累加
}
System.out.println(""+sum);
}
//求階乘的實現
private static int factorial(inti) {
//求階乘
int mult=1;
for (intj=1 ; j <= i;j++) {
mult*=j;
}
returnmult;//返回階乘結果
}
}
【程序22】
題目:利用遞歸方法求5!。
程序分析:遞歸公式:f(n)=n*f(n-1)
不斷的調用方法,直到最小的值確定
1
public class Programme22 {
public static void main(String[] args) {
System.out.println(Fact(5));//輸出結果值
}
//遞歸方法求階乘的具體代碼
private static int Fact(inti) {
if (i==1) {//1的階乘爲1
return 1;
}
returni*Fact(i-1);//不斷回調
}
}
【程序23】
題目:有5個人坐在一起,問第五個人多少歲?他說比第4個人大2歲。問第4個人歲數,他說比第3個人大2歲。問第三個人,又說比第2人大兩歲。問第2個人,說比第一個人大兩歲。最後問第一個人,他說是10歲。請問第五個人多大?
程序分析:利用遞歸的方法,遞歸分爲回推和遞推兩個階段。要想知道第五個人歲數,需知道第四人的歲數,依次類推,推到第一人(10歲),再往回推。
public class Programme23 {
public static void main(String[] args) {
System.out.println("第五個人的歲數:"+GetAge(5,2));
}
//遞歸方法求第五個人的歲數
private static int GetAge(intnum, intageMore) {
if (num==1) {//第一個人歲數爲10
return 10;
}
returnGetAge(num-1, ageMore)+ageMore;//每上一個人歲數加2
}
}
【程序24】
題目:給一個不多於5位的正整數,要求:一、求它是幾位數,二、逆序打印出各位數字。
程序分析:創建一個五位數數的數組,把輸入數字的每位數的值賦值到數組裏面
* 把輸入 數字從個位起獲取,並且每獲取一次之後/10,這樣就能分別獲取十位百位千位了
* 把數字打印出來就是題目所求了
1
2
3
public class Programme24 {
public static void main(String[] args) {
System.out.println("請輸入一個不大於5位數的數字:");
Scanner scanner=new Scanner(System.in);
int num=scanner.nextInt();//獲取輸入
int[] arr=new int[5];//創建5位數的數組
int i=0;
//循環取位
do{
arr[i]=num%10;
num=num/10;
i++;
}while (num!=0);//只剩下一位時,說明獲取完畢,跳出循環
System.out.println("輸入數字串的是"+i+"位數的");
System.out.println("逆序輸出:");
//打印出數組
for (intj = 0; j < i;j++) {
System.out.print(arr[j]+" ");
}
scanner.close();
}
}
【程序25】
題目:一個5位數,判斷它是不是迴文數。即12321是迴文數,個位與萬位相同,十位與千位相同。
這個程序跟上一個程序類似。
* 創建一個五位數的數組
* 逐次取位
* 組後判斷條件就可以了
public class Programme25 {
public static void main(String[] args) {
System.out.println("請輸入一個五位數:");
Scanner scanner=new Scanner(System.in);
int input=scanner.nextInt();//獲取輸入的數字
int arr[]=new int[5];//創建一個大小爲5的數組
int i=4;
do {//逐次取位
arr[i]=input%10;
input/=10;
i--;
} while (i>=0);//這裏的結束條件寫input!=0也是可以的
//System.out.println(Arrays.toString(arr));
if (arr[0]==arr[4]&&arr[1]==arr[3]) {
System.out.println("輸入的數是迴文數字!");
}else {
System.out.println("輸入的數不是迴文數字!");
}
scanner.close();
}
}
【程序26】
題目:請輸入星期幾的第一個字母來判斷一下是星期幾,如果第一個字母一樣,則繼續判斷第二個字母。
程序分析:用情況語句比較好,如果第一個字母一樣,則判斷用情況語句或if語句判斷第二個字母。
public class Programme26 {
public static void main(String[] args) {
System.out.println("請輸入第一個英文字母:");
Scanner scanner=new Scanner(System.in);
String input=scanner.next();
String input2="";
switch (input) {
case"m":
System.out.println("Monday");
break;
case"t":
System.out.println("請輸入第二個字母:");
input2=scanner.next();
if (input2.equals("u")) {
System.out.println("Tuesday");
}else if (input2.equals("h")) {
System.out.println("Thursday");
} else {
System.out.println("你輸入的字母有誤!");
}
break;
case"w":
System.out.println("Wednesday");
break;
case"f":
System.out.println("Friday");
break;
case"s":
System.out.println("請輸入第二個字母:");
input2=scanner.next();
if (input2.equals("u")) {
System.out.println("Sunday");
}else if (input2.equals("a")) {
System.out.println("Saturday");
} else {
System.out.println("你輸入的字母有誤!");
}
break;
default:
System.out.println("你輸入的字母不正確!");
break;
}
scanner.close();
}
}
【程序27】
題目:求100之內的素數
素數的判斷方法:這個數除以2到比它本身少1的數都不能整除,那麼這個數就是素數了!
public class Programme27 {
public static void main(String[] args) {
int sum=0;
for (inti = 2; i < 100;i++) {
if (IsRight(i)) {//如果是素數就打印出來
System.out.print(i+" ");
sum++;
if (sum%10==0) {//十個一行
System.out.println();
}
}
}
System.out.println("\n共有素數:"+sum+"個");
}
//判斷該數是不是素數
private static boolean IsRight(inti) {
for (intj = 2; j < Math.sqrt(i);j++) {
if (i%j==0) {
return false;//不是素數的話,馬上返回false
}
}
return true;
}
}
【程序28】
題目:對10個數進行排序
程序分析:可以利用選擇法,即從後9個比較過程中,選擇一個最小的與第一個元素交換,下次類推,即用第二個元素與後8個進行比較,並進行交換。
最後打印出來的數組就是從小到大排列的數組了
public class Programme28 {
public static void main(String[] args) {
System.out.println("請輸入10個數(用空格隔開):");
int[] arr=new int[10];
Scanner scanner=new Scanner(System.in);
for (inti = 0; i < 10;i++) {
arr[i]=scanner.nextInt();
}
//對數組進行排序
int temp=0;//交換數
for (inti = 0; i < 9;i++) {
for (intj = i+1; j < arr.length;j++) {
if (arr[i]>arr[j]) { //如果第一個數比後面的數大就交換
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
System.out.println("排列後的數組:"+Arrays.toString(arr));//Arrays類的包裝方法!
}
}
【程序29】
題目:求一個3*3矩陣對角線元素之和
程序分析:利用雙重for循環控制輸入二維數組,再將a[i][i]累加後輸出。
public class Programme29 {
public static void main(String[] args) {
System.out.println("請輸入九個數字:");
Scanner scanner=new Scanner(System.in);
int[][]arr=newint[3][3];
//獲取矩陣數字
for (inti = 0; i <3;i++) {
for (intj = 0; j < 3;j++) {
arr[i][j]=scanner.nextInt();
}
}
System.out.println("第一條對角線之和:"+(arr[0][0]+arr[1][1]+arr[2][2]));
System.out.println("第二條對角線之和:"+(arr[0][2]+arr[1][1]+arr[2][0]));
scanner.close();
}
}
【程序30】
題目:有一個已經排好序的數組。現輸入一個數,要求按原來的規律將它插入數組中。
程序分析:首先判斷此數是否大於最後一個數,然後再考慮插入中間的數的情況,插入後此元素之後的數,依次後移一個位置。
1、創建兩個數組,如果插入的數字比數組最後一個都大,那麼插入的數放在新數組最後就可以
* 2、如果插入的不是最大,那麼和數組前面的數逐一比較,比較到比插入的數大就break
* 比如第i個符合條件,那麼arrB[i-1]=arrA[i-1],arrB[i]=num,arrB[i+1]=arrA[i]
public static void main(String[] args) {
System.out.println("請輸入一個數字:");
Scanner scanner=new Scanner(System.in);
int num=scanner.nextInt();
int[] arrA={3,5,15,36,84,99};
int[] arrB=new int[arrA.length+1];
if (num>arrA[arrA.length-1]) {
for (inti = 0; i < arrA.length; i++) {
arrB[i]=arrA[i];
}
arrB[arrB.length-1]=num;
}else {
for (inti = 0; i < arrA.length; i++) {
if (num<arrA[i]) {
for (intj = 0; j < i; j++) {
arrB[j]=arrA[j];
}
arrB[i]=num;
for (intj = i; j < arrA.length;j++) {
arrB[j+1]=arrA[j];
}
break;//這個很重要
}
}
}
System.out.println("插入一個數後的數組爲:"+Arrays.toString(arrB));
scanner.close();
}
}
【程序31】
題目:將一個數組逆序輸出。
程序分析:用第一個與最後一個交換。
public static void main(String[] args) {
int[]arrA={1,3,44,22,77,99};
int[]arrB=newint[arrA.length];
int j=arrA.length;
for (inti = 0; i < arrA.length; i++) {
arrB[i]=arrA[j-1];
j--;
}
System.out.println("數組A逆序輸出爲:"+Arrays.toString(arrB));
}
}
【程序32】
題目:取一個整數a從右端開始的4~7位。
程序分析:可以這樣考慮:
看下面的詳細解說
public static void main(String[] args) {
System.out.println("輸入一個整數:");
Scanner scanner=new Scanner(System.in);
long num=scanner.nextLong();//獲取輸入
String str=Long.toString(num);//把數字轉化爲String類型的
char[]ch=str.toCharArray();//把String類型的字符,轉化爲char類型,每一個數字賦值到字符型數組中
int n=ch.length;//字符型數組的長度
System.out.println("該整數從右端開始的4-7位爲:"+ch[n-7]+ch[n-6]+ch[n-5]+ch[n-4]);//輸出結果
scanner.close();//關閉輸入流
}
【程序33】
題目:打印出楊輝三角形(要求打印出10行如下圖)
程序分析:
1
1
1 1
1 2 1
1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1、二維數組的使用
2、第一列的數都是1
3、使用兩個for循環,i控制行,j控制列;
從第二行第二列起arr[i][j]=arr[i-1][j-1]+arr[i-1][j]
public static void main(String[] args) {
int[][]arr=newint[10][10];
for (inti = 0; i < arr.length; i++) {
arr[i][0]=1;//控制第一列的數等於1
}
for (inti = 1; i < arr.length; i++) {
for (intj=1; j < arr.length; j++) {
arr[i][j]=arr[i-1][j-1]+arr[i-1][j];//賦值
}
}
//打印結果
for (inti = 0; i < arr.length ; i++) {
for (intk = arr.length-i;k>0;k--) {//空格的控制,爲了好看
System.out.print(" ");
}
for (intj = 0; j < arr.length; j++) {//打印出數組的數字
if (arr[i][j]!=0) {//把把沒賦值的零去掉
System.out.print(arr[i][j]+" ");
}
}
System.out.println();//控制換行
}
}
}
【程序34】
題目:輸入3個數a,b,c,按大小順序輸出。
程序分析:利用指針方法。
public static void main(String[] args) {
System.out.println("請輸入三個數:");
Scanner scanner = new Scanner(System.in);
int num1 = scanner.nextInt();//獲取輸入的數
int num2 = scanner.nextInt();
int num3 = scanner.nextInt();
scanner.close();
int temp = 0;
if (num1 >num2) {//確保num2>num1
temp = num1;
num1 = num2;
num2 = temp;
}
if (num1 >num3) {//確保num3>num1
temp = num1;
num1 = num3;
num3 = temp;
}
if (num2 >num3) {//確保num3>num2
temp = num2;
num2 = num3;
num3 = temp;
}
System.out.println("這三個數從大到小排列:"+num3+" "+num2+" "+num1 );
}
}
【程序35】
題目:輸入數組,最大的與第一個元素交換,最小的與最後一個元素交換,輸出數組。
程序分析:1、找到該數組的最大值和最小值
* 找到該數組最大項把它和第一位交換,
* 找到該數值的最小項把它和最後一項交換
* 這裏有一點值得注意:不能把最大值和最小值先找出來,再連續執行兩次操作交換,會出錯!
* 還有一點要注意:沒叫到要交換的數值的位置不變,我在網上查了的都會有亂序的
public static void main(String[] args) {
System.out.print("請輸入一組數:");
Scanner scan = new Scanner(System.in).useDelimiter("\\s");
int[]arrA = newint[50];
intm = 0;//數組的長度
while(scan.hasNextInt()){//不斷給數組A賦值
arrA[m++] =scan.nextInt();
}
scan.close();//關閉輸入流
int[]arrB = newint[m];//創建數組B,要求剛好適應輸入的數字的個數
for(inti=0;i<m;i++){
arrB[i] =arrA[i];//把數組A不爲零的數值賦值給數組B
}
intmax=0;
intmin=arrB[1];//定義數組的最小值
for (inti = 0; i < arrB.length; i++) {
if (arrB[i]>max) {//求數組的最大值
max=arrB[i];
}
if (arrB[i]<=min) {//求數組的最小值
min=arrB[i];
}
}
intmax_i=0;//定義數組最大值的下標
intmin_i=0;//定義數組最小值的下標
for (inti = 0; i < arrB.length; i++) {
if (max==arrB[i]) {
max_i=i;
}
}
inttemp=0;//定義一個交換值
//把最大的值和第一個值交換
temp=arrB[0];
arrB[0]=arrB[max_i];
arrB[max_i]=temp;
//求數組最小值的下標
for (inti = 0; i < arrB.length; i++) {
if (min==arrB[i]) {
min_i=i;
}
}
//把最小的值和最後一個值交換
temp=arrB[arrB.length-1];
arrB[arrB.length-1]=arrB[min_i];
arrB[min_i]=temp;
System.out.println(Arrays.toString(arrB));
scan.close();
}
}
【程序36】
題目:有n個整數,使其前面各數順序向後移m個位置,最後m個數變成最前面的m個數
程序分析:在原來數組的基礎上還要創建一個和原來數組大小一樣的數組
* 根據要移動的位數把原來的數組分割成兩個部分分別賦值給新的數組
1
public static void main(String[] args) {
System.out.println("輸入一個十個數的組數:");
Scanner scanner=new Scanner(System.in);
int n=10;
int[]arrA=newint[n];
for (inti = 0; i < n; i++) {
arrA[i]=scanner.nextInt();//獲取十個數組
}
System.out.println("沒移動前的數組:"+Arrays.toString(arrA));
System.out.println("請輸入要往後移動的個數:");
int m=scanner.nextInt();//獲取輸入往後退的個數
m%=n;//十個相當於循環
int[]arrB=newint[n];//創建和數組A大小一樣的數組B
int k=m;//創建一個可變的變量
for (inti = m; i < arrA.length;i++) {
arrB[i]=arrA[i-m];
}
for (inti = 0; i <m;i++) {
arrB[i]=arrA[arrA.length-k];
k--;
}
System.out.println("移動後的數組:"+Arrays.toString(arrB));//輸出數組B
scanner.close();
}
}
【程序37】
題目:有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最後留下的是原來第幾號的那位。
關鍵問題是怎麼移除》?:布爾值確定,如果被選中被賦值爲false
* 從第一個人開始判斷,如果他在圈內,那麼報數,再判斷他報的數是否是3,如果是的話移出圈外
* 接着判斷下一個人,是否到了最末,如果是的話,從零開始
* 不斷循環,直到最後剩下1個人
public static void main(String[] args) {
System.out.print("請輸入一個整數:");
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
scan.close();
//定義數組變量標識某人是否還在圈內
boolean[]isIn = newboolean[n];
for(inti=0;i<isIn.length;i++){
isIn[i] =true;
}
int inCount = n;//定義圈內人數
int countNum = 0;//定義報數
int index = 0;//定義索引
while(inCount>1){//最後一人時退出循環
if(isIn[index]){//判斷下一個人是否在圈內
countNum++;//在的話報數
if(countNum==3){//如果這個數等於3
isIn[index] =false;//把他定義爲出圈
countNum = 0;//報數清零,下一個好從1開始
inCount--;//圈內人數減一
}
}
index++;//下一人的位置索引值
if(index==n){//當索引到最後之後再從頭開始
index = 0;
}
}
for(inti=0;i<n;i++){
if(isIn[i]){//最後只有一個符合條件的
System.out.println("留下的是:"+(i+1));
}
}
}
}
【程序38】
題目:寫一個函數,求一個字符串的長度,在main函數中輸入字符串,並輸出其長度。
public static void main(String[] args) {
System.out.println("請輸入一串字符:");
Scanner scanner=new Scanner(System.in);
String input=scanner.next();//獲取輸入的字符串
System.out.println("你輸入的字符串是:"+input);
System.out.println("你輸入的字符串長度是:"+input.length());
scanner.close();
}
}
【程序39】
題目:編寫一個函數,輸入n爲偶數時,調用函數求1/2+1/4+…+1/n,當輸入n爲奇數時,調用函數1/1+1/3+…+1/n(利用指針函數)
程序分析:1、先判斷是奇數還是偶數
* 2、分數分子都是一,偶數分母從2開始,奇數的分母從1開始,分母差值都爲2
1
import java.util.Scanner;
public static void main(String[] args) {
System.out.println("請輸入一個整數:");
Scanner scanner=new Scanner(System.in);
int input=scanner.nextInt();
doublesum=0;//總和
if (input%2==0) {//偶數
for (doublei = 2; i <=input; i+=2) {
sum+=1/i;
if (i==input) {
System.out.print("1/"+(int)i);//輸出最後一項,最後用break,中斷後面的執行
break;
}
System.out.print("1/"+(int)i+" + ");//輸出相加的項後面加個加號
}
}else {//奇數情況
for (doublei = 1; i <=input; i+=2) {
sum+=1/i;
if (i==input) {
System.out.print("1/"+(int)i);//輸出最後一項,最後用break,中斷後面的執行
break;
}
System.out.print("1/"+(int)i+" + ");//輸出相加的項後面加個加號
}
}
System.out.println(" = "+sum);
scanner.close();
}
}
【程序40】
題目:字符串排序。
無語!這裏要用一個封裝的方法:booleanb=string1.compareTo(string2);
* string1的類型值string2大於,則b是大於零,否者小於零
1
public class Prog40{
public static void main(String[] args){
String[] str = {"abc","cad","m","fa","f"};
for(int i=str.length-1;i>=1;i--){
for(int j=0;j<=i-1;j++){
if(str[j].compareTo(str[j+1])<0){
String temp = str[j];
str[j] = str[j+1];
str[j+1] = temp;
}
}
}
for(String subStr:str)
System.out.print(subStr+" ");
}
}
【程序41】
題目:海灘上有一堆桃子,五隻猴子來分。第一隻猴子把這堆桃子憑據分爲五份,多了一個,這隻猴子把多的一個扔入海中,拿走了一份。第二隻猴子把剩下的桃子又平均分成五份,又多了一個,它同樣把多的一個扔入海中,拿走了一份,第三、第四、第五隻猴子都是這樣做的,問海灘上原來最少有多少個桃子?
程序分析:有個疑問就是題目沒說第五個猴子拿到的只有一個桃子,但是別人都知道??不理解
這其實就是一個遞歸問題每次*5 +1
1
這個用逆向思維
* 5 4 3 2 1
* 桃子個數 6 31 156 781 3906
*猴子拿的個數 1 6 31 156 781
public class Programme41 {
public static void main(String[] args) {
System.out.println(Peach(1));;
}
private static int Peach(inti) {
if (i==5) {
return 6;
}
returnPeach(i+1)*5+1;
}
}
【程序42】
題目:809*??=800*??+9*??+1
其中??代表的兩位數,8*??的結果爲兩位數,9*??的結果爲3位數。求??代表的兩位數,及809*??後的結果。
程序解析:for循環的使用
public class Programme42 {
public static void main(String[] args) {
String result="";
for (inti = 100; i < 1000;i++) {
if (809*i==800*i+9*i+1) {
result=i+" ";
}
}
if (result.equals("")) {
System.out.println("沒有合適的數");
}else {
System.out.println("合適的數有:"+result);
}
}
}
【程序43】
題目:求0—7所能組成的奇數個數。
*程序分析:最少也是1位數,最多能組成8位的數字
第一位不能爲零,最後一位不能是偶數
0到7有四個奇數
這裏用累加求和
public class Programme43 {
public static void main(String[] args) {
int n = 8;//位數
int sum = 0;//總和
// 1位數情況
sum += n / 2;
// 2位數情況
sum += (n-1)*n / 2;
// 3位數情況
sum += (n-1)*n*n / 2;
// 4位數情況
sum += (n-1)*n*n*n / 2;
// 5位數情況
sum += (n-1)*n*n*n*n / 2;
// 6位數情況
sum += (n-1)*n*n*n*n*n / 2;
// 7位數情況
sum += (n-1)*n*n*n*n*n*n / 2;
// 8位數情況
sum += (n-1)*n*n*n*n*n*n*n / 2;
System.out.println("0到7能組成的奇數個數:"+sum);
}
}
【程序44】
題目:一個偶數總能表示爲兩個素數之和。
程序分析:判斷兩個加數是不是素數
* 素數的判斷前面做過很多了,不說了!
1
import java.util.Scanner;
public class Programme44 {
public static void main(String[] args) {
System.out.println("請輸入一個偶數:");
Scanner scanner =new Scanner(System.in);
int input=scanner.nextInt();
while (input%2!=0) {
System.out.println("你輸入的不是偶數,請重新輸入:");
input=scanner.nextInt();
}
for (inti = 2; i < input; i++) {
if (isRightNum(i)&&isRightNum(input-i)) {//兩個加數同時是素數
System.out.println(input+"="+i+"+"+(input-i));
break;
}
}
scanner.close();
}
//判斷這個數是不是素數的具體方法:
private static boolean isRightNum(inti) {
for (intj = 2; j < Math.sqrt(i+1);j++) {
if (i%j==0) {//確定是素數
return false;
}
}
return true;
}
}
【程序45】
題目:判斷一個素數能被幾個9整除
程序分析:這個題目也不知道是哪個傻瓜想出來的,我只能說垃圾,不知道它想問什麼的?
下面是網上下的答案,我不想做!
我猜它是判斷輸入的數比9 的多少次方大?而且跟素數有毛關係??
import java.util.Scanner;
public class Prog45{
public static void main(String[] args){
System.out.print("請輸入一個數:");
Scanner scan = new Scanner(System.in);
long l = scan.nextLong();
long n = l;
scan.close();
int count = 0;
while(n>8){
n /= 9;
count++;
}
System.out.println(l+"能被"+count+"個9整除。");
}
}
【程序46】
題目:兩個字符串連接程序
程序分析:考察程序的基本常識嗎?
public class Prog46{
public static void main(String[] args){
String str1 = "lao lee";
String str2 = "牛刀";
String str = str1+str2;
System.out.println(str);
}
}
【程序47】
題目:讀取7個數(1—50)的整數值,每讀取一個值,程序打印出該值個數的*。
程序分析:簡單方法的調用而已!
import java.util.Scanner;
public class Prog47{
public static void main(String[] args){
System.out.print("請輸入7個整數(1-50):");
Scanner scan = new Scanner(System.in);
int n1 = scan.nextInt();
int n2 = scan.nextInt();
int n3 = scan.nextInt();
int n4 = scan.nextInt();
int n5 = scan.nextInt();
int n6 = scan.nextInt();
int n7 = scan.nextInt();
scan.close();
printStar(n1);
printStar(n2);
printStar(n3);
printStar(n4);
printStar(n5);
printStar(n6);
printStar(n7);
}
static void printStar(int m){
System.out.print(m);
for(int i=0;i<m;i++)
System.out.print("*");
System.out.println();
}
}
【程序48】
題目:某個公司採用公用電話傳遞數據,數據是四位的整數,在傳遞過程中是加密的,加密規則如下:每位數字都加上5,然後用和除以10的餘數代替該數字,再將第一位和第四位交換,第二位和第三位交換。
程序分析:1、數字取位,個十百千位分別求出
* 2、按要求替換
* 3、按要求交換
public class Programme48 {
public static void main(String[] args) {
int[] num=new int[4];//存放四位數的個十百千位
System.out.println("請輸入一個四位數:");
Scanner scanner=new Scanner(System.in);
int input=scanner.nextInt();
for (inti = 0; i < 4;i++) {//逐次取位,從個位開始,並按要求替換
num[i]=(input%10+5)%10;
input/=10;
}
//按要求替換,交換1、4位
int temp=0;//交換數
temp=num[0];
num[0]=num[3];
num[3]=temp;
//交換2、3位
temp=num[1];
num[1]=num[2];
num[2]=temp;
System.out.println("加密後的結果:"+num[3]+num[2]+num[1]+num[0]);
scanner.close();
}
}
【程序49】
題目:計算字符串中子串出現的次數
程序分析:把string類型的字符串的每個元素,轉換爲char數組裏面的每個數組的值string.toCharArray()
* 判斷char數組中是否存在空格,存在的話子字符串數量加1
1
public class Programme49 {
public static void main(String[] args) {
String string="aa bb df 23 d 3 df32 d";
int num=1;//子字符的數量
char[]c=string.toCharArray();
for (inti = 0; i < c.length; i++) {
if (c[i]==' ') {
num++;
}
}
System.out.println(string+"有子字符串: "+num +" 個");
}
}
【程序50】
題目:有五個學生,每個學生有3門課的成績,從鍵盤輸入以上數據(包括學生號,姓名,三門課成績),計算出平均成績,將原有的數據和計算出的平均分數存放在磁盤文件”stud”中。
最後這題涉及文件存儲,輸入輸出流
import java.io.*;
public class Prog50{
//定義學生模型
String[] number = new String[5];
String[] name = new String[5];
float[][] grade = new float[5][3];
float[] sum = new float[5];
public static void main(String[] args) throws Exception{
Prog50 stud = new Prog50();
stud.input();
stud.output();
}
//輸入學號、姓名、成績
void input() throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//錄入狀態標識
boolean isRecord = true;
while(isRecord){
try{
for(int i=0;i<5;i++){
System.out.print("請輸入學號:");
number[i] = br.readLine();
System.out.print("請輸入姓名:");
name[i] = br.readLine();
for(int j=0;j<3;j++){
System.out.print("請輸入第"+(j+1)+"門課成績:");
grade[i][j] = Integer.parseInt(br.readLine());
}
System.out.println();
sum[i] = grade[i][0]+grade[i][1]+grade[i][2];
}
isRecord = false;
}catch(NumberFormatException e){
System.out.println("請輸入一個數字!");
}
}
}
//輸出文件
void output() throws IOException{
FileWriter fw = new FileWriter("E://java50//stud.txt");
BufferedWriter bw = new BufferedWriter(fw);
bw.write("No. "+"Name "+"grade1 "+"grade2 "+"grade3 "+"average");
bw.newLine();
for(int i=0;i<5;i++){
bw.write(number[i]);
bw.write(" "+name[i]);
for(int j=0;j<3;j++)
bw.write(" "+grade[i][j]);
bw.write(" "+(sum[i]/5));
bw.newLine();
}
bw.close();
}
}