Java必知经典算法小程序.docx
《Java必知经典算法小程序.docx》由会员分享,可在线阅读,更多相关《Java必知经典算法小程序.docx(14页珍藏版)》请在冰豆网上搜索。
![Java必知经典算法小程序.docx](https://file1.bdocx.com/fileroot1/2023-1/4/24c500bd-95cd-413b-8662-3c45eeb6b5d9/24c500bd-95cd-413b-8662-3c45eeb6b5d91.gif)
Java必知经典算法小程序
、Java必知经典算法小程序
【程序29】*作者若水飞天*按程序分析,好像只是求主对角线的和题目:
求一个3*3矩阵对角线元素之和1.程序分析:
利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。
**/package.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.程序分析:
首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。
**/package.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的下标值加一开始;*直到b的结尾,将剩下的a的值赋给b,赋值的过程是b[j]=a[i-1];**/
if(num>=a[a.length-1]){b[b.length-1]=num;for(i=0;ielse{for(i=0;i=a[i]){b[i]=a[i];}else{b[i]=num;break;}}for(intj=i+1;j【程序21】*作者若水飞天题目:
求1+2!
+3!
+...+20!
的和1.程序分析:
此程序只是把累加变成了累乘。
*/package.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)将上面二者进行&运算。
**//*这个题我不会做,如有高手路过,还望指点**/package.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++)才算了事。
*/package.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;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好像没有指针*/package.flywater.FiftyAlgorthm;importjava.util.Scanner;publicclassThirty_forthCompare{publicstaticvoidmain(String[]args){Scanners=newScanner(System.in);inta=s.nextInt();intb=s.nextInt();intc=s.nextInt();if(a
");System.out.println(a+""+b+""+c);}}/*
【程序35】*作者若水飞天题目:
输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
**/package.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;imax){max=a[i];index1=i;}if(a[i]=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个数**//**这个题不知道有什么好办法,比较直接方法的是把这个数组分成两个数组,*再将两个数组合起来,但如果不控制好数组的下标,就会带来很多麻烦。
*/package.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;i");intm=s.nextInt();int[]b=newint[m];int[]c=newint[N-m];for(inti=0;i【程序37】*作者若水飞天题目:
有n个人围成一圈,顺序排号。
从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
**//**这个程序是完全抄别人的*/package.flywater.FiftyAlgorthm;importjava.util.Scanner;publicclassThirty_sevenCount3Quit{publicstaticvoidmain(String[]args){Scanners=newScanner(System.in);intn=s.nextInt();boolean[]arr=newboolean[n];for(inti=0;i1){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写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。
*/package.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(利用指针函数)**/package.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】*作者若水飞天题目:
字符串排序。
**/package.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;i0){temp=s[i];s[i]=s[j];s[j]=temp;}}}*/
for(inti=0;istaticbooleancompare(Strings1,Strings2){booleanresult=true;for(inti=0;is2.charAt(i)){result=false;break;}elseif(s1.charAt(i)!
下面的代码是个双向循环链表,在LinkedList里抄的...packageLinkedList;importjava.util.Iterator;importjava.util.ListIterator;importjava.util.NoSuchElementException;publicclassMyLinkedList{//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~privateDNodeheader;privateintlistSize;//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~publicMyLinkedList(){header=newDNode();listSize=0;}//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~privatestaticclassDNode{TnodeValue;DNodeprev;DNodenext;publicDNode(){//forheadernodeValue=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++;}//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~p