您的当前位置:首页正文

JAVA编程

2024-03-16 来源:易榕旅网
Java经典问题算法大全

/*【程序1】

题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21....*/

packagecn.com.flywater.FiftyAlgorthm;publicclassFirstRabbit{

publicstaticfinalintMONTH=15;

publicstaticvoidmain(String[]args){

longf1=1L,f2=1L;longf;

for(inti=3;if2=f1+f2;f1=f;

System.out.print(\"第\"+i+\"个月的兔子对数:\");System.out.println(\"\"+f2);}}}

/*【程序2】*作者若水飞天

题目:判断101-200之间有多少个素数,并输出所有素数。

1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,

则表明此数不是素数,反之是素数。*/packagecn.com.flywater.FiftyAlgorthm;publicclassSecondPrimeNumber{publicstaticintcount=0;

publicstaticvoidmain(String[]args){

for(inti=101;i<200;i++){

booleanb=true;//默认此数就素数for(intj=2;j<=Math.sqrt(i);j++){

if(i%j==0){

b=false;//此数不是素数break;

}

}

if(b){

count++;

System.out.print(i+\"\");

}

}

System.out.println(\"\\n素数的个数:\"+count);}

}

/*【程序3】作者若水飞天

题目:打印出所有的\"水仙花数(narcissusnumber)\",所谓\"水仙花数\"是指一个三位数,

其各位数字立方和等于该数本身。例如:153是一个\"水仙花数\",因为153=1的三次方+5的三次方+3的三次方。1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。*/

packagecn.com.flywater.FiftyAlgorthm;publicclassThirdNarcissusNum{staticintb,bb,bbb;

publicstaticvoidmain(String[]args){

for(intnum=101;num<1000;num++){

ThirdNarcissusNumtnn=newThirdNarcissusNum();tnn.f(num);}

}

publicvoidf(intm){

bbb=m/100;

bb=(m%100)/10;b=(m%100)%10;

if((bbb*bbb*bbb+bb*bb*bb+b*b*b)==m){System.out.println(m);}}}

方法二:

publicstaticvoidmain(Stringargs[]){

for(inta=1;a<=9;a++)

for(intb=0;b<=9;b++)

for(intc=0;c<=9;c++)

if(a*a*a+b*b*b+c*c*c==100*a+10*b+c)System.out.println(100*a+10*b+c);

}

/*【程序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的值,重复执行第一步。packagecn.com.flywater.FiftyAlgorthm;importjava.util.Scanner;

publicclassFourthPrimeFactor{staticintn,k=2;

publicstaticvoidmain(String[]args){

Scanners=newScanner(System.in);n=s.nextInt();

System.out.print(n+\"=\");

FourthPrimeFactorfpf=newFourthPrimeFactor();fpf.f(n);}

函数f的第一种情况:publicvoidf(intn){

while(k<=n){if(k==n){

System.out.println(n);break;

}elseif(n>k&&n%k==0){System.out.print(k+\"*\");n=n/k;f(n);break;

}elseif(n>k&&n%k!=0){k++;f(n);break;}}

函数f的第二种情况:publicvoidf(intn){

intj=0;

for(k=2;k*/if(j==1)System.out.println(n+”=”+k);elseSystem.out.println(\"*\"+k);}}}

/*【程序5】作者若水飞天

题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

1.程序分析:(a>b)?a:b这是条件运算符的基本例子。*/packagecn.com.flywater.FiftyAlgorthm;importjava.util.Scanner;publicclassFifthCondition{

//publicstaticfinalintS1=90;//publicstaticfinalintS2=60;staticintgrade;

publicstaticvoidmain(String[]args){

Scannerstr=newScanner(System.in);ints=str.nextInt();

FifthConditionfc=newFifthCondition();grade=fc.compare(s);if(grade==1){

System.out.print('A');}elseif(grade==2){System.out.print('B');}else{

System.out.println('C');}}

publicintcompare(ints){

returns>90?1

:s>60?2:3;

}}

/*【程序6】作者若水飞天

题目:输入两个正整数m和n,求其最大公约数和最小公倍数。1.程序分析:利用辗除法。*/

/*

*在循环中,只要除数不等于0,用较大数除以较小的数,将小的一个数作为下一轮循环的大数,取得的余数作为下一轮循环的较小的数,如此循环直到较小的数的值为0,返回

*较大的数,此数即为最小公约数,最小公倍数为两数之积除以最小公倍数。**/

packagecn.com.flywater.FiftyAlgorthm;importjava.util.Scanner;

publicclassSixthCommonDiviser{

publicstaticvoidmain(String[]args){

inta,b;

Scanners1=newScanner(System.in);Scanners2=newScanner(System.in);a=s1.nextInt();b=s2.nextInt();

SixthCommonDiviserscd=newSixthCommonDiviser();intm=scd.division(a,b);intn=a*b/m;

System.out.println(\"最大公约数:\"+m);System.out.println(\"最小公倍数:\"+n);}

publicintdivision(intx,inty){

intt;

if(xwhile(y!=0){

if(x==y)return1;else{

intk=x%y;x=y;y=k;}}

returnx;}}

/*【程序7】作者若水飞天题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。1.程序分析:利用while语句,条件为输入的字符不为'\\n'.*/packagecn.com.flywater.FiftyAlgorthm;importjava.util.*;

publicclassSeventhCharacterStatistics{staticintdigital=0;staticintcharacter=0;staticintother=0;staticintblank=0;

publicstaticvoidmain(String[]args){

char[]ch=null;

Scannersc=newScanner(System.in);Strings=sc.nextLine();ch=s.toCharArray();

for(inti=0;i='0'&&ch[i]<='9'){digital++;

}elseif((ch[i]>='a'&&ch[i]<='z')||ch[i]>'A'&&ch[i]

<='Z'){

character++;

}elseif(ch[i]==''){blank++;}else{other++;}

}

System.out.println(\"数字个数:\"+digital);

System.out.println(\"英文字母个数:\"+character);System.out.println(\"空格个数:\"+blank);System.out.println(\"其他字符个数:\"+other);}}

/*【程序8】作者若水飞天

题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。*//*

*算法:定义一个变量b,赋初值为0;定义一变量sum,赋初值为0,*进入循环后,将a+b的值赋给b,将sum+b的值赋给sum;*同时,将a增加十倍,++i;继续循环;*循环结束后,输出sum的值。*/

packagecn.com.flywater.FiftyAlgorthm;importjava.util.Scanner;publicclassNumPlus{staticlongb=0;

publicstaticvoidmain(String[]args){

Scanners1=newScanner(System.in);System.out.println(\"inputnumbera:\");inta=s1.nextInt();

Scanners2=newScanner(System.in);

System.out.println(\"inputtimesnumber:\");intn=s2.nextInt();inti=0;longsum=0;while(iSystem.out.println(sum);}}

/*【程序9】

题目:一个数如果恰好等于它的因子之和,这个数就称为\"完数\"。例如6=1+2+3.编程找出1000以内的所有完数。*/

packagecn.com.flywater.FiftyAlgorthm;publicclassNinthWanshu{

publicstaticvoidmain(String[]args){

System.out.println(\"1到1000的完数有:\");for(inti=1;i<1000;i++){intt=0;

for(intj=1;j<=i/2;j++){if(i%j==0){t=t+j;}}

if(t==i){

System.out.print(i+\"\");}}}}

/*【程序10】作者若水飞天

题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?*/

packagecn.com.flywater.FiftyAlgorthm;publicclassTenthTreeFall{staticdoubleheight=100;staticdoubledistance=100;

publicstaticvoidmain(String[]args){

for(inti=1;i<10;i++){height=height/2;

distance=distance+height;}

System.out.println(\"路程:\"+distance);System.out.println(\"高度:\"+height/2);}}

/*【程序11】*作者若水飞天

题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排

列后再去掉不满足条件的排列。*/

/*算法:3个for循环加一个if语句;**/

packagecn.com.flywater.FiftyAlgorthm;publicclassEleventhNumberRange{

publicstaticvoidmain(String[]args){

intcount=0;

for(intx=1;x<5;x++){for(inty=1;y<5;y++){for(intz=1;z<5;z++){

if(x!=y&&y!=z&&x!=z){count++;

System.out.print(x*100+y*10+z+\"if(count%4==0){System.out.println();}}}}}

System.out.println(\"共有\"+count+\"个三位数\");}}

\");

/*【程序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.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。*/

/*注意:要精确到小数点后多少位,用DecimalFormatdf=newDecimalFormat(\"#0.0000\");*

*/

packagecn.com.flywater.FiftyAlgorthm;importjava.text.DecimalFormat;importjava.util.*;

publicclassTwelfthProfitAward{staticdoubleprofit=0;staticdoubleaward=0;

publicstaticvoidmain(String[]args){

Scanners=newScanner(System.in);profit=s.nextInt();

System.out.println(\"输入的利润是\"+profit+\"万\");if(profit>0&&profit<=10){award=profit*0.1;

}elseif(profit>10&&profit<=20){award=10*0.1+(profit-10)*0.075;}elseif(profit>20&&profit<=40){

award=10*0.1+10*0.075+(profit-20)*0.05;}elseif(profit>40&&profit<=60){

award=10*0.1+10*0.075+20*0.05+(profit-40)*0.03;}elseif(profit>60&&profit<=100){

award=20*0.175+20*0.05+20*0.03+(profit-60)*0.015;}elseif(profit>100){

award=20*0.175+40*0.08+40*0.015+(profit-100)*0.01;}

DecimalFormatdf=newDecimalFormat(\"#0.00000\");

System.out.println(\"应该提取的奖金是\"+df.format(award)+\"万\");}}

/*【程序13】

有问题,运行不出结果,且如此循环,很浪费系统资源*作者若水飞天

题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上168后再开方,

如果开方后的结果满足如下条件,即是结果。请看具体分析:*/

packagecn.com.flywater.FiftyAlgorthm;publicclassThirteenthTwiceSqrt{

publicstaticvoidmain(String[]args){

for(longl=1;l<100000;l++){

if(Math.sqrt((long)(l+100))%1==0){if(Math.sqrt((long)(l+168))%1==0){

System.out.println(l+\"加100是一个完全平方数,再加168又

是一个完全平方数\");

}}}}}

*【程序14】*作者若水飞天

题目:输入某年某月某日,判断这一天是这一年的第几天?1.程序分析:以3月5日为例,应该先把前两个月的加起来,

然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。*/

packagecn.com.flywater.FiftyAlgorthm;importjava.util.Scanner;importjava.io.*;publicclassDayNum{

publicstaticvoidmain(String[]args){

intyear,month,day;intdays=0;intd=0;

FourteenthYearMonthDayfymd=newFourteenthYearMonthDay();System.out.print(\"Inputtheyear:\");year=fymd.input();

System.out.print(\"Inputthemonth:\");month=fymd.input();

System.out.print(\"InputTheDay:\");day=fymd.input();

if(year<0||month<0||month>12||day<0||day>31){System.out.println(\"Inputerror,pleaserunthisprogramagain!\");System.exit(0);}

for(inti=1;iif((year%400==0)||(year%4==0&&year%100!=0)){days=29;}else{days=28;}

d+=days;break;}d+=day;

}

System.out.println(year+\":\"+month+\":\"+day+\"是今年的第\"+d+\"天。\");}

publicintinput(){

intvalue=0;

Scanners=newScanner(System.in);value=s.nextInt();returnvalue;}}

/*【程序15】*作者若水飞天

题目:输入三个整数x,y,z,请把这三个数由小到大输出。

1.程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。*/

packagecn.com.flywater.FiftyAlgorthm;importjava.util.*;

publicclassFifteenthNumberCompare{publicstaticvoidmain(String[]args){

FifteenthNumberComparefnc=newFifteenthNumberCompare();inta,b,c;

System.out.println(\"Input3numbers:\");a=fnc.input();b=fnc.input();c=fnc.input();////////变

if(a>b){intt=a;a=b;b=t;}

if(a>c){intt=a;a=c;c=t;}

if(b>c){intt=b;b=c;c=t;}

fnc.compare(a,b);//方法调用不能通过改变形参的值来改变实参的值fnc.compare(b,c);//这种做法是错的fnc.compare(a,c);

//System.out.println(\"result:\"+a+\"\"+b+\"\"+c);//没有改

System.out.println(a+\"\"+b+\"\"+c);}

publicintinput(){

intvalue=0;

Scanners=newScanner(System.in);value=s.nextInt();returnvalue;}

publicvoidcompare(intx,inty){//此方法没用

if(x>y){intt=x;x=y;y=t;}}}

/*【程序16】*作者若水飞天

*题目:输出9*9口诀。

*1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列。**/

packagecn.com.flywater.FiftyAlgorthm;

publicclassSixteenthMultiplicationTable{publicstaticvoidmain(String[]args){

for(inti=1;i<10;i++){for(intj=1;j<=i;j++){

System.out.print(j+\"*\"+i+\"=\"+j*i+\"\");}

System.out.println();}}}

//【程序17】//作者若水飞天

//题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,//又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。

//以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,//见只剩下一个桃子了。求第一天共摘了多少。

//1.程序分析:采取逆向思维的方法,从后往前推断。

packagecn.com.flywater.FiftyAlgorthm;publicclassSeventeenthMonkeyPeach{publicstaticvoidmain(String[]args){

intlastdayNum=1;

for(inti=2;i<=10;i++){

lastdayNum=(lastdayNum+1)*2;}

System.out.println(\"猴子第一天摘了\"+lastdayNum+\"个桃子\");}}

/*【程序18】*作者若水飞天

题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。

已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。*//*

*这个程序写得很不好,是知道结果后拼凑起来的,还不如直接写输出语句加上结果来的好。*/

packagecn.com.flywater.FiftyAlgorthm;publicclassEighteenthPingpong{staticchar[]m={'a','b','c'};staticchar[]n={'x','y','z'};publicstaticvoidmain(String[]args){

for(inti=0;i}elseif(m[i]=='a'&&n[j]=='y'){continue;

}elseif((m[i]=='c'&&n[j]=='x')

||(m[i]=='c'&&n[j]=='z')){continue;

}elseif((m[i]=='b'&&n[j]=='z')

||(m[i]=='b'&&n[j]=='y')){continue;}else

System.out.println(m[i]+\"vs\"+n[j]);

}}}}

题目:打印出如下图案(菱形)

*************************

1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重for循环,

第一层控制行,第二层控制列。*/

/*上半部分循环变量的控制方法是

*for(inti=0;i<(HEIGHT+1)/2;i++){

for(intj=1;jfor(inti=1;i<=HEIGHT/2;i++){

for(intj=1;j<=i;j++){*for(intk=1;k<=WIDTH-2*i-1;k++){*/

packagecn.com.flywater.FiftyAlgorthm;publicclassNineteenthPrintRhombic{staticfinalintHEIGHT=7;staticfinalintWIDTH=8;

publicstaticvoidmain(String[]args){

for(inti=0;i<(HEIGHT+1)/2;i++){for(intj=1;jfor(intk=1;k<(i+1)*2;k++){System.out.print('*');}

System.out.println();}

for(inti=1;i<=HEIGHT/2;i++){for(intj=1;j<=i;j++){

System.out.print(\"\");

}

for(intk=1;k<=WIDTH-2*i-1;k++){System.out.print('*');}

System.out.println();}

}}

上半部分第二重循环应改为:上半部分第三重循环应改为:

for(intj=0;j/*【程序20】*作者若水飞天

题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。

1.程序分析:请抓住分子与分母的变化规律。*/

packagecn.com.flywater.FiftyAlgorthm;importjava.text.DecimalFormat;publicclassTwentiethFractionSum{

publicstaticvoidmain(String[]args){

intx=2,y=1,t;doublesum=0;

DecimalFormatdf=newDecimalFormat(\"#0.0000\");

for(inti=1;i<=20;i++){sum+=(double)x/y;t=y;y=x;x=y+t;

System.out.println(\"第\"+i+\"次相加,和是\"+df.format(sum));}}

/*【程序21】*作者若水飞天

题目:求1+2!+3!+...+20!的和

1.程序分析:此程序只是把累加变成了累乘。*/

packagecn.com.flywater.FiftyAlgorthm;publicclassTwenty_firstFactorialSum{staticlongsum=0;staticlongfac=0;

publicstaticvoidmain(String[]args){

longsum=0;longfac=1;

for(inti=1;i<=10;i++){fac=fac*i;sum+=fac;}

System.out.println(sum);}}

/*【程序22】*作者若水飞天

题目:利用递归方法求5!。

1.程序分析:递归公式:fn=fn_1*4!*/

packagecn.com.flywater.FiftyAlgorthm;importjava.util.Scanner;

publicclassTwenty_secondFactorialRecursion{publicstaticvoidmain(String[]args){

Scanners=newScanner(System.in);intn=s.nextInt();

Twenty_secondFactorialRecursiontfr=newTwenty_secondFactorialRecursion();

System.out.println(tfr.recursion(n));}

publiclongrecursion(intn){

longvalue=0;

if(n==1||n==0){value=1;

}elseif(n>1){

value=n*recursion(n-1);}

returnvalue;}}

/*【程序23】

*作者:若水飞天

题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。

问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?

1.程序分析:利用递归的方法,递归分为回推和递推两个阶段。

要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。**/

packagecn.com.flywater.FiftyAlgorthm;publicclassTwenty_thirdPeopleAge{publicstaticvoidmain(String[]args){

intage=10;

for(inti=2;i<=5;i++){age+=2;}

System.out.println(age);}}

/*【程序24】*作者若水飞天

题目:给一个不多于5位的正整数,

要求:一、求它是几位数,二、逆序打印出各位数字。

说明:这个算法实现虽然实现了这个功能,但不健壮,当输入字符是,会出现异常。*/

packagecn.com.flywater.FiftyAlgorthm;importjava.util.Scanner;

publicclassTwenty_fourthNumber{publicstaticvoidmain(String[]args){

Twenty_fourthNumbertn=newTwenty_fourthNumber();Scanners=newScanner(System.in);longa=s.nextLong();if(a<0||a>100000){

System.out.println(\"ErrorInput,pleaserunthisprogramAgain\");System.exit(0);}

if(a>=0&&a<=9){

}

}

}

}

System.out.println(a+\"是一位数\");

System.out.println(\"按逆序输出是\"+'\\n'+a);elseif(a>=10&&a<=99){

System.out.println(a+\"是二位数\");System.out.println(\"按逆序输出是\");tn.converse(a);

elseif(a>=100&&a<=999){System.out.println(a+\"是三位数\");System.out.println(\"按逆序输出是\");tn.converse(a);

elseif(a>=1000&&a<=9999){System.out.println(a+\"是四位数\");System.out.println(\"按逆序输出是\");tn.converse(a);

elseif(a>=10000&&a<=99999){System.out.println(a+\"是五位数\");System.out.println(\"按逆序输出是\");tn.converse(a);

}

}

publicvoidconverse(longl){

Strings=Long.toString(l);char[]ch=s.toCharArray();

for(inti=ch.length-1;i>=0;i--){System.out.print(ch[i]);

}

}}

这个算法实在太土了,也许只有我若水飞天才会这样写,下面写一个优雅一点的

importjava.util.Scanner;

publicclassTwenty_fourthNumber{

publicstaticvoidmain(String[]args){

Twenty_fourthNumbertn=newTwenty_fourthNumber();Scanners=newScanner(System.in);longa=s.nextLong();

Strings=Long.toString(l);char[]ch=s.toCharArray();

System.out.println(a+\"是\"+ch.length+“位数”);

for(inti=ch.length-1;i>=0;i--){System.out.print(ch[i]);

}

}}

/*【程序25】*作者若水飞天题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。**/

packagecn.com.flywater.FiftyAlgorthm;importjava.util.Scanner;

publicclassTwenty_fifthPalindrom{staticint[]a=newint[5];staticint[]b=newint[5];

publicstaticvoidmain(String[]args){

booleanis=false;

Scanners=newScanner(System.in);longl=s.nextLong();

if(l>99999||l<10000){

System.out.println(\"Inputerror,pleaseinputagain!\");l=s.nextLong();}

for(inti=4;i>=0;i--){

a[i]=(int)(l/(long)Math.pow(10,i));l=(l%(long)Math.pow(10,i));}

System.out.println();

for(inti=0,j=0;i<5;i++,j++){

b[j]=a[i];}

for(inti=0,j=4;i<5;i++,j--){if(a[i]!=b[j]){is=false;break;}else{is=true;}}

if(is==false){

System.out.println(\"isnotaPalindrom!\");}elseif(is==true){

System.out.println(\"isaPalindrom!\");}

}}

这个更好,不限位数

publicstaticvoidmain(String[]args){

Scanners=newScanner(System.in);System.out.print(\"请输入一个正整数:\");longa=s.nextLong();

Stringss=Long.toString(a);char[]ch=ss.toCharArray();booleanis=true;intj=ch.length;

for(inti=0;iif(ch[i]!=ch[j-i-1]){is=false;}}

if(is==true){System.out.println(\"这是一个回文数\");}

else{System.out.println(\"这不是一个回文数\");}}

/*【程序26】*作者若水飞天

题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。

1.程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母。此程序虽然实现了基本功能,但必须严格按照题目的要求输入,否则程序无法执行**/

packagecn.com.flywater.FiftyAlgorthm;importjava.util.Scanner;

publicclassTwenty_sixthWeek{Scanners=newScanner(System.in);

publicstaticvoidmain(String[]args){

Twenty_sixthWeektw=newTwenty_sixthWeek();charch=tw.getChar();switch(ch){case'M':

System.out.println(\"Monday\");break;case'W':

System.out.println(\"Wednesday\");break;case'F':

System.out.println(\"Friday\");break;case'T':{

System.out.println(\"pleaseinputthesecondletter!\");charch2=tw.getChar();

if(ch2=='U'){System.out.println(\"Tuesday\");}

elseif(ch2=='H'){System.out.println(\"Thursday\");}};

break;case'S':{

System.out.println(\"pleaseinputthescecondletter!\");charch2=tw.getChar();

if(ch2=='U'){System.out.println(\"Sunday\");}

elseif(ch2=='A'){System.out.println(\"Saturday\");}};break;}

}

publicchargetChar(){

Stringstr=s.nextLine();charch=str.charAt(0);if(ch<'A'||ch>'Z'){

System.out.println(\"Inputerror,pleaseinputacapitalletter\");getChar();}

returnch;}}

/*【程序27】*作者若水飞天

题目:求100之内的素数

1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。**/

packagecn.com.flywater.FiftyAlgorthm;publicclassTwenty_seventhPrimeNumber{

publicstaticvoidmain(String[]args){

booleanb=false;intcount=0;

for(inti=2;i<100;i+=1){

for(intj=2;j<=Math.sqrt(i);j++){if(i%j==0){b=false;break;}else{b=true;}}

if(b==true){count++;

System.out.print(i+\"\");}

}

System.out.println('\\n'+\"ThenumberofPrimeNumberis:\"+count);}}

/*【程序28】*作者若水飞天

题目:对10个数进行排序

1.程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换,下次类推,即用第二个元素与后8个进行比较,并进行交换。**/

packagecn.com.flywater.FiftyAlgorthm;importjava.util.Scanner;

publicclassTwehty_eighthNumberSort{publicstaticvoidmain(String[]args){

Scanners=newScanner(System.in);int[]a=newint[10];for(inti=0;i<10;i++){a[i]=s.nextInt();}

for(inti=0;i<10;i++){for(intj=i+1;j<10;j++){if(a[i]>a[j]){intt=a[i];

a[i]=a[j];a[j]=t;}}}

for(inti=0;i<10;i++){

System.out.print(a[i]+\"\");}}}

/*【程序29】*作者若水飞天

*按程序分析,好像只是求主对角线的和题目:求一个3*3矩阵对角线元素之和

1.程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。**/

packagecn.com.flywater.FiftyAlgorthm;importjava.util.Scanner;

publicclassTwenty_ninthCrossSum{publicstaticvoidmain(String[]args){

Scanners=newScanner(System.in);int[][]a=newint[3][3];

for(inti=0;i<3;i++){for(intj=0;j<3;j++){a[i][j]=s.nextInt();}}

System.out.println(\"输入的3*3矩阵是:\");for(inti=0;i<3;i++){for(intj=0;j<3;j++){

System.out.print(a[i][j]+\"\");}

System.out.println();}

intsum=0;

for(inti=0;i<3;i++){for(intj=0;j<3;j++){if(i==j){

sum+=a[i][j];}}}

System.out.println(\"对角线和是\"+sum);}}

/*【程序30】*作者若水飞天

题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。

1.程序分析:首先判断此数是否大于最后一个数,

然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。**/

packagecn.com.flywater.FiftyAlgorthm;importjava.util.Scanner;

publicclassThirtiethInsert{

publicstaticvoidmain(String[]args){

int[]a=newint[]{1,2,3,4,5,6,7};int[]b=newint[a.length+1];intt1=0,t2=0;

inti=0;

Scanners=newScanner(System.in);intnum=s.nextInt();

/*

*定义两个数组a,b,一个a的长度比另一个b大1,a看做是*已经排好序的。*接下来的过程是

*1:如果num比最后一个数大,把num赋值给数组b的最后一个数*再按顺序把a的每个元素赋给b*2:否则(num不比a的最后一个数大),*如果a的元素比num小,则将这些元素按顺序赋给b*将num赋给比num大的b数组的元素,*跳出第一个for循环。

*3:定义一个循环控制变量,从num传给数组后num的下标值加一开始;

*a[i-1];

**/

直到b的结尾,将剩下的a的值赋给b,赋值的过程是b[j]=

if(num>=a[a.length-1]){b[b.length-1]=num;

for(i=0;i}else{

for(i=0;i=a[i]){b[i]=a[i];}else{

b[i]=num;break;}}

for(intj=i+1;jfor(i=0;i}

/*【程序21】*作者若水飞天

题目:求1+2!+3!+...+20!的和

1.程序分析:此程序只是把累加变成了累乘。*/

packagecn.com.flywater.FiftyAlgorthm;publicclassTwenty_firstFactorialSum{staticlongsum=0;staticlongfac=0;

publicstaticvoidmain(String[]args){

longsum=0;

longfac=1;

for(inti=1;i<=10;i++){fac=fac*i;sum+=fac;}

System.out.println(sum);}}

/*【程序32】*作者若水飞天

题目:取一个整数a从右端开始的4~7位。程序分析:可以这样考虑:(1)先使a右移4位。

(2)设置一个低4位全为1,其余全为0的数。可用~(~0<<4)(3)将上面二者进行&运算。**/

/*这个题我不会做,如有高手路过,还望指点**/

packagecn.com.flywater.FiftyAlgorthm;publicclassThirty_secondFS{

publicstaticvoidmain(String[]args){}}

我没有用提示的方法,采用了字串截取。publicstaticvoidmain(String[]args){

Scanners=newScanner(System.in);booleanis=true;

System.out.print(\"请输入一个7位以上的正整数:\");longa=s.nextLong();

Stringss=Long.toString(a);char[]ch=ss.toCharArray();intj=ch.length;

if(j<7){System.out.println(\"输入错误!\");}else{

System.out.println(\"截取从右端开始的4~7位是:\"+ch[j-7]+ch[j-6]+ch[j-5]+ch[j-4]);

}}

【程序33】*作者若水飞天

题目:打印出杨辉三角形(要求打印出10行如下图)1.程序分析:

11112113311464115101051*//*

*网上千篇一律是这种写法,我也没有什么创新,

*a[i][j]=a[i-1][j]+a[i-1][j-1]就是这个程序的核心*定义的是二维数组,为了使输出的结果看起来漂亮一点

*可以用for(intk=0;k<2*(10-i)-1;k++)控制输出的空格*这个循环是在控制行数的循环里面,控制列数的循环外面。*记得在输出菱形时为了控制下半部分的输出,在下拼命的写出*for(intk=1;k<=WIDTH-2*i-1;k++)才算了事。*/

packagecn.com.flywater.FiftyAlgorthm;publicclassThirty_thirdYangTriangle{publicstaticvoidmain(String[]args){

int[][]a=newint[10][10];for(inti=0;i<10;i++){a[i][i]=1;a[i][0]=1;}

for(inti=2;i<10;i++){for(intj=1;ja[i][j]=a[i-1][j-1]+a[i-1][j];}}

for(inti=0;i<10;i++){

for(intk=0;k<2*(10-i)-1;k++){System.out.print(\"\");}

for(intj=0;j<=i;j++){

System.out.print(a[i][j]+\"}

\");

System.out.println();}}}

/*【程序34】*作者若水飞天

题目:输入3个数a,b,c,按大小顺序输出。1.程序分析:利用指针方法。*//*

*可惜,Java好像没有指针*/

packagecn.com.flywater.FiftyAlgorthm;importjava.util.Scanner;

publicclassThirty_forthCompare{

publicstaticvoidmain(String[]args){

Scanners=newScanner(System.in);inta=s.nextInt();intb=s.nextInt();intc=s.nextInt();

if(aif(aif(bSystem.out.println(\"从大到小的顺序输出:\");System.out.println(a+\"\"+b+\"\"+c);}

}

/*【程序35】*作者若水飞天

题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。**/

packagecn.com.flywater.FiftyAlgorthm;importjava.util.Scanner;

publicclassThirty_fifthSwop{staticfinalintN=8;

publicstaticvoidmain(String[]args){

int[]a=newint[N];

Scanners=newScanner(System.in);intindex1=0,index2=0;

System.out.println(\"pleaseinputnumbers\");for(inti=0;iSystem.out.print(a[i]+\"\");}

intmax=a[0],min=a[0];

for(inti=0;imax){max=a[i];index1=i;}

if(a[i]if(index1!=0){inttemp=a[0];a[0]=a[index1];a[index1]=temp;}

if(index2!=a.length-1){

inttemp=a[a.length-1];a[a.length-1]=a[index2];a[index2]=temp;

}

System.out.println(\"afterswop:\");for(inti=0;i/*【程序36】*作者若水飞天

题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数**//*

*这个题不知道有什么好办法,比较直接方法的是把这个数组分成两个数组,*再将两个数组合起来,但如果不控制好数组的下标,就会带来很多麻烦。*/

packagecn.com.flywater.FiftyAlgorthm;importjava.util.Scanner;

publicclassThirty_sixthBackShift{publicstaticfinalintN=10;

publicstaticvoidmain(String[]args){

int[]a=newint[N];

Scanners=newScanner(System.in);

System.out.println(\"pleaseinputarraya,tennumbers:\");for(inti=0;iSystem.out.println(\"pleaseinputm,onenumber:\");intm=s.nextInt();

int[]b=newint[m];int[]c=newint[N-m];for(inti=0;ifor(inti=m,j=0;i}

for(inti=0;ifor(inti=m,j=0;ifor(inti=0;i/*【程序37】*作者若水飞天

题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。**//*

*这个程序是完全抄别人的*/

packagecn.com.flywater.FiftyAlgorthm;importjava.util.Scanner;

publicclassThirty_sevenCount3Quit{publicstaticvoidmain(String[]args){

Scanners=newScanner(System.in);intn=s.nextInt();

boolean[]arr=newboolean[n];for(inti=0;iarr[i]=true;//下标为TRUE时说明还在圈里}

intleftCount=n;intcountNum=0;intindex=0;

while(leftCount>1){

if(arr[index]==true){//当在圈里时

countNum++;//报数递加

if(countNum==3){//报道3时countNum=0;//从零开始继续报数arr[index]=false;//此人退出圈子leftCount--;//剩余人数减一}

}

index++;//每报一次数,下标加一

if(index==n){//是循环数数,当下标大于n时,说明已经数了一圈,index=0;//将下标设为零重新开始。}}

for(inti=0;i/*【程序38】*作者若水飞天

题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。*/

packagecn.com.flywater.FiftyAlgorthm;publicclassThirty_eighthStringLength{publicstaticvoidmain(String[]args){

Strings=\"jdfifdfhfhuififffdfggee\";System.out.print(\"字符串的长度是:\");System.out.println(s.length());}}

*【程序39】*作者若水飞天

题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,

当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数)**/

packagecn.com.flywater.FiftyAlgorthm;importjava.text.DecimalFormat;importjava.util.*;

publicclassThirty_ninthFactionSum{publicstaticvoidmain(String[]args){

Scanners=newScanner(System.in);intn=s.nextInt();

DecimalFormatdf=newDecimalFormat(\"#0.00000\");

System.out.println(n+\"****result\"+df.format(sum(n)));}

publicstaticdoublesum(intn){

doubleresult=0;if(n%2==0){

for(inti=2;i<=n;i+=2){result+=(double)1/n;}

}else{

for(inti=1;i<=n;i+=2){result+=(double)1/i;}}

returnresult;}}

/*【程序40】*作者若水飞天题目:字符串排序。**/

packagecn.com.flywater.FiftyAlgorthm;publicclassFortiethStringSort{publicstaticvoidmain(String[]args){

Stringtemp=null;

String[]s=newString[5];s[0]=\"china\".toLowerCase();s[1]=\"apple\".toLowerCase();

s[2]=\"MONEY\".toLowerCase();s[3]=\"BOOk\".toLowerCase();s[4]=\"yeah\".toLowerCase();/*

for(inti=0;iif(s[i].compareToIgnoreCase(s[j])>0){temp=s[i];s[i]=s[j];s[j]=temp;}}}*/

for(inti=0;ifor(inti=0;i}

staticbooleancompare(Strings1,Strings2){

booleanresult=true;

for(inti=0;is2.charAt(i)){result=false;break;

}elseif(s1.charAt(i)if(s1.length()result=false;}}

{i++)}

returnresult;

}}

LinkedList类里面较重要的方法就是\"addBefore(){}\"和\"privatevoidremove(DNodecurr){}\"很多方法都与它俩有关系!!

下面的代码是个双向循环链表,在LinkedList里抄的...

packageLinkedList;

importjava.util.Iterator;importjava.util.ListIterator;

importjava.util.NoSuchElementException;publicclassMyLinkedList{

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

privateDNodeheader;privateintlistSize;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

publicMyLinkedList(){

header=newDNode();listSize=0;

}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

privatestaticclassDNode{

TnodeValue;DNodeprev;DNodenext;

publicDNode(){//forheader

nodeValue=null;prev=this;//leftnext=this;//right

}

publicDNode(Titem){

nodeValue=item;prev=this;next=this;

}

}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

publicbooleanisEmpty(){

return(header.prev==header||header.next==header);

}

publicintsize(){

returnlistSize;

}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

privateDNodeaddBefore(DNodecurr,Titem){

DNodenewNode,prevNode;newNode=newDNode(item);

prevNode=curr.prev;newNode.prev=prevNode;newNode.next=curr;prevNode.next=newNode;curr.prev=newNode;returnnewNode;

}

publicbooleanadd(Titem){

addBefore(header,item);listSize++;returntrue;

}

publicvoidaddFirst(Titem){

addBefore(header.next,item);listSize++;

}

publicvoidaddLast(Titem){

addBefore(header,item);listSize++;

}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

privatevoidremove(DNodecurr){

if(curr.next==curr)return;

DNodeprevNode=curr.prev,nextNode=curr.next;

prevNode.next=nextNode;nextNode.prev=prevNode;

}

publicbooleanremove(Objecto){

for(DNodep=header.next;p!=header;p=p.next){

if(o.equals(p.nodeValue)){

remove(p);listSize--;returntrue;

}

}

returnfalse;

}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

publicvoidprintList(){

for(DNodep=header.next;p!=header;p=p.next)

System.out.println(p.nodeValue);

}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

privateclassMyIteratorimplementsIterator{

publicDNodenextNode=header.next;publicDNodelastReturned=header;publicbooleanhasNext(){

returnnextNode!=header;

}

publicTnext(){

if(nextNode==header)

thrownewNoSuchElementException(\"\");

lastReturned=nextNode;nextNode=nextNode.next;

returnlastReturned.nodeValue;

}

publicvoidremove(){

if(lastReturned==header)

thrownewIllegalStateException(\"\");

MyLinkedList.this.remove(lastReturned);

lastReturned=header;listSize--;

}

}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

privateclassMyListIteratorextendsMyIteratorimplementsListIterator{

privateintnextIndex;

MyListIterator(intindex){

if(index<0||index>listSize)

thrownewIndexOutOfBoundsException(\"\");

//如果index小于listSize/2,就从表头开始查找定

位,否则就

从表尾开始查找定位

if(index<(listSize>>1)){

nextNode=header.next;

for(nextIndex=0;nextIndexnextIndex++)

nextNode=nextNode.next;

}else{

nextNode=header;

for(nextIndex=listSize;nextIndex>

index;nextIndex--)

nextNode=nextNode.prev;

}

}

publicbooleanhasPrevious(){

returnnextIndex!=0;

//returnnextNode.prev!=header;

}

publicTprevious(){

if(nextIndex==0)

thrownewNoSuchElementException(\"no\");

lastReturned=nextNode=nextNode.prev;nextIndex--;

returnlastReturned.nodeValue;

}

publicvoidremove(){

if(lastReturned==header)

thrownewIllegalStateException(\"\");

MyLinkedList.this.remove(lastReturned);nextIndex--;listSize--;

if(lastReturned==nextNode)

nextNode=nextNode.next;

lastReturned=header;

}

publicvoidadd(Titem){

MyLinkedList.this.addBefore(nextNode,item);nextIndex++;listSize++;

lastReturned=header;

}

publicvoidset(Titem){

if(lastReturned==header)

thrownewIllegalStateException();

lastReturned.nodeValue=item;

}

publicintnextIndex(){

returnnextIndex;

}

publicintpreviousIndex(){

returnnextIndex-1;

}

}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

publicIteratoriterator(){

returnnewMyIterator();

}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

publicListIteratorlistIterator(intindex){

returnnewMyListIterator(index);

}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

publicstaticvoidmain(String[]args){

MyLinkedListt=newMyLinkedList();t.add(\"A\");t.add(\"B\");t.add(\"C\");t.add(\"D\");

//t.remove(\"B\");//t.addFirst(\"AA\");//t.addLast(\"BB\");//t.printList();

ListIteratorit=t.listIterator(t.size());while(it.hasPrevious()){

System.out.println(it.previous());//DCBA

}

}

}//MyLinkedListend~

ArrayList底层数组实现的,当实例化一个ArrayList是也相当实例化了一个数组

所以对元素的随即访问较快,而增加删除操作慢

LinkedList底层实现是一个双向链表,没一个结点都包含了前一个元素的引用和后一个元素的引用和结点值

所以对元素的随即访问很慢,而增删较快

java实现链表和c实现一样。就是指针变成了引用。

【参考资料】JAVA的链表(2009-05-1101:35:49)标签:java链表分类:学习资料

又是个不错的地方:

http://blog.sina.com.cn/s/articlelist_1282789430_0_1.html

链表是一种重要的数据结构,在程序设计中占有很重要的地位。C语言和C++语言中是用指针来实现链表结构的,由于Java语言不提供指针,所以有人认为在Java语言中不能实现链表,其实不然,Java语言比C和C++更容易实现链表结构。Java语言中的对象引用实际上是一个指针(本文中的指针均为概念上的意义,而非语言提供的数据类型),所以我们可以编写这样的类来实现链表中的结点。

classNode

{

Objectdata;

Nodenext;//指向下一个结点}

将数据域定义成Object类是因为Object类是广义超类,任何类对象都可以给其赋值,增加了代码的通用性。为了使链表可以被访问还需要定义一个表头,表头必须包含指向第一个结点的指针和指向当前结点的指针。为了便于在链表尾部增加结点,还可以增加一指向链表尾部的指针,另外还可以用一个域来表示链表的大小,当调用者想得到链表的大小时,不必遍历整个链表。下图是这种链表的示意图:

链表的数据结构

我们可以用类List来实现链表结构,用变量Head、Tail、Length、Pointer来实现表头。存储当前结点的指针时有一定的技巧,Pointer并非存储指向当前结点的指针,而是存储指向它的前趋结点的指针,当其值为null时表示当前结点是第一个结点。那么为什么要这样做呢?这是因为当删除当前结点后仍需保证剩下的结点构成链表,如果Pointer指向当前结点,则会给操作带来很大困难。那么如何得到当前结点呢,我们定义了一个方法cursor(),返回值是指向当前结点的指针。类List还定义了一些方法来实现对链表的基本操作,通过运用这些基本操作我们可以对链表进行各种操作。例如reset()方法使第一个结点成为当前结点。insert(Objectd)方法在当前结点前插入一个结点,并使其成为当前结点。remove()方法删除当前结点同时返回其内容,并使其后继结点成为当前结点,如果删除的是最后一个结点,则第一个结点变为当前结点。

链表类List的源代码如下:importjava.io.*;publicclassList{

privateNodeHead=null;privateNodeTail=null;privateNodePointer=null;privateintLength=0;publicvoiddeleteAll(){

Head=null;Tail=null;Pointer=null;Length=0;}

publicvoidreset(){

Pointer=null;}

publicbooleanisEmpty(){

return(Length==0);}

publicbooleanisEnd()

{

if(Length==0)

thrownewjava.lang.NullPointerException();elseif(Length==1)returntrue;else

return(cursor()==Tail);}

publicObjectnextNode()

{

if(Length==1)

thrownewjava.util.NoSuchElementException();elseif(Length==0)

thrownewjava.lang.NullPointerException();else{

Nodetemp=cursor();Pointer=temp;if(temp!=Tail)

return(temp.next.data);else

thrownewjava.util.NoSuchElementException();}}

publicObjectcurrentNode(){

Nodetemp=cursor();returntemp.data;}

publicvoidinsert(Objectd){

Nodee=newNode(d);if(Length==0)

{Tail=e;Head=e;

}else{

Nodetemp=cursor();e.next=temp;

if(Pointer==null)Head=e;else

Pointer.next=e;}

Length++;}

publicintsize(){

return(Length);}

publicObjectremove()

{

Objecttemp;if(Length==0)

thrownewjava.util.NoSuchElementException();elseif(Length==1){

temp=Head.data;deleteAll();}else{

Nodecur=cursor();temp=cur.data;if(cur==Head)Head=cur.next;elseif(cur==Tail){

Pointer.next=null;Tail=Pointer;reset();}else

Pointer.next=cur.next;Length--;}

returntemp;}

privateNodecursor()

{

if(Head==null)

thrownewjava.lang.NullPointerException();elseif(Pointer==null)returnHead;else

returnPointer.next;}

publicstaticvoidmain(String[]args)

{

Lista=newList();

for(inti=1;i<=10;i++)a.insert(newInteger(i));

System.out.println(a.currentNode());while(!a.isEnd())

System.out.println(a.nextNode());a.reset();

while(!a.isEnd()){

a.remove();}

a.remove();a.reset();

if(a.isEmpty())

System.out.println(\"ThereisnoNodeinList\\n\");System.in.println(\"Youcanpressreturntoquit\\n\");try{

System.in.read();

//确保用户看清程序运行结果}

catch(IOExceptione){}}}

classNode

{

Objectdata;Nodenext;Node(Objectd){

data=d;next=null;}}

因篇幅问题不能全部显示,请点此查看更多更全内容