50 道 JAVA 基礎(chǔ)編程練習(xí)題解答
【程序 1】
題目:古典問題:有一對(duì)兔子,從出生后第 3 個(gè)月起每個(gè)月都生一對(duì)兔子今布,小兔子長(zhǎng)到第
三個(gè)月后每個(gè)月又生一對(duì)兔子啥纸,假如兔子都不死,問每個(gè)月的兔子總數(shù)為多少?
.程序分析: 兔子的規(guī)律為數(shù)列 1,1,2,3,5,8,13,21....
解答:
(方法一)
利用數(shù)學(xué)分析可得知:這個(gè)月的兔子數(shù)量為前兩個(gè)月的兔子數(shù)量之和儿惫,推導(dǎo)過程如下:
X1在塔,X2,X3 Y1会前,Y2好乐,Y3 Z1,Z2瓦宜,Z3
X1:表示一個(gè)月大的兔子蔚万;X2表示兩個(gè)月大的兔子;X3表示三個(gè)月及三月以上的兔子临庇。
有以下數(shù)學(xué)表達(dá)式:
Y1=X2+X3 反璃,Y2=X1 昵慌,Y3=X2+X3
Z1=Y2+Y3 ,Z2=Y1 淮蜈,Z3=Y2+Y3
Z1+Z2+Z3= Y2+Y3+Y1+(Y2+Y3)=(Y2+Y3+Y1)+(X2+X3+X1)
因此上面每個(gè)月的兔子的數(shù)量滿足斐波那契數(shù)列斋攀。編程實(shí)現(xiàn)較為簡(jiǎn)單,此處省略梧田。
(方法二)
方法二利用編程實(shí)現(xiàn)淳蔼,具有一般性(開始兔子個(gè)數(shù)和產(chǎn)仔周期可自行輸入),程序設(shè)計(jì)如下:
import java.util.*;
import java.io.*;
class TuZi
{
int nianling=1;
}
public class Text1 {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
int shuliang=1;
int zhouqi=4;
int yuefen=0;
Vector<TuZi> rongqi=new Vector<TuZi>();
System.out.print("輸入兔子開始數(shù)量:");
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
shuliang=(new Integer(stdin.readLine()));
System.out.print("輸入兔子生產(chǎn)周期:");
zhouqi=(new Integer(stdin.readLine()));
System.out.print("輸入查詢?cè)路荩?);
yuefen=(new Integer(stdin.readLine()));
for(int i=1;i<=shuliang;i++)
{
rongqi.addElement(new TuZi());
}
for(int i=2;i<=yuefen;i++)
{
for(int j=0;j<rongqi.size();j++)
{
TuZi a=(TuZi)rongqi.elementAt(j);
a.nianling++;}
for(int j=0;j<rongqi.size();j++)
{
if(rongqi.elementAt(j).nianling>=zhouqi)
{
rongqi.addElement(new TuZi());
}
}
}
System.out.print("兔子數(shù)量為:"+rongqi.size());
}
}
【程序 2】
題目:判斷 101-200 之間有多少個(gè)素?cái)?shù)裁眯,并輸出所有素?cái)?shù)鹉梨。
1.程序分析:判斷素?cái)?shù)的方法:用一個(gè)數(shù)分別去除 2 到 sqrt(這個(gè)數(shù)),如果能被整除穿稳,
則表明此數(shù)不是素?cái)?shù)存皂,反之是素?cái)?shù)。
解答:
程序如下:
public class Text2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int sum=0;
System.out.print("101到200的素?cái)?shù)是: ");
for(int i=101;i<=200;i++)
{
int flag=0;
for(int j=2;j<=Math.sqrt(i);j++)
{
float k=(float)i;
if(k%j==0)
{
flag=1;
break;
}
}
if(flag==0)
{
System.out.print(i+" ");
sum++;
}
}
System.out.println("");
System.out.print("素?cái)?shù)個(gè)數(shù)為: ");
System.out.print(sum);
}
}
【程序 3】
題目:打印出所有的"水仙花數(shù)"逢艘,所謂"水仙花數(shù)"是指一個(gè)三位數(shù)旦袋,其各位數(shù)字立方和等于
該數(shù)本身。例如:153 是一個(gè)"水仙花數(shù)"它改,因?yàn)?153=1 的三次方+5 的三次方+3 的三次方疤孕。
1.程序分析:利用 for 循環(huán)控制 100-999 個(gè)數(shù),每個(gè)數(shù)分解出個(gè)位搔课,十位胰柑,百位。
解答:
程序如下:
public class Text3 {
public static void main(String[] args)
{
int a=0;int b=0;int c=0;
System.out.println("100到999的水仙花數(shù)為:");
for(int i=100;i<=999;i++)
{
a=i/100;
b=i/10-a*10;
c=i-b*10-a*100;
if(i==a*a*a+b*b*b+c*c*c)
{
System.out.println(i);
}
}
}
}
【程序 4】
題目:將一個(gè)正整數(shù)分解質(zhì)因數(shù)爬泥。例如:輸入 90,打印出 90=2*3*3*5柬讨。
解答:
分析:對(duì) n 進(jìn)行分解質(zhì)因數(shù),應(yīng)先找到一個(gè)最小的質(zhì)數(shù) k袍啡,然后按下述步驟完成:
(1)如果這個(gè)質(zhì)數(shù)恰等于 n踩官,則說明分解質(zhì)因數(shù)的過程已經(jīng)結(jié)束,打印出即可境输。
(2)如果 n>k蔗牡,但 n 能被 k 整除,則應(yīng)打印出 k 的值嗅剖,并用 n 除以 k 的商,作為新的正整數(shù)你
n,重復(fù)執(zhí)行第一步辩越。
(3)如果 n 不能被 k 整除,則用 k+1 作為 k 的值,重復(fù)執(zhí)行第一步信粮。
這個(gè)題目很明顯是要用遞歸算法來(lái)實(shí)現(xiàn)的黔攒,打印“*”有些技巧,但也很容易解決,程序如
下:
import java.io.*;
public class Text4 {
public static void chuLi(int n)
{
for(int i=2;i<=n;i++)
{
if(n==i)
{
System.out.print(i);
return;
}
if(n>i&&(n%i==0))
{
n=n/i;
System.out.print(i+"*");
chuLi(n);
break;//這句很重要
}
}
}
public static void main(String[] args) throws IOException
{int shu=0;
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
System.out.print("請(qǐng)輸入正整數(shù):");
shu=(new Integer(stdin.readLine()));
chuLi(shu);
}
}
【程序 5】
題目:利用條件運(yùn)算符的嵌套來(lái)完成此題:學(xué)習(xí)成績(jī)>=90 分的同學(xué)用 A 表示督惰,60-89 分之
間的用 B 表示不傅,60 分以下的用 C 表示。
解答:
此題較為簡(jiǎn)單赏胚,程序如下
import java.io.*;
public class Text5 {
public static void main(String[] agrs) throws IOException
{
System.out.print("請(qǐng)輸入成績(jī):");
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
int chengji=new Integer(stdin.readLine());
char dengji=chengji<60?'C':(chengji>=90?'A':'B');
System.out.print(dengji);
}
}
【程序 6】
題目:輸入兩個(gè)正整數(shù) m 和 n访娶,求其最大公約數(shù)和最小公倍數(shù)。
<求最大公約數(shù)>
算法(1)設(shè)計(jì):
E0.[確保 m n] 若 m n觉阅,則 m n崖疤。
E1.[求余數(shù)] 以 n 除 m 并令 r 為所得余數(shù)。(我們將有 0 r n留拾。)
E2.[余數(shù)為 0?] 若 r 為 0戳晌,算法結(jié)束,n 即為所求答案痴柔。
E3.[減少] 置 m n,n r疫向,并返回步驟 E1咳蔚。
數(shù)學(xué)證明:
(1) 若 m%n=0,則 n 為所求最大公因子
(2) 若 m%n 0搔驼,則只需證明下面命題成立
如果某數(shù)是 n 與 m%n 的最大公因子谈火,則這個(gè)數(shù)也是 m 和 n 的最大公因子。(上面算
法可化為這句話)
證明:
假設(shè) a 是 n 和 m%n 的最大公因子舌涨,則有:
因有(m%n)%a=0糯耍,故可設(shè) m%n=k*a,k 為正整數(shù)囊嘉。又 n%a=0温技,故可設(shè) n=p*a,p 也為正
整數(shù)扭粱。
可得數(shù)學(xué)表達(dá)式:m=t*n+m%n舵鳞,其中 t 為不小于 0 的整數(shù)。
因此有:m=t*p*a+k*a=(t*p+k)*a琢蛤,因此可得 m%a=0
因此有如下兩個(gè)表達(dá)式:
a 為 m 和 n 的公因子已經(jīng)證畢蜓堕。
如何確定 a 為 m 和 n 的最大公因子?(可用反證法證明)
證明:假設(shè) m 和 n 存在公因子 b博其,且有 b>a套才。
則有:
可以仿照上面的推導(dǎo)過程得出:
則 b 也是 n 和 m%n 的公因子,又 b>a慕淡,與 a 是 n 和 m%n 的最大公因子矛盾背伴。
綜上,如果某數(shù)是 n 與 m%n 的最大公因子,則這個(gè)數(shù)也是 m 和 n 的最大公因子挂据。
(3) 證畢以清。
對(duì)步驟 E0 的分析:
若 m<n,則 m%n=m崎逃。當(dāng)進(jìn)行 E0 后掷倔,m 為較大者,m%n n个绍。
算法(2)設(shè)計(jì):
F1.[余數(shù) m/n] 以 n 除 m勒葱,并令 m 為余數(shù)。
F2.[它是 0?] 如果 m=0巴柿,則此算法以 n 為答案而終止凛虽。
F3.[余數(shù) n/m] 以 m 除 n,并令 n 是余數(shù)广恢。
F4.[它是 0?] 如果 n=0凯旋,則算法以答案 m 而終止,否則返回步驟 F1钉迷。
算法(2)可仿照算法(1)進(jìn)行證明
<求最大公倍數(shù)>
算法設(shè)計(jì):
F1:求出 m 和 n 的較大者至非,令較大者為 m,較小者為 n糠聪。
F2:判斷 m 能否被 n 整除荒椭,若能則 m 為兩者最小公倍數(shù)。
F2:將 n 分解因式舰蟆。
F3:將 m 依次乘以 n 的因子趣惠,判斷乘積能否被 n 整除,若能則乘積為兩者最小公倍數(shù)身害。
根據(jù)上面的算法味悄,程序如下:
import java.io.*;
import java.util.*;
public class Text6 {
public static void fenJie(Vector<Integer> m,int n)
{
for(int i=2;i<=n;i++)
{
if(n==i)
{
m.addElement(i);
return;
}
if(n>i&&(n%i==0))
{
n=n/i;
m.addElement(i);
fenJie(m,n);
break;
}
}
}
public static int gongBeiShu(Vector<Integer> m,int a,int b)
{
int chengji=1;
if(a%b==0)
return a;for(int i=0;i<m.size();i++)
{
chengji=chengji*m.elementAt(i);
if((a*chengji)%b==0)
{
return a*chengji;
}
}
return a*b;
}
public static int bigYinZi(int a,int b)
{
int r=a%b;
int m=0;
if(r==0)
return b;
else
{
a=b;
b=r;
m=bigYinZi(a,b);
return m;
}
}
public static void main(String[] args) throws IOException
{
Integer shu1=0;Integer shu2=0;int t=0;
Vector<Integer> pool=new Vector<Integer>();
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
System.out.print("請(qǐng)輸入第一個(gè)正整數(shù):");
shu1=(new Integer(stdin.readLine()));
System.out.print("請(qǐng)輸入第二個(gè)正整數(shù):");
shu2=(new Integer(stdin.readLine()));
if(shu1<shu2)
{
t=shu2;
shu2=shu1;
shu1=t;
}
fenJie(pool,shu2);
t=bigYinZi(shu1,shu2);
System.out.println("最大公約數(shù)是:"+t);
t=gongBeiShu(pool,shu1,shu2);
System.out.print("最小公倍數(shù):"+t);
}
}
【程序 7】
題目:輸入一行字符,分別統(tǒng)計(jì)出其中英文字母题造、空格傍菇、數(shù)字和其它字符的個(gè)數(shù)。
解答:
這題需要對(duì)漢字的內(nèi)碼進(jìn)行一定的了解界赔,漢字占兩個(gè)字節(jié)丢习,每個(gè)字節(jié)的開始位為 1。程序如
下:
import java.io.*;public class Text7 {
public static void main(String[] agrs) throws IOException
{
String zifuchuan=new String("");
int hanzishu=0;int zimu=0;int kongge=0;int shuzi=0;int qita=0;
System.out.print("請(qǐng)輸入一行字符:");
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
zifuchuan=stdin.readLine();
byte[] bytes=zifuchuan.getBytes();
for(int i=0;i<bytes.length;i++)
{
if((bytes[i]>=65&&bytes[i]<=90)||(bytes[i]>=97&&bytes[i]<=122))
zimu++;
else if(bytes[i]==32)
kongge++;
else if(bytes[i]>=48&&bytes[i]<=57)
shuzi++;
else if(bytes[i]<0)
hanzishu++;
else
qita++;
}
System.out.println("字符串所占字節(jié)個(gè)數(shù)為:"+bytes.length);
System.out.println("漢字個(gè)數(shù)為:"+hanzishu/2);
System.out.println("英文字母?jìng)€(gè)數(shù)為:"+zimu);
System.out.println("空格個(gè)數(shù)為:"+kongge);
System.out.println("數(shù)字個(gè)數(shù)為:"+shuzi);
System.out.println("其他字符個(gè)數(shù)為:"+qita);
}
}
【程序 8】
題 目 : 求 s=a+aa+aaa+aaaa+aa...a 的 值 淮悼, 其 中 a 是 一 個(gè) 數(shù) 字 咐低。 例 如
2+22+222+2222+22222(此時(shí)共有 5 個(gè)數(shù)相加),幾個(gè)數(shù)相加有鍵盤控制袜腥。
解答:
在此題中见擦,利用進(jìn)行字符串運(yùn)算的“+”運(yùn)算符钉汗,然后將字符串轉(zhuǎn)為數(shù)字,實(shí)現(xiàn)了程序過程鲤屡,
程序設(shè)計(jì)如下:
import java.io.*;
public class Text8 {
public static void main(String[] args) throws IOException
{
int s=0;int a=0;int sum=0;String p="";
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
System.out.print("請(qǐng)輸入數(shù)字a:");
a=new Integer(stdin.readLine());
System.out.print("請(qǐng)輸入數(shù)字個(gè)數(shù)s:");
s=new Integer(stdin.readLine());
for(int i=1;i<=s;i++)
{
Character c=(char)(a+'0');
p=c.toString();
for(int j=1;j<i;j++)
{p=p+a;
}
int d=Integer.parseInt(p);
sum=sum+d;
}
System.out.println("結(jié)果為:"+sum);
}
}
【程序 9】
題目:一個(gè)數(shù)如果恰好等于它的因子之和损痰,這個(gè)數(shù)就稱為"完數(shù)"。例如 6=1+2+3.編程 找
出 1000 以內(nèi)的所有完數(shù)酒来。
解答:
根據(jù)題目意思卢未,設(shè)計(jì)程序如下:
import java.io.*;
import java.util.*;
public class Text9 {
public static void fenJie(Vector<Integer> m,int n)
{
for(int i=1;i<=n/2;i++)
if(n%i==0)
m.addElement(i);
}
public static boolean panBie(Vector<Integer> m,int n)
{
int sum=0;
for(int i=0;i<m.size();i++)
sum=sum+m.elementAt(i);
if(sum==n)
return true;
else
return false;
}
public static void main(String[] args) throws IOException
{
boolean zhenjia=false;
System.out.println("1000以內(nèi)的完數(shù)為:");
for(int i=2;i<1000;i++)
{
Vector<Integer> pool=new Vector<Integer>();
fenJie(pool,i);
zhenjia=panBie(pool,i);
if(zhenjia)
System.out.println(i);
}
}
}
【程序 10】
題目:一球從 100 米高度自由落下,每次落地后反跳回原高度的一半堰汉;再落下辽社,求它在 第
10 次落地時(shí),共經(jīng)過多少米翘鸭?第 10 次反彈多高滴铅?
解答:
此題較為簡(jiǎn)單,程序設(shè)計(jì)如下:
import java.io.*;public class Text10 {
public static void main(String[] args) throws IOException {
float heigh=100;int cishu=10;float sum=0;
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
System.out.print("輸入初始下落高度:");
heigh=(new Float(stdin.readLine()));
sum=heigh;
System.out.print("輸入落地碰撞次數(shù):");
cishu=(new Integer(stdin.readLine()));
for(int i=1;i<cishu;i++)
{
heigh=heigh/2;
sum=sum+heigh*2;
}
System.out.println("第"+cishu+"次反彈高度為:"+heigh);
System.out.println("第"+cishu+"次落地總經(jīng)過長(zhǎng)度為:"+sum);
}
}
【程序 11】
題目:有 1就乓、2汉匙、3、4 個(gè)數(shù)字档址,能組成多少個(gè)互不相同且無(wú)重復(fù)數(shù)字的三位數(shù)盹兢?都是多少?
解答:
理解好排列組合守伸,可設(shè)計(jì)程序如下:
public class Text11 {
public static void main(String[] args) {
int[] a={1,2,3,4};
System.out.println("滿足條件的三位數(shù)是:");
for(int i=0;i<a.length;i++)
{
for(int j=0;j<a.length;j++)
{
if(j==i)
continue;
for(int k=0;k<a.length;k++)
{
if(k==i||k==j)
continue;
for(int h=0;h<a.length;h++)
{
if(h==i||h==j||h==k)
continue;
System.out.println(a[j]*100+a[k]*10+a[h]);
}
}
}
}
}
}
//output
滿足條件的三位數(shù)是:
234
243
324
342423
432
134
143
314
341
413
431
124
142
214
241
412
421
123
132
213
231
312
321
【程序 12】
題目:企業(yè)發(fā)放的獎(jiǎng)金根據(jù)利潤(rùn)提成。利潤(rùn)(I)低于或等于 10 萬(wàn)元時(shí)浦妄,獎(jiǎng)金可提 10%尼摹;利潤(rùn)
高于 10 萬(wàn)元灯萍,低于 20 萬(wàn)元時(shí)石蔗,低于 10 萬(wàn)元的部分按 10%提成,高于 10 萬(wàn)元的部分跋涣,可
可提成 7.5%阅懦;20 萬(wàn)到 40 萬(wàn)之間時(shí)和二,高于 20 萬(wàn)元的部分,可提成 5%耳胎;40 萬(wàn)到 60 萬(wàn)之間
時(shí)高于 40 萬(wàn)元的部分惯吕,可提成 3%;60 萬(wàn)到 100 萬(wàn)之間時(shí)怕午,高于 60 萬(wàn)元的部分废登,可提成
1.5%,高于 100 萬(wàn)元時(shí)郁惜,超過 100 萬(wàn)元的部分按 1%提成堡距,從鍵盤輸入當(dāng)月利潤(rùn) I,求應(yīng)發(fā)
放獎(jiǎng)金總數(shù)?
解答:
此題較為簡(jiǎn)單羽戒,注意定義時(shí)需把獎(jiǎng)金定義成長(zhǎng)整型缤沦。程序設(shè)計(jì)如下:
import java.io.*;
public class Text12 {
public static void main(String[] args) throws IOException {
float lirun=0;double jiangjin=0;
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
System.out.print("輸入當(dāng)月利潤(rùn)(萬(wàn)):");
lirun=(new Float(stdin.readLine()));
if(lirun<=10)
jiangjin=lirun*0.1;
else if(lirun<=20)
jiangjin=(lirun-10)*0.075+10*0.1;
else if(lirun<=40)
jiangjin=(lirun-20)*0.05+10*0.075+10*0.1;
else if(lirun<=60)
jiangjin=(lirun-40)*0.03+20*0.05+10*0.075+10*0.1;
else if(lirun<=100)
jiangjin=(lirun-60)*0.015+20*0.3+20*0.05+10*0.075+10*0.1;
else
jiangjin=(lirun-100)*0.01+40*0.015+20*0.3+20*0.05+10*0.075+10*0.1;
System.out.print("當(dāng)月獎(jiǎng)金為(萬(wàn)):"+jiangjin);}
}
【程序 13】
題目:一個(gè)整數(shù),它加上 100 后是一個(gè)完全平方數(shù)易稠,再加上 168 又是一個(gè)完全平方數(shù)缸废,請(qǐng)
問該數(shù)是多少?
解答:
可先對(duì)問題進(jìn)行適當(dāng)分析缩多,分析情況如下:
假設(shè)整數(shù)為 X呆奕,第一個(gè)完全平方數(shù)為 M,第二個(gè)完全平方數(shù)為 N衬吆,則有下面的關(guān)系式梁钾。
X+100=M2
X+168=N2
將兩個(gè)式子相減,再進(jìn)行適當(dāng)?shù)臄?shù)學(xué)變形可得:(N-M)(N+M)=68
得出可被 68 整除的數(shù)(前面已經(jīng)編程實(shí)現(xiàn))逊抡,令 N-M=Y姆泻,N+M=Z。
則有 N=(Y+Z)/2(N 需為正整數(shù))冒嫡,則有 X=N*N-168拇勃。則可得出答案。
程序設(shè)計(jì)如下:(一般性程序孝凌,兩個(gè)數(shù)可以自己輸入)
import java.io.*;
import java.util.*;
public class Text13 {
public static void fenJie(Vector<Integer> m,int n)
{
for(int i=1;i<=Math.sqrt(n);i++)
if(n%i==0)
m.addElement(i);
}
public static void main(String[] args) throws IOException
{
Vector<Integer> pool=new Vector<Integer>();
int m=100;int n=168;int t=0;int flag=0;
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
System.out.print("輸入第一個(gè)正整數(shù):");
m=new Integer(stdin.readLine());
System.out.print("輸入第二個(gè)正整數(shù):");
n=new Integer(stdin.readLine());
if(m>n)
{
t=m;
m=n;
n=t;
}
fenJie(pool,n-m);
int a=0;int b=0;int N=0;int x=0;
for(int i=0;i<pool.size();i++)
{
x=0;
a=pool.elementAt(i);
b=(n-m)/a;
if((a+b)%2==0)
{
N=(a+b)/2;
x=N*N-n;
}
if(x>0)
{
flag=1;System.out.println(x);
}
}
if(flag==0)
System.out.println("不存在這樣的數(shù)字方咆!");
}
}
【程序 14】
題目:輸入某年某月某日,判斷這一天是這一年的第幾天蟀架?
解答:
閏年的判斷瓣赂,可根據(jù)以下三點(diǎn)進(jìn)行判斷。
1片拍、普通年能被 4 整除且不能被 100 整除的為閏年煌集。(如 2004 年就是閏年,1900 年不是
閏年)
2、世紀(jì)年能被 400 整除的是閏年捌省。(如 2000 年是閏年苫纤,1900 年不是閏年)
3、對(duì)于數(shù)值很大的年份,這年如果能整除 3200,并且能整除 172800 則是閏年纲缓。如
172800 年是閏年卷拘,86400 年不是閏年(因?yàn)殡m然能整除 3200,但不能整除 172800)
分析: 利用 Scanner 類中 nextInt()進(jìn)行數(shù)據(jù)的讀取色徘,由于是連續(xù)輸入而且輸入中有漢字恭金,
故這種方法不行。程序設(shè)計(jì)需要改進(jìn)褂策,現(xiàn)利用 Character.isDigit 方法進(jìn)行程序設(shè)計(jì)横腿,達(dá)到了
較為理想的結(jié)果颓屑,程序如下所示。(此程序中有一段代碼是對(duì)字符串中的數(shù)字進(jìn)行提取耿焊,如
211 年 8 月 8 日提取三個(gè)數(shù)字分別為:211揪惦、8、8)
import java.io.*;
import java.util.*;
public class Text14xin {
public static void main(String[] args) throws IOException
{
long year=0;long month=0;long day=0;
String m=new String("");
String n=new String("");
Vector<String> s=new Vector<String>();
long tianshu=0;
int[] monthday={31,28,31,30,31,30,31,31,30,31,30,31};
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
System.out.print("輸入日期:");
m=stdin.readLine();
char[] mass = m.toCharArray();
for(int i=0;i<mass.length;i++) //for循環(huán)是對(duì)字符串中的數(shù)字進(jìn)行提取
{
if(Character.isDigit(mass [i]))
n=n+mass[i];
else
{
if(!n.isEmpty())
{
s.addElement(n);
n=new String("");
}
}
if(j==mass.length-1&&!n.isEmpty())
vector.addElement(n);
}
year=Long.parseLong(s.elementAt(0));
month=Long.parseLong(s.elementAt(1));day=Long.parseLong(s.elementAt(2));
if(year>=172800)
{
if(year%3200==0&&year%172800==0)
monthday[1]=29;
}
else
{
if(year%4==0&&year%100!=0)
monthday[1]=29;
if(year%400==0)
monthday[1]=29;
}
for(int j=0;j<month-1;j++)
tianshu=tianshu+monthday[j];
tianshu=tianshu+day;
System.out.print(m+"是這一年的第"+tianshu+"天罗侯。");
}
}
//output
輸入日期:211年3月1日
211年3月1日是這一年的第60天器腋。
輸入日期:444nian3yue5ri
444nian3yue5ri 是這一年的第 65 天。
【程序 15】
題目:輸入三個(gè)整數(shù) x,y,z钩杰,請(qǐng)把這三個(gè)數(shù)由小到大輸出纫塌。
解答:
利用 Scanner 類中 nextInt()進(jìn)行數(shù)據(jù)的讀取,Arrays.sort(a)進(jìn)行排序讲弄,程序設(shè)計(jì)如下:
import java.io.*;
import java.util.*;
public class Text15xin {
public static void main(String[] args) throws IOException {
String m=new String("");
int[] a={0,0,0};
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
System.out.print("輸入三個(gè)數(shù)(以一個(gè)空格隔開):");
m=stdin.readLine();
Scanner scan=new Scanner(m);
for(int i=0;i<3;i++)
{
a[i]=scan.nextInt();
}
Arrays.sort(a);
System.out.print("三個(gè)數(shù)的升序排列為:");
for(int i=0;i<3;i++)
{
System.out.print(a[i]+" ");
}
}
}
【程序 16】
題目:輸出 9*9 口訣措左。
1.程序分析:分行與列考慮,共 9 行 9 列避除,i 控制行怎披,j 控制列。解答:
此題較為簡(jiǎn)單瓶摆,程序設(shè)計(jì)如下:
public class Text16 {
public static void main(String[] args)
{
for(int i=1;i<=9;i++)
{
for(int j=1;j<=i;j++)
{
System.out.print(j+"*"+i+"="+i*j+" ");
}
System.out.println("");
}
}
}
【程序 17】
題目:猴子吃桃問題:猴子第一天摘下若干個(gè)桃子凉逛,當(dāng)即吃了一半,還不癮群井,又多吃了一個(gè)
第二天早上又將剩下的桃子吃掉一半状飞,又多吃了一個(gè)。以后每天早上都吃了前一天剩下 的
一半零一個(gè)书斜。到第 10 天早上想再吃時(shí)昔瞧,見只剩下一個(gè)桃子了。求第一天共摘了多少菩佑。
解答:
分析:采取逆向思維的方法,從后往前推斷凝化。
public class Text17 {
public static void main(String[] args) {
int a=1;//第十個(gè)月的桃子個(gè)數(shù)
int b=10;//用b-1來(lái)表示所經(jīng)過的月數(shù)
for(int i=b-1;i>=1;i--)
{
a=(a+1)*2;
}
System.out.print(a);
}
}
【程序 18】
題目:兩個(gè)乒乓球隊(duì)進(jìn)行比賽稍坯,各出三人。甲隊(duì)為 a,b,c 三人搓劫,乙隊(duì)為 x,y,z 三人瞧哟。已抽簽
決定比賽名單。有人向隊(duì)員打聽比賽的名單枪向。a 說他不和 x 比勤揩,c 說他不和 x,z 比,請(qǐng)編程
序找出三隊(duì)賽手的名單秘蛔。
解答:
分析:
其實(shí)問題可轉(zhuǎn)化為排列組合問題陨亡,a 可以選 x,y,z 中的一個(gè)傍衡,b 可以選剩下兩個(gè)中的一個(gè),
而 c 只能選最后剩下的一個(gè)负蠕,總共有 6 中可能蛙埂。關(guān)于排列的實(shí)現(xiàn)可以參照程序 11,具體程
序如下:
public class Text18 {
public static void main(String[] args) {
Character[] b={'x','y','z'};
for(int j=0;j<3;j++)
{
for(int k=0;k<3;k++)
{
if(j==k)
continue;
for(int h=0;h<3;h++)
{
if(h==j||h==k)continue;
if(b[j]!='x'&&b[h]!='x'&&b[h]!='z')
{
String s1=b[j].toString();
String s2=b[k].toString();
String s3=b[h].toString();
System.out.println(" a"+"(vs)"+s1+" b"+"(vs)"+s2+"
c"+"(vs)"+s3);
}
}
}
}
}
}
//output:
a(vs)z b(vs)x c(vs)y
【程序 19】
題目:打印出如下圖案(菱形)
*
***
******
********
******
***
*
解答:
1.先把圖形分成兩部分來(lái)看待遮糖,前四行一個(gè)規(guī)律绣的,后三行一個(gè)規(guī)律,利用雙重 for 循環(huán)欲账,第
一層控制行屡江,第二層控制列。問題比較簡(jiǎn)單赛不,就不進(jìn)行編程了惩嘉。
2 為了使問題具有一般性,現(xiàn)在我們輸入菱形的行數(shù)俄删,編程實(shí)現(xiàn)菱形的繪制宏怔。
分析:
1、輸入的列數(shù)必須為行數(shù)
2畴椰、假設(shè)輸入的數(shù)字為 n臊诊,則第(n+1)/2 為中間一行,進(jìn)行一些簡(jiǎn)單的數(shù)學(xué)推導(dǎo)斜脂,便能推
出具體某一行的打印情況抓艳,程序設(shè)計(jì)如下:
import java.io.*;
public class Text19 {
public static void main(String[] args) throws Exception{
int n=0;
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
System.out.print("請(qǐng)輸入菱形行數(shù):");
n=(new Integer(stdin.readLine()));
if(n%2!=0)
{
for(int i=1;i<=(n+1)/2;i++)
{
for(int j=1;j<=(n-1)/2+i;j++)
{
if(j<=(n+1)/2-i)
{
System.out.print(" ");
}
else
System.out.print("*");
}System.out.println("");
}
for(int i=(n+3)/2;i<=n;i++)
{
for(int j=1;j<=(3*n+1)/2-i;j++)
{
if(j<=i-(n+1)/2)
{
System.out.print(" ");
}
else
System.out.print("*");
}
System.out.println("");
}
}
else
System.out.print("請(qǐng)確保行數(shù)為奇數(shù)!");
}
}
//output:
請(qǐng)輸入菱形行數(shù):7
*
***
*****
*******
*****
***
*
【程序20】
題目:有一分?jǐn)?shù)序列:2/1帚戳,3/2玷或,5/3,8/5片任,13/8偏友,21/13...求出這個(gè)數(shù)列的前20項(xiàng)之和。
解答:
分析:請(qǐng)抓住分子與分母的變化規(guī)律对供。 分子分母都是斐波那契數(shù)列位他,遞推公式的得出較為
簡(jiǎn)單,程序設(shè)計(jì)如下:
public class Text20 {
public static void main(String[] args) {
float fenmu=1;float fenzi=2;
float sum=fenzi/fenmu;
float t=0;
for(int i=1;i<20;i++)
{
t=fenmu+fenzi;
fenmu=fenzi;
fenzi=t;
sum=sum+fenzi/fenmu;
}
System.out.print(sum);
}
}
//output:
32.660263
【程序21】
題目:求1+2!+3!+...+20!的和
解答:注意:由于數(shù)據(jù)較大产场,應(yīng)該將數(shù)據(jù)類型設(shè)為double鹅髓,當(dāng)所得數(shù)據(jù)超過double的最大值時(shí),顯
示為Infinity京景。而當(dāng)數(shù)據(jù)類型設(shè)為int或者其他不是double類型的時(shí)候窿冯,超過該類型的
最大值時(shí),溢出确徙,先往符號(hào)位進(jìn)一位醒串,顯示為負(fù)數(shù)执桌,當(dāng)再進(jìn)位時(shí),則進(jìn)行窄化處理厦凤,顯示這
個(gè)類型所占字節(jié)的大小鼻吮。
public class Text21 {
public static void main(String[] args)
{
double sum=0;double jiecheng=1;
for(int i=1;i<=20;i++)
{
jiecheng=i*jiecheng;
sum=sum+jiecheng;
}
System.out.println(sum);
System.out.print(Double.MAX_VALUE);
}
}
//output:
2.5613274941118203E18
1.7976931348623157E308
【程序22】
題目:利用遞歸方法求5!。
解答:
此題較為簡(jiǎn)單较鼓,不進(jìn)行編程椎木,現(xiàn)將題目改為求200!博烂。
分析:
200香椎!大于Double類的最大值,所以如果用普通數(shù)據(jù)類型將200禽篱!進(jìn)行存儲(chǔ)畜伐,明顯難以達(dá)到
要求。現(xiàn)構(gòu)建一個(gè)容器躺率,容器里面的存放變量玛界,當(dāng)該層的數(shù)為n且大于等于十時(shí),往前一層
進(jìn)(n-n%10)/10悼吱,自身保留n%10慎框。這種程序設(shè)計(jì)下最大可求出292!(理論上能計(jì)算所有正
整數(shù)的階乘后添,此處出現(xiàn)問題笨枯,但尚未分析出來(lái),希望有人能指出來(lái))遇西,而按照程序21中的
方法則只能計(jì)算到170馅精!。
程序設(shè)計(jì)如下:
import java.util.*;
class ShuJu
{
double h;//設(shè)置成double將能進(jìn)行更大數(shù)據(jù)的運(yùn)算粱檀,至少比text21中的計(jì)算能力要大
ShuJu(double i)
{
h=i;
}
}
public class Text22 {
public static void jiecheng(Vector<ShuJu> m,int a)
{
ShuJu n=new ShuJu(1);
m.addElement(n);
for(int i=1;i<=a;i++)
{
int g=m.size();
for(int j=0;j<g;j++)
{
m.elementAt(j).h=m.elementAt(j).h*i;
}
for(int j=0;j<g;j++){
double k=m.elementAt(j).h;
if(k>=10)
{
m.elementAt(j).h=k%10;
if(j+1>=g)
m.addElement(new ShuJu((k-m.elementAt(j).h)/10));
//注意要減去余數(shù)洲敢,數(shù)據(jù)類型是double的,不進(jìn)行這項(xiàng)操作將會(huì)存儲(chǔ)為小數(shù)茄蚯。
else
m.elementAt(j+1).h=m.elementAt(j+1).h+(k-m.elementAt(j).h)/10;
}
else
m.elementAt(j).h=k;
}
}
int flag=m.size()-1;
while(m.elementAt(flag).h>=10)//這個(gè)while循環(huán)是使得最高位的值向前轉(zhuǎn)化沦疾,存入容
器。
//不進(jìn)行這個(gè)循環(huán)將會(huì)導(dǎo)致容器的最高位為一個(gè)很大的數(shù)
{
double ch=m.elementAt(flag).h;
m.elementAt(flag).h=ch%10;
m.addElement(new ShuJu(((ch-m.elementAt(flag).h)/10)));
flag=flag+1;
}
}
public static void main(String[] args)
{
Vector<ShuJu> pool=new Vector<ShuJu>();
int x=200;int zeros=0;int flag=0;
jiecheng(pool,x);
for(int i=0;pool.elementAt(i).h==0;i++)
{
zeros++;//確保后面連續(xù)的零不進(jìn)行輸出
}
System.out.print((int)pool.elementAt(pool.size()-1).h+".");
//需將數(shù)據(jù)轉(zhuǎn)化為int型的第队,不進(jìn)行轉(zhuǎn)化將會(huì)導(dǎo)致輸出為double型的,將會(huì)引進(jìn)無(wú)用的小
數(shù)點(diǎn)
for(int i=pool.size()-2;i>=zeros;i--)
{
System.out.print((int)pool.elementAt(i).h);
flag++;
if(flag>=10)//小數(shù)點(diǎn)后保留多少位小數(shù)
break;
}
System.out.print("*E"+(pool.size()-1));//輸出指數(shù)標(biāo)志
}
}
//output:
7.8865786736*E374
【程序23】
題目:有5個(gè)人坐在一起刨秆,問第五個(gè)人多少歲凳谦?他說比第4個(gè)人大2歲。問第4個(gè)人歲數(shù)衡未,他說比第3個(gè)人大2歲尸执。問第三個(gè)人家凯,又說比第2人大兩歲。問第2個(gè)人如失,說比第一個(gè)人大兩歲绊诲。
最后問第一個(gè)人,他說是10歲褪贵。請(qǐng)問第五個(gè)人多大掂之?
解答:
此題較為簡(jiǎn)單,此處省略脆丁。
【程序24】
題目:給一個(gè)不多于5位的正整數(shù)世舰,要求:一、求它是幾位數(shù)槽卫,二跟压、逆序打印出各位數(shù)字。
解答:
1歼培、 可先得到輸入的字符串s震蒋,然后利用new Integer(s)將字符串轉(zhuǎn)為數(shù)字,再進(jìn)行除法運(yùn)算躲庄,
則可得出相應(yīng)答案查剖,但這樣做有些復(fù)雜。
2读跷、 可先得到輸入的字符串s梗搅,利用s.getBytes()可得到相應(yīng)的Byte數(shù)組,再將數(shù)組處理一下效览,
逆序輸出即可无切。程序設(shè)計(jì)如下:
//此程序?qū)τ谌我馕坏恼麛?shù)都行
import java.io.*;
public class Text24 {
public static void main(String[] args) throws Exception{
String s=new String("");
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
System.out.print("請(qǐng)輸入一個(gè)正整數(shù):");
s=stdin.readLine();
byte[]bytes=s.getBytes();
System.out.println("它是"+bytes.length+"位數(shù)");
for(int i=bytes.length-1;i>=0;i--)
{
System.out.print(bytes[i]-'0');
}
}
}
//output:
請(qǐng)輸入一個(gè)正整數(shù):123456
它是6位數(shù)
654321
【程序25】
題目:一個(gè)5位數(shù),判斷它是不是回文數(shù)丐枉。即12321是回文數(shù)哆键,個(gè)位與萬(wàn)位相同,十位與千
位相同瘦锹。
解答:
可按照程序24的思路對(duì)此題進(jìn)行解答籍嘹,程序設(shè)計(jì)如下:
//該程序不限制在5位數(shù)
import java.io.*;
public class Text25 {
public static void main(String[] args) throws Exception{
String s=new String("");
int flag=0;
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
System.out.print("請(qǐng)輸入一個(gè)正整數(shù):");
s=stdin.readLine();
byte[]bytes=s.getBytes();
System.out.println("它是"+bytes.length+"位數(shù)");
for(int i=0;i<bytes.length;i++)
{
if(bytes[i]!=bytes[bytes.length-1-i])
{
flag=1;break;
}
}
if(flag==0)
System.out.print("該數(shù)是回文數(shù)。");
else
System.out.print("該數(shù)不是回文數(shù)弯院。");
}
}
//output:
請(qǐng)輸入一個(gè)正整數(shù):1234321
它是7位數(shù)
該數(shù)是回文數(shù)辱士。
【程序26】
題目:請(qǐng)輸入星期幾的第一個(gè)字母來(lái)判斷一下是星期幾,如果第一個(gè)字母一樣听绳,則繼續(xù) 判
斷第二個(gè)字母颂碘。
解答:程序設(shè)計(jì)如下:
import java.io.*;
public class Text26 {
public static void main(String[] args) throws Exception{
String s=new String("");char c=' ';char d=' ';
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
System.out.print("請(qǐng)輸入英文字母:");
s=stdin.readLine();
byte[]bytes=s.getBytes();
c=(char)bytes[0];
if(bytes.length>=2)
d=(char)bytes[1];
switch(c)
{
case 'M':
System.out.print("星期一");
break;
case 'm':
System.out.print("星期一");
break;
case 'T':
if(d=='u'||d=='U')
System.out.print("星期二");
if(d=='h'||d=='H')
System.out.print("星期四");
break;
case 't':
if(d=='u'||d=='U')
System.out.print("星期二");
if(d=='h'||d=='H')
System.out.print("星期四");
break;
case 'W':
System.out.print("星期三");
break;
case 'w':
System.out.print("星期三");break;
case 'F':
System.out.print("星期五");
break;
case 'f':
System.out.print("星期五");
break;
case 'S':
if(d=='a'||d=='A')
System.out.print("星期六");
if(d=='u'||d=='U')
System.out.print("星期天");
break;
case 's':
if(d=='a'||d=='A')
System.out.print("星期六");
if(d=='u'||d=='U')
System.out.print("星期天");
break;
}
}
}
【程序27】
題目:求100之內(nèi)的素?cái)?shù)
解答:和程序2一樣
public class Text27 {
public static void main(String[] args) {
int sum=0;
System.out.print("100以內(nèi)的素?cái)?shù)是: ");
System.out.print(2+" ");
for(int i=3;i<100;i++)
{
int flag=0;
for(int j=2;j<=Math.sqrt(i);j++)
{
float k=(float)i;
if(k%j==0)
{
flag=1;
break;
}
}
if(flag==0)
{
System.out.print(i+" ");
sum++;
}
}
System.out.println("");
System.out.print("素?cái)?shù)個(gè)數(shù)為: ");
System.out.print(sum+1);
}}
//output
100以內(nèi)的素?cái)?shù)是: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67
71 73 79 83 89 97
素?cái)?shù)個(gè)數(shù)為: 25
【程序28】
題目:對(duì)10個(gè)數(shù)進(jìn)行排序
1、利用Array.sort()方法進(jìn)行排序椅挣,可參見程序15头岔,程序設(shè)計(jì)較為簡(jiǎn)單塔拳,此處省略。
2峡竣、現(xiàn)將冒泡排序和選擇的程序?qū)懗鰜?lái)靠抑。
冒泡排序
public class MaoPao {
public static void main(String[] args) {
int[] a={3,6,4,2,9,5,8,1,7,0};
int temp=0;int flag=0;
for(int i=0;i<a.length-1;i++)
{
for(int j=0;j<a.length-i-1;j++)
{
if(a[j]<a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
flag=1;
}
}
if(flag==0)
break;
}
for(int i=0;i<a.length;i++)
{
System.out.print(a[i]+" ");
}
}
}
選擇排序
public class XuanZe {
public static void main(String[] args) {
int[] a={3,6,4,2,9,5,8,1,7,0};
int temp=0;int flag=0;
for(int i=0;i<a.length-1;i++)
{
flag=i;
for(int j=i+1;j<a.length;j++)
{
if(a[flag]<a[j])
{
flag=j;
}
}
if(flag!=i)
{
temp=a[flag];
a[flag]=a[i];a[i]=temp;
}
}
for(int i=0;i<a.length;i++)
{
System.out.print(a[i]+" ");
}
}
}
當(dāng)然還有其他的排序方式,如希爾排序适掰,基數(shù)排序等颂碧,可百度它們的排序規(guī)則,再按照這些
規(guī)則編程即可攻谁,此處不對(duì)這些排序進(jìn)行編程稚伍。各種排序的性能如下圖所示:
【程序29】
題目:求一個(gè)3*3矩陣對(duì)角線元素之和
1.程序分析:利用雙重for循環(huán)控制輸入二維數(shù)組,再將a[i][i]累加后輸出戚宦。
解答:
為具有一般性个曙,現(xiàn)設(shè)計(jì)自主輸入n*n的矩陣,并求出對(duì)角線元素之和受楼。
import java.io.*;
import java.util.*;
public class Text29
{
public static void main(String args[]) throws IOException
{
int n=0;
System.out.print("請(qǐng)輸入矩陣的維數(shù):");
Scanner reader = new Scanner(System.in);
n=reader.nextInt();
String[] s=new String[n];
Scanner[] scan=new Scanner[n];
long[][] a=new long[n][n];
long sum=0;
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
for(int i=0;i<n;i++)
{
s[i]=stdin.readLine(); //連續(xù)輸入多行
}
System.out.println("output:");
for(int i=0;i<n;i++){
scan[i]=new Scanner(s[i]);
}for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
a[i][j]=scan[i].nextLong();
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
System.out.print(a[i][j]+" ");
if(i==j)
{
sum=sum+a[i][j];
}
}
System.out.println("");
}
System.out.println("對(duì)角線數(shù)值和為:"+sum);
}
}
//input
請(qǐng)輸入矩陣的維數(shù):5
1 2 3 4 5
6 7 8 9 0
0 9 8 7 6
5 4 3 2 1
3 4 5 6 7
output:
1 2 3 4 5
6 7 8 9 0
0 9 8 7 6
5 4 3 2 1
3 4 5 6 7
對(duì)角線數(shù)值和為:25
【程序30】
題目:有一個(gè)已經(jīng)排好序的數(shù)組】寻幔現(xiàn)輸入一個(gè)數(shù),要求按原來(lái)的規(guī)律將它插入數(shù)組中艳汽。
解答:
利用已經(jīng)有的類和方法進(jìn)行編程是java的核心思想猴贰。List類可以使用Collections.sort(List a)進(jìn)
行排序,可以利用add(int x,long m)進(jìn)行插入河狐,相當(dāng)簡(jiǎn)便米绕,實(shí)現(xiàn)多個(gè)數(shù)據(jù)的插入可以仿照下面
的程序?qū)懗觥>唧w程序如下:(關(guān)于類和方法不懂的可以查看JDK工具)
import java.io.*;
import java.util.*;
public class Text31xin {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
System.out.print("請(qǐng)輸入需要排列的數(shù)字(以空格鍵隔開):");
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
Scanner scan=new Scanner(stdin.readLine());
List<Long> p=new ArrayList<Long>();for(int i=0;scan.hasNext();i++)
{
p.add(scan.nextLong());
}
Collections.sort(p); //建議在JDK多看看這個(gè)方法
System.out.print("排列后的順序?yàn)椋?);
for(int i=0;i<p.size();i++)
System.out.print(p.get(i)+" ");
System.out.println("");
System.out.print("請(qǐng)輸入需要插入的數(shù)值:");
long m=new Long(stdin.readLine());
for(int i=0;i<p.size();i++)
{
if(m>=p.get(i)) //等號(hào)是必要的馋艺,可以減少一個(gè)數(shù)據(jù)的后移
continue;
p.add(i,m);
break;
}
System.out.print("插入后的順序?yàn)椋?);
for(int i=0;i<p.size();i++)
System.out.print(p.get(i)+" ");
}
}
//output
請(qǐng)輸入需要排列的數(shù)字(以空格鍵隔開):9 8 7 6 4 3 2 1
排列后的順序?yàn)椋? 2 3 4 6 7 8 9
請(qǐng)輸入需要插入的數(shù)值:5
插入后的順序?yàn)椋? 2 3 4 5 6 7 8 9
【程序31】
題目:將一個(gè)數(shù)以二進(jìn)制形式輸出栅干。
1、可利用Integer.toBinaryString(i)進(jìn)行輸出捐祠。
2碱鳞、可利用與運(yùn)算以及位移運(yùn)算進(jìn)行程序設(shè)計(jì),設(shè)計(jì)的程序如下:
import java.io.*;
public class Text31{
public static void toBinary(int x)
{
int flag=0x80000000; //int型占四個(gè)字節(jié)踱蛀,注意利用16進(jìn)制進(jìn)行賦值窿给,更為簡(jiǎn)便
int flag1=0;
for(int i=1;i<=32;i++)
{
if((x&flag)==0)
{
if(flag1==1)
System.out.print(0);
}
else
{
System.out.print(1);
flag1=1; //flag標(biāo)志可使得前面的0不進(jìn)行輸出
}
flag=flag>>>1;}
System.out.println("");
}
public static void main(String[] args) throws Exception {
int x=0;
String s=new String("");
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
System.out.print("請(qǐng)輸入正整數(shù):");
s=stdin.readLine();
x=new Integer(s);
toBinary(x);
}
}
//output
請(qǐng)輸入正整數(shù):12
1100
請(qǐng)輸入正整數(shù):2047
11111111111
【程序32】
題目:取一個(gè)整數(shù)a從右端開始的5~8位。
解答:
(1)先使a右移4位率拒。
(2)設(shè)置一個(gè)低4位全為1,其余全為0的數(shù)崩泡。可用~(~0<<4)
(3)將上面二者進(jìn)行&運(yùn)算猬膨。
import java.io.*;
public class Text32 {
public static void main(String[] args) throws Exception{
int n=5;int m=8;
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
System.out.print("請(qǐng)輸入一個(gè)正整數(shù):");
int a=new Integer(stdin.readLine());
int b=~(~0<<(m-n+1));
int c=a>>>(m-n+1);
int d=c&b;
System.out.print("正整數(shù)的二進(jìn)制形式為:");
System.out.println(Integer.toBinaryString(a));
System.out.print("正整數(shù)的從右端開始的5~8位為:");
int k=Integer.toBinaryString(d).length();
if(k<m-n+1)
for(int i=k;i<m-n+1;i++)
System.out.print("0");//對(duì)前面的0進(jìn)行輸出
System.out.print(Integer.toBinaryString(d));
}
}
//output
請(qǐng)輸入一個(gè)正整數(shù):289
正整數(shù)的二進(jìn)制形式為:100100001
正整數(shù)的從右端開始的5~8位為:0010
【程序33】
題目:打印出楊輝三角形(要求打印出10行如下圖)
解答:
分析:
1 1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
楊輝三角的數(shù)學(xué)關(guān)系允华,可自己查閱,程序設(shè)計(jì)如下:
import java.io.*;
import java.util.*;
public class Text33 {
public static void main(String[] args) throws Exception{
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
System.out.print("請(qǐng)輸入需要打印的行數(shù):");
int n=new Integer(stdin.readLine());
Vector<Integer> vector1=new Vector<Integer>();;
for(int i=1;i<=n;i++)
{
Vector<Integer> vector=new Vector<Integer>();
for(int j=1;j<=n-i;j++)
{
System.out.print(" ");//打印前面的空白
}
vector.addElement(1);
if(i>=3)
{
for(int k=2;k<=i-1;k++)
{
int m=vector1.elementAt(k-2)+vector1.elementAt(k-1);
vector.addElement(m);
}
}
if(i>=2)
vector.addElement(1);
vector1=vector;
for(int h=0;h<vector.size();h++)
{
System.out.print(vector.elementAt(h)+" ");
}
System.out.println("");
}
}
}
//output
請(qǐng)輸入需要打印的行數(shù):10
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1
【程序34】
題目:輸入3個(gè)數(shù)a,b,c,按大小順序輸出靴寂。
解答:與程序15相同,此處不做解答召耘。
【程序35】
題目:輸入數(shù)組百炬,最大的與第一個(gè)元素交換,最小的與最后一個(gè)元素交換污它,輸出數(shù)組剖踊。
解答:
程序設(shè)計(jì)如下:
import java.io.*;
import java.util.*;
public class Text35 {
public static void main(String[] args) throws Exception{
System.out.print("請(qǐng)輸入需要排列的數(shù)字(以空格鍵隔開):");
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
Scanner scan=new Scanner(stdin.readLine());
List<Long> p=new ArrayList<Long>();
for(int i=0;scan.hasNext();i++)
{
p.add(scan.nextLong());
}
int flag=0;
int flag1=p.size()-1;
long temp=0;
for(int i=1;i<p.size();i++)
{
if(p.get(flag)<p.get(i))
flag=i;
}
if(flag!=0)
{
temp=p.get(0);
p.set(0,p.get(flag));
p.set(flag,temp);
}
for(int i=p.size()-2;i>=0;i--)
{
if(p.get(flag1)>p.get(i))
flag1=i;
}
if(flag1!=p.size()-1)
{
temp=p.get(p.size()-1);
p.set(p.size()-1,p.get(flag1));
p.set(flag1,temp);
}
System.out.print("改變后的順序?yàn)椋?);
for(int i=0;i<p.size();i++)
System.out.print(p.get(i)+" ");
}
}
//output請(qǐng)輸入需要排列的數(shù)字(以空格鍵隔開):6 7 8 9 5 4 1 2 3
改變后的順序?yàn)椋? 7 8 6 5 4 3 2 1
請(qǐng)輸入需要排列的數(shù)字(以空格鍵隔開):2 3 1 1 5 5 4
改變后的順序?yàn)椋? 3 1 4 2 5 1 (最大的取從左到右的第一個(gè),最小的取從右到左的第
一個(gè))
【程序36】
題目:有n個(gè)整數(shù)衫贬,使其前面各數(shù)順序向后移m個(gè)位置德澈,最后m個(gè)數(shù)變成最前面的m個(gè)數(shù)
import java.io.*;
import java.util.*;
public class Text36 {
public static void main(String[] args) throws Exception{
System.out.print("請(qǐng)輸入需要排列的數(shù)字(以空格鍵隔開):");
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
Scanner scan=new Scanner(stdin.readLine());
List<Long> p=new ArrayList<Long>();
for(int i=0;scan.hasNext();i++)
{
p.add(scan.nextLong());
}
System.out.print("請(qǐng)輸入需要向后移動(dòng)的位數(shù):");
long m=new Long(stdin.readLine());
if(m<=p.size())
{
int n=p.size();
for(int i=1;i<=m;i++)
p.add(0,p.get(n-1));//插入一位,全部后移移位固惯,故要移走的總是最后一個(gè)
System.out.print("移動(dòng)后的順序?yàn)椋?);
for(int i=0;i<n;i++) //p的大小改變梆造,應(yīng)該打印原先的大小n
System.out.print(p.get(i)+" ");
}
else
System.out.print("error!");
}
}
//output
請(qǐng)輸入需要排列的數(shù)字(以空格鍵隔開):1 2 3 4 5 6 7 8 9
請(qǐng)輸入需要向后移動(dòng)的位數(shù):4
移動(dòng)后的順序?yàn)椋? 7 8 9 1 2 3 4 5
【程序37】
題目:有n個(gè)人圍成一圈,順序排號(hào)葬毫。從第一個(gè)人開始報(bào)數(shù)(從1到3報(bào)數(shù))镇辉,凡報(bào)到3的人
退出圈子,問最后留下的是原來(lái)第幾號(hào)的那位贴捡。
解答:
import java.io.*;
import java.util.*;
public class Text37 {
public static void main(String[] args) throws Exception{
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
System.out.print("請(qǐng)輸入總?cè)藬?shù):");
int n=new Integer(stdin.readLine());
System.out.print("請(qǐng)輸入循環(huán)人數(shù):");
int m=new Integer(stdin.readLine());
List<Integer> p=new ArrayList<Integer>();int flag=1;
int flag1=0;
for(int i=0;i<n;i++)
{
p.add(i+1);
}
while(true)
{
flag1=0;
for(int j=0;j<p.size();j++)
{
if(p.get(j)!=0) //0表示這個(gè)人已經(jīng)被移除
{
flag1++; //計(jì)算還存在的人數(shù)
if(flag==m) //判斷是否移除
{
p.set(j,0); //移除該人
flag=1; //判斷標(biāo)志重置
}
else
flag++; //判斷標(biāo)志加1
}
}
if(flag1==1) //設(shè)置最后剩下的人是一個(gè)(不能設(shè)置為任意人數(shù)忽肛,否則不能跳
出)
break;
}
System.out.print("最后剩下的是");
for(int i=0;i<p.size();i++)
{
if(p.get(i)!=0) //0的表示已經(jīng)移除,不打印出來(lái)
System.out.print("序號(hào)為"+p.get(i)+"的人");
}
}
}
//output
請(qǐng)輸入總?cè)藬?shù):600
請(qǐng)輸入循環(huán)人數(shù):7
最后剩下的是序號(hào)為48的人
【程序38】
題目:寫一個(gè)函數(shù)烂斋,求一個(gè)字符串的長(zhǎng)度屹逛,在main函數(shù)中輸入字符串,并輸出其長(zhǎng)度汛骂。
解答:
1罕模、利用類中的方法可直接求出。
2香缺、判斷當(dāng)前的值是否為“\n”手销,程序設(shè)計(jì)較為簡(jiǎn)單,不做解答图张。
【程序39】
題目:編寫一個(gè)函數(shù)锋拖,輸入n為偶數(shù)時(shí),調(diào)用函數(shù)求1/2+1/4+...+1/n,當(dāng)輸入n為奇數(shù)時(shí)祸轮,調(diào)
用函數(shù)1/1+1/3+...+1/n(利用指針函數(shù))
解答:
程序設(shè)計(jì)較為簡(jiǎn)單兽埃,此處省略。(可參見程序20)适袜。
【程序40】
題目:字符串比較柄错。
解答:1、利用字符串中類的方法進(jìn)行實(shí)現(xiàn)。public int compareToIgnoreCase(String str)
2售貌、逐一比較给猾,采用遞歸方法,程序設(shè)計(jì)如下:
import java.io.*;
public class Text40 {
public static int compare(String a,String b)
{
char[] x=a.toCharArray();
char[] y=b.toCharArray();
int k=x.length;
int g=y.length;
int kk=k;
if(k>g)
k=g; //取較短字符串的長(zhǎng)度范圍進(jìn)行比較
for(int i=0;i<k;i++)
{
char u=Character.toLowerCase(x[i]); //都轉(zhuǎn)換成小寫
char t=Character.toLowerCase(y[i]);
if(u>t)
return 1; //大于則返回1
if(u<t)
return -1; //小于返回-1颂跨,等于的話則執(zhí)行下一次循環(huán)
} //結(jié)束后則說明敢伸,在這段相同的范圍內(nèi),它們是相等的恒削,則需要比較長(zhǎng)度
if(kk==g)
return 0;
if(kk>g)
return 1;
return -1;
}
public static void main(String[] args) throws Exception{
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
System.out.print("請(qǐng)輸入第一個(gè)字符串:");
String n=stdin.readLine();
System.out.print("請(qǐng)輸入第二個(gè)字符串:");
String m=stdin.readLine();
int daxiao=compare(n,m);
if(daxiao==0)
System.out.print(n+"="+m);
if(daxiao==1)
System.out.print(n+">"+m);
if(daxiao==-1)
System.out.print(n+"<"+m);
}
}
//
請(qǐng)輸入第一個(gè)字符串:aBcd
請(qǐng)輸入第二個(gè)字符串:ABCD
aBcd=ABCD
請(qǐng)輸入第一個(gè)字符串:abcd
請(qǐng)輸入第二個(gè)字符串:accd
abcd<accd
請(qǐng)輸入第一個(gè)字符串:abcde
請(qǐng)輸入第二個(gè)字符串:abcd
abcde>abcd【程序41】
題目:海灘上有一堆桃子池颈,五只猴子來(lái)分。第一只猴子把這堆桃子平均分為五份钓丰,多了一個(gè)躯砰,
這只猴子把多的一個(gè)扔入海中,拿走了一份携丁。第二只猴子把剩下的桃子又平均分成五份琢歇,又
多了一個(gè),它同樣把多的一個(gè)扔入海中则北,拿走了一份矿微,第三、第四尚揣、第五只猴子都是這樣做
的涌矢,問海灘上原來(lái)最少有多少個(gè)桃子?
解答:
這題可以逆向思考得出答案快骗,第五個(gè)猴子分的時(shí)候有m個(gè)桃子娜庇,根據(jù)分的邏輯關(guān)系可知第
四個(gè)猴子分的時(shí)候有m*5/4+1個(gè)桃子,根據(jù)此關(guān)系依次遞推方篮。假設(shè)第5個(gè)猴子得到了n個(gè)桃子名秀,
則有m=5*n+1的數(shù)學(xué)關(guān)系。必須保證每次分的時(shí)候桃子的個(gè)數(shù)為整數(shù)藕溅,猴子得到的桃子數(shù)
也為整數(shù)匕得。(要確保這一點(diǎn),需要每次m都能被4整除)巾表。
public class Text41 {
public static void main(String[] args) {
int n=1;
int m=0;
int flag=1;
int monkeyNum=5;
while(true)
{
flag=1;
m=monkeyNum*n+1;
for(int i=monkeyNum;i>=1;i--)
{
if(m%(monkeyNum-1)==0)
{
m=m/(monkeyNum-1)*monkeyNum+1;
flag++; //計(jì)算多少次的桃子數(shù)量被4整除
}
else
break;
}
if(flag==monkeyNum) //每次的桃子數(shù)量都能被4整除
break;
n++;
}
System.out.println("開始的桃子數(shù)至少是:"+m);
System.out.print("此時(shí)第五個(gè)猴子得到的桃子數(shù)是:"+n);
}
}
//output
開始的桃子數(shù)至少是:3121
此時(shí)第五個(gè)猴子得到的桃子數(shù)是:255
【程序42】
題目:809*??=800*??+9*??+1 其中??代表的兩位數(shù),8*??的結(jié)果為兩位數(shù)汁掠,9*??的結(jié)果為
3位數(shù)。求??代表的兩位數(shù)集币,及809*??后的結(jié)果考阱。
解答:此題貌似有問題,不做解答鞠苟。
【程序43】
題目:求0—7所能組成的奇數(shù)個(gè)數(shù)乞榨。
題目表述不清不做解答秽之。
【程序44】
題目:一個(gè)偶數(shù)總能表示為兩個(gè)素?cái)?shù)之和。
不會(huì)吃既,不明白這種證明要怎么去編程實(shí)現(xiàn)考榨。
【程序45】題目:判斷一個(gè)素?cái)?shù)能被幾個(gè)9整除
題目表述不清不做解答。
【程序46】
題目:兩個(gè)字符串連接程序
解答:
1鹦倚、直接使用“+”運(yùn)算符即可董虱。
2、 public String concat(String str) 方法申鱼,"cares".concat("s") returns "caress" ,
"to".concat("get").concat("her") returns "together"云头。
【程序47】
題目:讀取7個(gè)數(shù)(1—50)的整數(shù)值捐友,每讀取一個(gè)值,程序打印出該值個(gè)數(shù)的*溃槐。
解答:
程序較為簡(jiǎn)單匣砖,此處不做解答。(可參見程序29的輸入方法)
【程序48】
題目:某個(gè)公司采用公用電話傳遞數(shù)據(jù)昏滴,數(shù)據(jù)是四位的整數(shù)猴鲫,在傳遞過程中是加密的,加密
規(guī)則如下:每位數(shù)字都加上5,然后用和除以10的余數(shù)代替該數(shù)字谣殊,再將第一位和第四位交
換拂共,第二位和第三位交換。
解答:
程序設(shè)計(jì)如下:
import java.io.*;
public class Text48 {
public static void main(String[] args) throws Exception {
System.out.print("請(qǐng)輸入需要加密的四位數(shù)整數(shù):");
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
String s=stdin.readLine();
char[] a=s.toCharArray();
int[] b=new int[a.length];
for(int i=0;i<a.length;i++)
{
b[i]=((a[i]-'0')+5)%10;
}
System.out.print("加密后的數(shù)字為:");
for(int i=b.length-1;i>=0;i--)
{
System.out.print(b[i]);
}
}
}
//output
請(qǐng)輸入需要加密的四位數(shù)整數(shù):1234
加密后的數(shù)字為:9876
請(qǐng)輸入需要加密的四位數(shù)整數(shù):4567
加密后的數(shù)字為:2109
【程序49】
題目:計(jì)算字符串中子串出現(xiàn)的次數(shù)
解答:
import java.io.*;
public class Text49 {
public static void main(String[] args) throws Exception {
System.out.print("請(qǐng)輸入字符串:");
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
String s=stdin.readLine();
System.out.print("請(qǐng)輸入子字符串:");String s1=stdin.readLine();
char[] a=s.toCharArray();
char[] b=s1.toCharArray();
int num=0;
int flag=0;
for(int i=0;i<a.length;i++)
{
if(a[i]==b[flag])
{
flag++;
if(flag==b.length -1)
{
num++;
flag=0;
}
}
else
{
flag=0;
}
}
System.out.print("擁有的子字符串個(gè)數(shù)為:"+num);
}
}
//output
請(qǐng)輸入字符串:ab1ab1ab1ab1
請(qǐng)輸入子字符串:ab1
擁有的子字符串個(gè)數(shù)為:4
【程序50】
題目:有五個(gè)學(xué)生姻几,每個(gè)學(xué)生有3門課的成績(jī)宜狐,從鍵盤輸入以上數(shù)據(jù)(包括學(xué)生號(hào),姓名蛇捌,
三門課成績(jī))抚恒,計(jì)算出平均成績(jī),況原有的數(shù)據(jù)和計(jì)算出的平均分?jǐn)?shù)存放在磁盤文件"stud"
中络拌。
import java.io.*;
import java.util.*;
public class Text50 {
public static double meg(float i) //四舍五入保留一位小數(shù)
{
int b = (int)Math.round(i * 10);
double c = (double)b/10.0;
return c;
}
public static void main(String[] agrs) throws Exception
{
FileOutputStream out=new FileOutputStream("stdu.txt");
String n=new String("");
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
for(int i=1;i<=5;i++)
{
String s=stdin.readLine();
Vector<String> vector=new Vector<String>();
byte[] a=s.getBytes();
char[] mass = s.toCharArray();
for(int j=0;j<mass.length;j++) //for 循環(huán)是對(duì)字符串中的數(shù)字進(jìn)行提取{
if(Character.isDigit(mass [j])||mass [j]==46)
n=n+mass[j];
else
{
if(!n.isEmpty())
{
vector.addElement(n);
n=new String("");
}
}
if(j==mass.length-1&&!n.isEmpty())
{
vector.addElement(n);
n=new String("");
}
}
float[] shu=new float[vector.size()];
float sum=0;
for(int j=0;j<vector.size();j++)
{
shu[j]=Float.parseFloat(vector.elementAt(j));
sum=sum+shu[j];
}
float pinjun=sum/vector.size();
double pinjun1=meg(pinjun);
String sh=Double.toString(pinjun1);
byte[] b=sh.getBytes();
out.write(a);
byte a2='\t';
out.write(a2);
out.write(b);
byte[] a3={'\r','\n'}; //在 txt 中輸出回車
out.write(a3);
}
}
}
//input(輸入人名與數(shù)字之間用 tab 鍵隔開)
張三 78 79 81
李四 78 79 79.5
王二 66 86 86.6
趙五 98 95 93
孫六 78 78 79
//output(在 stdu.txt 中)
zs 張三 78 79 81 79.3
李四 78 79 79.5 78.8
王二 66 86 86.6 79.5
趙五 98 95 93 95.3
孫六 78 78 79 78.3
(觀察輸出結(jié)果可以看出俭驮,第一行多打印了 zs,我用搜狗輸入張三時(shí)是輸入 zs 的春贸,為什么
會(huì)出現(xiàn) zs混萝?以及如何去掉 zs?又為什么下面的幾行沒有這個(gè)問題祥诽?思索良久得不出答案譬圣,
望高人指正。)
50 道 JAVA 基礎(chǔ)編程
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門玖翅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)托呕,“玉大人,你說我怎么就攤上這事屋休。” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵晃跺,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我毫玖,道長(zhǎng)掀虎,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任付枫,我火速辦了婚禮烹玉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘阐滩。我一直安慰自己二打,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開白布叶眉。 她就那樣靜靜地躺著址儒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪衅疙。 梳的紋絲不亂的頭發(fā)上莲趣,一...
- 文/蒼蘭香墨 我猛地睜開眼肋杖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼溉仑!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起状植,我...
- 序言:老撾萬(wàn)榮一對(duì)情侶失蹤浊竟,失蹤者是張志新(化名)和其女友劉穎怨喘,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體振定,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡必怜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了后频。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梳庆。...
- 正文 年R本政府宣布胧后,位于F島的核電站,受9級(jí)特大地震影響抱环,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纸巷,卻給世界環(huán)境...
- 文/蒙蒙 一镇草、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瘤旨,春花似錦梯啤、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至祟偷,卻和暖如春察滑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背修肠。 一陣腳步聲響...
- 正文 我出身青樓饲化,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親吗伤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吃靠,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- 【程序1】 題目:古典問題:有一對(duì)兔子,從出生后第3個(gè)月起每個(gè)月都生一對(duì)兔子足淆,小兔子長(zhǎng)到第三個(gè)月后每個(gè)月又生一對(duì)兔...
- 下面的內(nèi)容是對(duì)網(wǎng)上原有的Java面試題集及答案進(jìn)行了全面修訂之后給出的負(fù)責(zé)任的題目和答案巢块,原來(lái)的題目中有很多重復(fù)題...
- -1- 剛剛有一個(gè)小我兩歲的鄰居弟弟微信上問我礁阁,大學(xué)是什么樣子的,是留在本地好還是去遠(yuǎn)的地方上學(xué)好夕冲。 這個(gè)問題問的...
- 消息是期貨市場(chǎng)中最不靠譜的事情氮兵。 2000 年 11 月 27 日,周一歹鱼,橡膠 0101 合約繼續(xù)穩(wěn)步上漲泣栈,肖遙按...