java经典算法40初学必做基础.docx
《java经典算法40初学必做基础.docx》由会员分享,可在线阅读,更多相关《java经典算法40初学必做基础.docx(12页珍藏版)》请在冰豆网上搜索。
![java经典算法40初学必做基础.docx](https://file1.bdocx.com/fileroot1/2022-11/24/95473da1-79c4-4ffa-be06-2e513b4a4006/95473da1-79c4-4ffa-be06-2e513b4a40061.gif)
java经典算法40初学必做基础
java经典算法40题(21-40)
【程序21】题目:
求1+2!
+3!
+...+20!
的和
1.程序分析:
此程序只是把累加变成了累乘。
publicclassEx21{
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!
importjava.util.Scanner;
publicclassEx22{
publicstaticvoidmain(String[]args){
Scanners=newScanner(System.in);
intn=s.nextInt();
Ex22tfr=newEx22();
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岁),再往回推。
publicclassEx23{
staticintgetAge(intn){
if(n==1){
return10;
}
return2+getAge(n-1);
}
publicstaticvoidmain(String[]args){
System.out.println("第五个的年龄为:
"+getAge(5));
}
}
【程序24】题目:
给一个不多于5位的正整数,要求:
一、求它是几位数,二、逆序打印出各位数字。
importjava.util.Scanner;
publicclassEx24{
publicstaticvoidmain(String[]args){
Ex24tn=newEx24();
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]);
}
}
}
【程序25】题目:
一个5位数,判断它是不是回文数。
即12321是回文数,个位与万位相同,十位与千位相同。
importjava.util.Scanner;
publicclassEx25{
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!
");
}
}
}
【程序26】题目:
请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。
1.程序分析:
用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母。
importjava.util.Scanner;
publicclassEx26{
publicstaticvoidmain(String[]args){
//保存用户输入的第二个字母
charweekSecond;
//将Scanner类示例化为input对象,用于接收用户输入
Scannerinput=newScanner(System.in);
//开始提示并接收用户控制台输入
System.out.print("请输入星期值英文的第一个字母,我来帮您判断是星期几:
");
Stringletter=input.next();
//判断用户控制台输入字符串长度是否是一个字母
if(letter.length()==1){
//利用取第一个索引位的字符来实现让Scanner接收char类型输入
charweekFirst=letter.charAt(0);
switch(weekFirst){
case'm':
//当输入小写字母时,利用switch结构特性执行下一个带break语句的case分支,以实现忽略用户控制台输入大小写敏感的功能
case'M':
System.out.println("星期一(Monday)");
break;
case't':
//当输入小写字母时,利用switch结构特性执行下一个带break语句的case分支,以实现忽略用户控制台输入大小写敏感的功能
case'T':
System.out.print("由于星期二(Tuesday)与星期四(Thursday)均以字母T开头,故需输入第二个字母才能正确判断:
");
letter=input.next();
//判断用户控制台输入字符串长度是否是一个字母
if(letter.length()==1){
//利用取第一个索引位的字符来实现让Scanner接收char类型输入
weekSecond=letter.charAt(0);
//利用或(||)运算符来实现忽略用户控制台输入大小写敏感的功能
if(weekSecond=='U'||weekSecond=='u'){
System.out.println("星期二(Tuesday)");
break;
//利用或(||)运算符来实现忽略用户控制台输入大小写敏感的功能
}elseif(weekSecond=='H'||weekSecond=='h'){
System.out.println("星期四(Thursday)");
break;
//控制台错误提示
}else{
System.out.println("输入错误,不能识别的星期值第二个字母,程序结束!
");
break;
}
}else{
//控制台错误提示
System.out.println("输入错误,只能输入一个字母,程序结束!
");
break;
}
case'w':
//当输入小写字母时,利用switch结构特性执行下一个带break语句的case分支,以实现忽略用户控制台输入大小写敏感的功能
case'W':
System.out.println("星期三(Wednesday)");
break;
case'f':
//当输入小写字母时,利用switch结构特性执行下一个带break语句的case分支,以实现忽略用户控制台输入大小写敏感的功能
case'F':
System.out.println("星期五(Friday)");
break;
case's':
//当输入小写字母时,利用switch结构特性执行下一个带break语句的case分支,以实现忽略用户控制台输入大小写敏感的功能
case'S':
System.out.print("由于星期六(Saturday)与星期日(Sunday)均以字母S开头,故需输入第二个字母才能正确判断:
");
letter=input.next();
//判断用户控制台输入字符串长度是否是一个字母
if(letter.length()==1){
//利用取第一个索引位的字符来实现让Scanner接收char类型输入
weekSecond=letter.charAt(0);
//利用或(||)运算符来实现忽略用户控制台输入大小写敏感的功能
if(weekSecond=='A'||weekSecond=='a'){
System.out.println("星期六(Saturday)");
break;
//利用或(||)运算符来实现忽略用户控制台输入大小写敏感的功能
}elseif(weekSecond=='U'||weekSecond=='u'){
System.out.println("星期日(Sunday)");
break;
//控制台错误提示
}else{
System.out.println("输入错误,不能识别的星期值第二个字母,程序结束!
");
break;
}
}else{
//控制台错误提示
System.out.println("输入错误,只能输入一个字母,程序结束!
");
break;
}
default:
//控制台错误提示
System.out.println("输入错误,不能识别的星期值第一个字母,程序结束!
");
break;
}
}else{
//控制台错误提示
System.out.println("输入错误,只能输入一个字母,程序结束!
");
}
}
}
【程序27】题目:
求100之内的素数
publicclassEx27{
publicstaticvoidmain(Stringargs[])
{
intsum,i;
for(sum=2;sum<=100;sum++)
{
for(i=2;i<=sum/2;i++)
{
if(sum%i==0)
break;
}
if(i>sum/2)
System.out.println(sum+"是素数");
}
}
}
【程序28】题目:
对10个数进行排序
1.程序分析:
可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换,下次类推,即用第二个元素与后8个进行比较,并进行交换。
importjava.util.Arrays;
importjava.util.Random;
importjava.util.Scanner;
publicclassEx28{
publicstaticvoidmain(String[]args){
intarr[]=newint[11];
Randomr=newRandom();
for(inti=0;i<10;i++){
arr[i]=r.nextInt(100)+1;//得到10个100以内的整数
}
Arrays.sort(arr);
for(inti=0;iSystem.out.print(arr[i]+"\t");
}
System.out.print("\nPleaseInputaintnumber:
");
Scannersc=newScanner(System.in);
arr[10]=sc.nextInt();//输入一个int值
Arrays.sort(arr);
for(inti=0;iSystem.out.print(arr[i]+"\t");
}
}
}
【程序29】题目:
求一个3*3矩阵对角线元素之和
1.程序分析:
利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。
publicclassEx29{
publicstaticvoidmain(String[]args){
doublesum=0;
intarray[][]={{1,2,3},{4,5,6},{7,7,8}};
for(inti=0;i<3;i++)
for(intj=0;j<3;j++){
if(i==j)
sum=sum+array[i][j];
}
System.out.println(sum);
}
}
【程序30】题目:
有一个已经排好序的数组。
现输入一个数,要求按原来的规律将它插入数组中。
1.程序分析:
首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。
importjava.util.Random;
publicclassArraySort{
publicstaticvoidmain(String[]args)
{inttemp=0;
intmyarr[]=newint[12];
Randomr=newRandom();
for(inti=1;i<=10;i++)
myarr[i]=r.nextInt(1000);
for(intk=1;k<=10;k++)
System.out.print(myarr[k]+",");
for(inti=1;i<=9;i++)
for(intk=i+1;k<=10;k++)
if(myarr[i]>myarr[k])
{
temp=myarr[i];
myarr[i]=myarr[k];
myarr[k]=temp;
}
System.out.println("");
for(intk=1;k<=10;k++)
System.out.print(myarr[k]+",");
myarr[11]=r.nextInt(1000);
for(intk=1;k<=10;k++)
if(myarr[k]>myarr[11])
{
temp=myarr[11];
for(intj=11;j>=k+1;j--)
myarr[j]=myarr[j-1];
myarr[k]=temp;
}
System.out.println("");
for(intk=1;k<=11;k++)
System.out.print(myarr[k]+",");
}
}
【程序31】题目:
将一个数组逆序输出。
程序分析:
用第一个与最后一个交换。
其实,用循环控制变量更简单:
for(intk=11;k>=1;k--)
System.out.print(myarr[k]+",");
【程序32】题目:
取一个整数a从右端开始的4~7位。
程序分析:
可以这样考虑:
(1)先使a右移4位。
(2)设置一个低4位全为1,其余全为0的数。
可用~(~0<<4)
(3)将上面二者进行&运算。
publicclassEx32{
publicstaticvoidmain(String[]args)
{
inta=0;
longb=18745678;
a=(int)Math.floor(b%Math.pow(10,7)/Math.pow(10,3));
System.out.println(a);
}
}
【程序33】
题目:
打印出杨辉三角形(要求打印出10行如下图)
1.程序分析:
1
11
121
1331
14641
15101051
publicclassEx33{
publicstaticvoidmain(Stringargs[]){
inti,j;
inta[][];
a=newint[8][8];
for(i=0;i<8;i++){
a[i][i]=1;
a[i][0]=1;
}
for(i=2;i<8;i++){
for(j=1;j<=i-1;j++){
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
}
for(i=0;i<8;i++){
for(j=0;j
System.out.printf(""+a[i][j]);
}
System.out.println();
}
}
}
【程序34】题目:
输入3个数a,b,c,按大小顺序输出。
1.程序分析:
利用指针方法。
publicclassEx34{
publicstaticvoidmain(String[]args)
{
int[]arrays={800,56,500};
for(inti=arrays.length;--i>=0;)
{
for(intj=0;j
{
if(arrays[j]>arrays[j+1])
{
inttemp=arrays[j];
arrays[j]=arrays[j+1];
arrays[j+1]=temp;
}
}
}
for(intn=0;nSystem.out.println(arrays[n]);
}
}
【程序35】题目:
输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
importjava.util.*;
publicclassEx35{
publicstaticvoidmain(String[]args){
inti,min,max,n,temp1,temp2;
inta[];
System.out.println("输入数组的长度:
");
Scannerkeyboard=newScanner(System.in);
n=keyboard.nextInt();
a=newint[n];
for(i=0;iSystem.out.print("输入第"+(i+1)+"个数据");
a[i]=keyboard.nextInt();
}
//以上是输入整个数组
max=0;
min=0;
//设置两个标志,开始都指向第一个数
for(i=1;iif(a[i]>a[max])
max=i;//遍历数组,如果大于a[max],就把他的数组下标赋给max
if(a[i]min=i;//同上,如果小于a[min],就把他的数组下标赋给min
}
//以上for循环找到最大值和最小值,max是最大值的下标,min是最小值的下标
temp1=a[0];
temp2=a[min];//这两个temp只是为了在交换时使用
a[0]=a[max];
a[max]=temp1;//首先交换a[0]和最大值a[max]
if(min!
=0){//如果最小值不是a[0],执行下面
a[min]=a[n-1];
a[n-1]=temp2;//交换a[min]和a[n-1]
}else{//如果最小值是a[0],执行下面
a[max]=a[n-1];
a[n-1]=temp1;
}
for(i=0;iSystem.out.print(a[i]+"");
}
}
}
【程序36】题目:
有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数
【程序37】
题目:
有n个人围成一圈,顺序排号。
从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那