java一些经典算法题

写在开头:几道java算法题,自己的思路,不对的地方望指正。用的都是最基本的方法,一起加油


·1 *求1!+2!+3!.....+30!的和 并用方法。

int a=1,b=30;

qiuhe(a, b);*/


public class d501 {


public static void main(String[] args) {

qiuhe(1,30);


}
public static void qiuhe(int a,int b){
long sum = 0;
for(int i =a;i<=b;i++)
sum += jieCheng(i);

System.out.println(a+"--"+b+"的阶乘和为:"+sum);

}
public static int jieCheng(int c){

int jiecheng = 1;
for(int i = 1;i<=c;i++)
jiecheng *=i;
return jiecheng;
}


}



2  输入两个正整数m和n,求其最大公约数和最小公倍数。

public class d502 {


public static void main(String[] args) {

qiu(8,4);
}
public static void qiu(int a,int b )
{//辗转相除法求最大公约数
int gy;
int gb;
if(a>b)
gy = gongYueShu(a,b);
else
gy = gongYueShu(b,a);
gb = a*b/gy;

System.out.println("最大公约数:"+gy);
System.out.println("最小公倍数:"+gb);


}
public static int gongYueShu(int a,int b){

while(b!=0){

a =a%b;
if(a == 0)
return b;
else
b = b%a; 
}
return a;
}}

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

public class d503 {


public static void main(String[] args) {

wanShu();
}
public static void wanShu()
{
for(int i = 1;i<1000;i++){
int sum = 0;
for(int j =1;j<i;j++){
if(i%j==0){
sum +=j;
}
}
if(sum ==i )
System.out.print(sum+" ");
}}}


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

public class d504 {



public static void main(String[] args) {

luoDi(100,8);
}
public static void luoDi(int heigh,int c){

int sum = 0;

for(int i = 1;i<=c;i++){
{

sum +=heigh;
heigh = heigh/2;

}
}
System.out.println("第"+c+"次落地共经过"+sum+"米");
System.out.println("第"+c+"反弹"+heigh+"米");


}
}

5/*题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。
到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。*/
public class d506 {


public static void main(String[] args) {

qiu(10);
}
public static void qiu(int day)
{ int i ;
int[] arr = new int[10];
arr[9] = 1;
for(i =8;i>=0;i--){
arr[i] = arr[i+1]*2+1;
}
System.out.println(arr[0]);
}


}


6/*打印出如下图案(菱形)


*
***
******
********
******
***
**/
public class d507 {


public static void main(String[] args) {

print();
}
public static void print()
{
for(int i =1;i<=4;i++){
if(i<=2){
for(int j = 0;j<2*i-1;j++){
System.out.print("*");
}
System.out.println();
}else{
for(int j = 0;j<2*i;j++){
System.out.print("*");
}
System.out.println();
}
}
for(int i = 1 ;i<=3;i++){
if(i==1){
for(int j = 0;j<8-2*i;j++){
System.out.print("*");
}
System.out.println();
}else{
for(int j = 0;j<7-2*i;j++){
System.out.print("*");
}
System.out.println();
}
}
}}


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


public static void main(String[] args) {

qiuhe();
}
public static void qiuhe(){
float sum = 0f;
float fz = 2f;
float fm = 1f;
float temp ;

for(int i = 0;i<20;i++){
sum += fz/fm;
temp = fz;
fz = fz+fm;
fm = temp;
}
System.out.println(sum);
}


}


8 //利用递归方法求5!。
public class d509 {


public static void main(String[] args) {

System.out.println(diGui(5));
}
public static int diGui(int num)
{ int jc;
if(num==0)
return 1;
else
jc = num*diGui(num-1);

return jc;

}


9//给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。


public class d511 {


public static void main(String[] args) {

get(10222);
}
public static void get(int num)
{ int[] arr = new int[5];
int i = 0;
if(num>99999)
System.out.println("数字太大");

while(num!=0){

arr[i]= num%10;
num = num/10;
i++;
}

System.out.println(i+"位数字");
for(int j = 0;j<=i-1;j++)
System.out.print(arr[j]+" ");
}


}


10//一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
public class d512 {


public static void main(String[] args) {

isHui(32321);
}
public static void isHui(int num){
int[] arr = new int[5];
int i = 0;

while(num!=0){
arr[i] = num%10;
num /=10;
i++;
}
if(arr[0]==arr[4]  && arr[1]==arr[3]){
System.out.println("是回文数");
}else{
System.out.println("不是回文数");
}

}


}


11//求一个3*3矩阵对角线元素之和
/*1 2 3            00 01 02
  4 5 6   10 11 12
  7 8 9 */   //    20 21 22
import java.util.*;
public class d513 {


public static void main(String[] args) {
qiu();
}
public static void qiu(){
int sum = 0;
int k = 1;
int[][] arr = new int[3][3];
Scanner sc = new Scanner(System.in);
System.out.println("请输入9个数组成一个3*3矩阵");
for(int i = 0;i<3;i++){
for(int j = 0;j<3;j++){
System.out.println("请输入第"+(k++)+"个数:");
arr[i][j] = sc.nextInt();
if(i == j)
sum +=arr[i][j];
if(Math.abs(i-j)==2)
sum +=arr[i][j];
}

}
System.out.println(sum);
}



}


12//将一个数组逆序输出。
public class d514 {


public static void main(String[] args) {

int[] arr = {1,2,34,5,6,7,8,9};
print(arr);


}
public static void print(int[] arr){
for(int i = arr.length-1;i>=0;i--)
System.out.print(arr[i]+" ");
}


}


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


public class d516 {


public static void main(String[] args) {

int[] arr = {5,4,3,4,10,1,7,8,9,5};
for(int i = 0;i<arr.length;i++){
System.out.print(arr[i]+" ");}//先遍历一遍
System.out.println();
qiu(arr);

}
public static void qiu(int[] arr){
huanMax(arr);
huanMin(arr);
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");//交换完成,遍历
}
}


public static  void huanMax(int[] arr){
int max = arr[0];
int j = 0;
for(int i =0;i<arr.length;i++){
if(arr[i]>max){
max = arr[i];//得到最大值
}
for( j = 0;j<arr.length;j++){
if(max==arr[j])
break;//得到最大值对应的索引
}


}
int c = arr[j];
arr[j] = arr[0];
arr[0] = c; //交换

}
public static void huanMin(int[] arr){

int min = arr[0];
int j = 0;
for(int i = 0;i<arr.length;i++){
if(arr[i]<min){
min = arr[i];//求最小值
}
}
for( j = 0;j<arr.length;j++){
if(min==arr[j])
break;//得到最小值的索引
}


int c= arr[j];
arr[j] = arr[arr.length-1];
arr[arr.length-1] = c;//交换
}


}


14   //编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,
//当输入n为奇数时,调用函数1/1+1/3+...+1/n
public class d517 {


public static void main(String[] args) {
sum1(13);



}
public static void sum1(int n){

if(n%2==0){
double he = 0;

int fm;
for(fm=2;fm<=n;fm +=2){
he +=1/(double)fm;//fm是int 不转换成double的话结果是0
}

System.out.println("he:"+he);
}

else
{
double he = 0;

int fm = 1;
for(;fm<=n;fm+=2){

he +=1/(double)fm;
}

System.out.println("he:"+he);
}
}}


15有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
规律,1,2,3,5,8,13,21.... 
public class d5019 {


public static void main(String[] args) {

for(int i = 1; i<100;i++)
System.out.print(getNumber(i)+" ");


}
public static int getNumber(int mouth){
if(mouth==1 || mouth==2)// ||
return 1;
else
return getNumber(mouth-1)+getNumber(mouth-2);//递归

/*mouth = 5;
getNumber(4)+getNumber(3);
mouth = 4;
getNumber(3)+getNumber(2);
mouth = 3;
getNumber(2)+getNumber(1);
mouth = 2;
return 1;
*/
}


}


16  /*2.打印一个实心菱形图案
   *
  ***
 *****
*******
 *****
  ***
   * */
public class day01_02 {


public static void main(String[] args) {

for(int i = 1;i <= 4 ; i++){
for(int j = 1; j<=4-i; j++){
System.out.print(" ");
}
for(int j = 1;j<=2*i-1;j++){
System.out.print("*");
}
System.out.println();
}
for(int i = 1;i<=3;i++){
for(int j =1;j<=i;j++){
System.out.print(" ");
}

for(int j=1;j<=7-2*i;j++){
System.out.print("*");
}
System.out.println();
}


}


}


17  /*3.打印一个空心菱形图案
问题:用*号打印一个如下的空心菱形图案 :


                 *
                * *
               *   *
              *     *
               *   *
                * *
                 *     */


public class day01_03 {


public static void main(String[] args) {

for(int i = 1;i<=4;i++){
for(int j = 1;j<=4-i;j++)
System.out.print(" ");
for(int j = 1;j<=2*i-1;j++){
if(j==1||j==2*i-1)
System.out.print("*");
else
System.out.print(" ");
}
System.out.println();
}
for(int i = 1;i<=3;i++){
for(int j = 1;j<=i;j++)
System.out.print(" ");
for(int j = 1;j<=7-2*i;j++){
if(j==1||j==7-2*i)
System.out.print("*");
else
System.out.print(" ");
}
System.out.println();
}




}

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值