飞道的博客

30道JAVA基础编程练习题

398人阅读  评论(0)

30道JAVA基础编程练习题

  1. 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?(输出第10个月的兔子对数)
    程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21…
1.1
2.1
3 .3(T1生了T3)
4.5(T1生了T4,T2生了T5)
5.8(T1生了T6,T2生了T7,T生了T8)
6.13(T4、T5也加入了生兔子大军)
****(运用递归(数列)方法):F(1)=1F(2)=1, F(n)=F(n-1)+F(n-2)
public class TextOne {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		for(int i=1;i<=10;i++){
          int num=getNum(i);         //调用递归方法
		System.out.print("第"+i+"个月,数量为:"+num);	
	}
}
public static int getNum(int i){                 //静态方法防止无限循环,非静态方法需实例化才可以用
if(i==1||i==2){
return 1;
}else{
return getNum(i-1)+getNum(i-2);
}
}
}
  1. 题目:判断101-200之间有多少个素数,并输出所有素数。
    程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。
public static void main(String[] args) {
		int count = 0;
		for (int i = 101; i <= 200; i++) {
			boolean b = true;
			for (int j = 2; j < i; j++) {
				// 判断i是否能被整除
				if (i % j == 0) {
					b = false;
					break;
				} else {
					b = true;
				}
			}
			if (b) {
				System.out.print("  " + i);
				count++;
			}
		}
		System.out.print("   101~200的素数为:" + count);
	}
}

  1. 题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
    程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int i,j,n;
		for(int x=100;x<999;x++) {
			i=x%10;
			j=x/10%10;
			n=x/100;	
			if(x==i*i*i+j*j*j+n*n*n) {
				System.out.println(x+" ");
			}
		}
	}
}

  1. 题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
    程序分析:(a>b)?a:b这是条件运算符的基本例子。
public static void main(String[] args) {
		// TODO Auto-generated method stub
		String a = "A",b = "B",c = "C";
		System.out.println("enter score:");
		//输入成绩
		Scanner s=new Scanner(System.in);
		//读取成绩
		double score=s.nextInt();
		//判断成绩等级
		if(score>100||score<0) {
			System.out.println("输入无效");
		}
		else {		
		System.out.println("grade is:"+((score>60)?((score>89)?a:b):c));
	}
	}
}

  1. 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
    程序分析:利用定义法。
辗转相除定理:两个整数m和n(m>n)他们的最大公约数等于m除以n的余数c和较小数n之间的最大公约数
两个数相除得出余数——>若余数不为0,则拿较小的数与余数继续相除,判断新的余数是否为0;
若余数为0,则最大公约数即本次相除中较小的数

方法一:

import java.util.Scanner;

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int a = 0;
		int c[] = new int[2];
		int m = c[0];
		int n = c[1];
		Scanner s = new Scanner(System.in);
		System.out.println("enter:");
		for (int i = 0; i < 2; i++) {
			c[i] = s.nextInt();
		}
		if (m > n) {
			for (int i = 0; i < 2; i++) {
				a = m % n;
				while (a != 0) {
					a = m % n;
				}
				if (a == 0) {
					a = n;
					break;
				}
			}
		} else {
			m = c[1];
			n = c[0];
			for (int i = 0; i < 2; i++) {
				a = m % n;
				if (a != 0) {
					a = m % n;
				}
				if (a == 0) {
					a = n;
					break;
				}
			}
		}
		System.out.println("最大公约数为:" + a);
		System.out.println("最小公倍数为:" + m * n / a);
	}
}

方法二:

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("输入两个整数m和n:");
		Scanner scan =new Scanner(System.in);
		int m=scan.nextInt();
		int n=scan.nextInt();
		int max=(m>n?m:n);
		int min=(m<n?m:n);
		
		// 先求最大公约数
		int i=min;
		//大到小,有一个条件不满足,则继续向下找
		while((min%i!=0)||(max%i!=0)){
			i--;
		}
		System.out.println("最大公约数:"+i);
		System.out.println("最小公倍数:"+(m*n)/i);		
	}
}

报错:Syntax error on token ".", @ expected after this token
          要把代码写在主方法体里面,否则报错
  1. 题目:求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制。
    程序分析:关键是计算出每一项的值。
	public static void main(String[] args) {
		 Scanner s = new Scanner(System.in);
		int a = s.nextInt();
		Scanner c = new Scanner(System.in);
		int n = c.nextInt();
		System.out.println(expressed(a, n) + add(a, n));
	}
	// 列出字符串表达式a+aa+aaa+aaaa+aa...a
	public static String expressed(int a, int n) {
		// 字符串常量一旦声明则不可改变,而字符串对象可以改变,但是改变的是其内存地址的指向
		/*StringBuffer类方便用户进行内容的修改。在String类中使用“+”作为数据库的连接操作,
而在StringBuffer类中使用append()方法(方法定义:public StringBuffer append(数据类型 变量))进行数据的连接。 */
		StringBuffer sb = new StringBuffer();
		StringBuffer subSB = new StringBuffer();
		for (int i = 1; i < n + 1; i++) {
		subSB = subSB.append(a); //子项
			sb = sb.append(subSB); //总项
			if (i < n) //不要最后的+
				sb = sb.append("+");
		}
		sb.append("=");
		return sb.toString();
	}	// 求和
	public static long add(int a, int n) { // a为数字,n为每一项的位数
		long sum = 0; //总项
		long subSUM = 0; //每一项
		for (int i = 1; i < n + 1; i++) {
			subSUM = subSUM * 10 + a; //整体进位,低位补a
			sum = sum + subSUM; //加到整体中
		}
		return sum;
	}

  1. 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?并分别打印出这些数
    程序分析:可填在百位、十位、个位的数字都是1、2、3、4,组成所有的排列后再去掉不满足条件的排列。
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int i, j, k, sum = 0;
		int count = 0; // 逐为增加,各位相等就继续循环加一直到各位不相等
		for (i = 1; i <= 4; i++) {
			for (j = 1; j <= 4; j++) {
				if (i == j) {
					continue;
				}
				for (k = 1; k <= 4; k++) {
					if (k == i || k == j) {
						continue;
					}
					int n = j * 10; // 算出十位的数
					int m = k * 100; // 算出百位的数
					sum = i + n + m; // 应先输出再换行才能输出够十个才会换行
					System.out.print(sum); // 否则变成第一行九个但实际一算出10个就换行才输出
					System.out.print(" ");       // 错误: if((++count)%10==0) {
					if ((++count) % 10 == 0) {   // System.out.print("\n");
						System.out.print("\n"); //  }
					}                          // System.out.print(sum); 
				}                              // System.out.print(" ");
			}
		}
		System.out.print("可以组成" + count + "个 ");
	}

  1. 题目:输入某年某月某日,判断这一天是这一年的第几天?
    程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。

方法一:

public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sca = new Scanner(System.in);
		int year = sca.nextInt();
		int month = sca.nextInt();
		int day = sca.nextInt();
		System.out.println(year + "年的第" + getDay(year, month, day) + "天");
	}
	public static int getDay(int year, int month, int day) {
		// 闰年
		if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
			// 第一个月
			if (month == 1) {
				day = day;
			}
			// 第二个月
			if (month == 2) {
				// 闰年第二个月最多只有29天
				if (day > 29) {
					System.out.print("不存在");
					return 0;
				} else {
					day = day + 31;
				}
			}
			// 超过七月时变成双数有31天
			if (month < 8 && month > 2) {
				if (month % 2 == 1) {
					day = ((month - 1) / 2) * 31 + ((month - 1) / 2) * 30 - 1 + day;
				} else {
					day = (month / 2) * 31 + ((month / 2) - 1) * 30 - 1 + day;
				}
				if (month >= 8) {
					if (month % 2 == 1) {
						day = (((month - 3) / 2) * 30 - 1) + ((month + 1) / 2) * 31 + day;
					} else {
						day = (((month / 2) * 31) + ((month - 2) / 2) * 30 - 1) + day;
					}
				}
			}
		} else {
			if (month == 1) {
				day = day;
			}
			if (month == 2) {
				if (day > 28) {
					System.out.print("不存在");
				} else {
					day = day + 30;
				}
			}
			if (month < 8 && month > 2) {
				if (month % 2 == 1) {
					day = ((month - 1) / 2) * 31 + ((month - 1) / 2) * 30 - 2 + day;
				} else {
					day = (month / 2) * 31 + ((month / 2) - 1) * 30 + day;
				}
			}
			if (month >= 8) {
				if (month % 2 == 1) {
					day = (((month - 3) / 2) * 30 - 2) + ((month + 1) / 2) * 31 + day;
				} else {
					day = (((month / 2) * 31) + ((month - 2) / 2) * 30 - 2) + day;
				}
			}
		}
		return day;
	}

方法二:

public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sca = new Scanner(System.in).useDelimiter("\\D");
        System.out.println("请输入当前日期(年-月-日)");
		int year = sca.nextInt();
		int month = sca.nextInt();
		int day = sca.nextInt();
		System.out.println(year + "年的第" + getDay(year, month, day) + "天");
	}
	public static int getDay(int year, int month, int day) {
		int n = 0;
// 要加的前一个月
		int month_data[] = new int[] { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30 }; 
		if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
			month_data[2] = 29;
		}
		for (int i = 0; i < month; i++) {
			n += month_data[i];
		}
		return n + day;
	}
}

方法三:

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sca = new Scanner(System.in);
		int year = sca.nextInt();
		int month = sca.nextInt();
		int day = sca.nextInt();
		System.out.println(year + "年的第" + getDay(year, month, day) + "天");
	}
	public static int getDay(int year, int month, int day) {
		int sum = 0;
		/* 先计算某月以前月份的总天数 */
		switch (month) {
		case 1:
			sum = 0;
			break;
		case 2:
			sum = 31;
			break;
		case 3:
			sum = 59;
			break;
		case 4:
			sum = 90;
			break;
		case 5:
			sum = 120;
			break;
		case 6:
			sum = 151;
			break;
		case 7:
			sum = 181;
			break;
		case 8:
			sum = 212;
			break;
		case 9:
			sum = 243;
			break;
		case 10:
			sum = 273;
			break;
		case 11:
			sum = 304;
			break;
		case 12:
			sum = 334;
			break;
		default:
			System.out.println("输入错误");
			break;
		}
		sum = sum + day;         /*再加上某月的天数*/
		if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
			if (month > 2) {
				sum++;                  /*如果是闰年且月份大于2,总天数应该加一天*/				 
			}
		}
		return sum;
	}
}

  1. 题目:输出9*9口诀。
    程序分析:分行与列考虑,共9行9列,i控制行,j控制列。
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int i, j;
		// 从左到右输出,每一行只有i个式子
		for (i = 1; i <= 9; i++) {
			for (j = 1; j <= i; j++) {
				System.out.print(j + "×" + i + "=" + i * j + "\t");“ ”换成“\t”,现在来说明空格和“\t”的区别!
			}
			System.out.println();
\t是补全当前字符串长度到8的整数倍,最少1个最多8个空格
}                             补多少要看你\t前字符串长度
}                比如当前字符串长度10,那么\t后长度是16,也就是补6个空格
}                            如果当前字符串长度12,此时\t后长度是16,补4个空格	

  1. 题目:打印出如下图案(菱形)
    程序分析:先把图形分成两部分来看待,前五行一个规律,后四行一个规律,利用双重for循环,第一层控制行,第二层控制列。
    (最多一行九个星星)
                    上半部分
    *            第一行:四个空格一个星星
   ***           第二行:三个空格三个星星
  *****          第三行:二个空格五个星星
 *******         第四行:一个空格七个星星
*********        第五行:零个空格九个星星
 *******   空格数:总行数-行号       星星数:2*行号-1
  *****   行:外层for循环         内层for循环             内层for循环
   ***
    *

方法一:

public static void main(String[] args) {
		// TODO Auto-generated method stub
		int i, j, k, n = 5;
		for (i = 1; i <= n; i++) { // 控制行数
			// 只需要打印左边的空格,右边会自动生成,每一行星星前面有n-i个星星
			for (j = 1; j <= n - i; j++) {
				System.out.print(" ");
			}
			// 打印完空格打印2*i-1个星星,每一行有2*i-1个星星
			for (k = 1; k <= 2 * i - 1; k++) {
				System.out.print("*");
			}
			System.out.println();
		}
		// 控制下半部分行数
		// 把上面的倒过来输出,第六行相当于第四行
		for (i = n - 1; i >= 1; i--) {
			// 只需要打印左边的空格,右边会自动生成
			for (j = 1; j <= n - i; j++) {
				System.out.print(" ");
			}
			// 打印完空格打印2*i-1个星星
			for (k = 1; k <= 2 * i - 1; k++) {
				System.out.print("*");
			}
			System.out.println();
		}
	}

方法二:

public static void main(String[] args) {
		// TODO Auto-generated method stub
		int n = 5;
		printStar(n);
	}
	public static void printStar(int n) {
		// 打印上半部分
		for (int i = 0; i < n; i++) {
			// 每一行有十个位置
			for (int j = 0; j < 2 * n; j++) {
				// n-i为空格数
				if (j < (n - i)) {
					System.out.print(" ");
				}
				// n+i为最后一个星星数
				if (j >= n - i && j <= n + i) {
					System.out.print("*");
				}
			}
			System.out.println();
		}
		// 打印下半部分
		for (int i = 1; i < n; i++) {
			System.out.print(" ");
			// 2*n-i为星星数
			for (int j = 0; j < 2 * n - i; j++) {
				// i为每行空格数
				if (j < i) {
					System.out.print(" ");
				}
				// 2*n-i-1为最后一个星星位置
				if (j >= i && j < 2 * n - i - 1) {
					System.out.print("*");
				}
			}
			System.out.println();
		}
	}

  1. 题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。
    程序分析:请抓住分子与分母的变化规律。
a=a+b;与a+=b;的区别:
不同类型的两个变量在进行运算的时候,我们经常说到的是类型的转换问题。
这里,记住两点:
*一、运算过程中,低精度的类型向高精度类型转换。
*二、如果将高精度的数值赋值给低精度类型变量,则必须要进行显性的强制转换。
 对于a+=b;这个式子,要明确的一点是,+=运算中,结合了强制类型转换的功能,因此,不会出现编译错误
而对于a=a+b;这个式子,因为是简单的运算,没有类型转换,在编译过程中会报错

方法一:

public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 从第二个数开始
		// 分子=前一个数的分子+分母
		// 分母=前一个数的分子
		double n1 = 1, n2 = 1, n, sum = 0;
		for (int i = 1; i <= 20; i++) {
			double t1 = n1;
			double t2 = n2;
			n1 = t1 + t2;
			n2 = t1;
			n = n1 / n2;
			sum += n;
		}
		System.out.print("sum=" + sum);
	}

方法二:

public static void main(String[] args) {
		// TODO Auto-generated method stub
		int i,zi=2,mu=1;
		double sum=0;
		//循环20次算前20项之和
		for(i=0;i<20;i++) {
			//将分子转换为double型,否则两个int相除结果还是int,会舍弃小数点后的数
//(double)(zi/mu)将先是int型才是double型,(double)zi/mu将zi转为double型再计算结果仍是double型
			sum+=(double)zi/mu;
			//后一个数的分子是前一个数的分子和分母之和
			zi=zi+mu;
			//此时新分子已经是原分子分母的和了,只需要再减去原分母。即可将原分子赋给新分母。
			mu=zi-mu;
		}
		System.out.print("sum="+sum);
	}

  1. 题目:求1+2!+3!+…+20!的和
    程序分析:此程序只是把累加变成了累乘。

方法一:

//外层循环控制累加,内层循环控制累乘
public static void main(String[] args) {
		// TODO Auto-generated method stub
		int i = 0, j = 0;
		System.out.print("sum=" + getMul(i, j));
	}

	public static long getMul(int i, int j) {
		long sum = 0;                               //单层循环:long sum = 0;		                                            
		for (i = 1; i <= 20; i++) {                    //       long n=1; 
			long n = 1;                                 //      for(i=1;i<=20;i++) {
			for (j = 1; j <= i; j++) {                 //       sum+=n;
				n *= j;                                //       n*=i;                                            
			}                                              //     }   
			sum += n;                                    //    return sum;
		}            
		return sum;
	}
}

方法二:

public static void main(String[] args) {
	        long sum = 0;
			for (int i = 0; i < 20; i++){
				sum += factorial(i + 1);        //即sum=sum+mult,将i+1传递给n
}
			System.out.println(sum);
		}
		// 阶乘
		private static long factorial(int n) {    //当i=1,n=2,加到2!,i=1即第二项为二阶乘
			long mult = 1;             //此处mult不能用int,否则到后面会损失精度
			for (int i = 1; i < n + 1; i++){          //当主方法的i=1,这里n=3循环2次     
				mult *= i;
}
			return mult;
		}

  1. 题目:利用递归方法求5!。
    程序分析:递归公式:fn=fn_1*4!
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int n = 5;
		System.out.print("5!=" + fn(n));          //1~5累乘
	}
//传入一个数据累乘操作的最大值,而后每次进行数据的递减,一直累乘到计算数据为1
	private static int fn(int n) {     //最大的内容
		if (n == 1) {                  //递归的结束调用
			return 1;                  //最终的结果返回了1
		}
//递归调用:5*fn(4);——>5*4*fn(3)——>5*4*3*fn(2)——>5*4*3*2*fn(1)==5*4*3*2*1
		return n * (fn(n - 1));       
	}

  1. 题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
 java中并不支持多维数组,但它允许一维数组作为另一个一维数组的元素,以此来达成多维数组的功能
a.length指二维数组a的行数,a[0].length指第一行中元素的个数
s.length是针对java中数组的,length是数组的一个属性,用来表示数组的长度
s.length()则是字符串的一个方法,用来返回字符串的长度的
字符串是没有length属性的,只有length()方法
数组有length属性,而没有length()方法
public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sca = new Scanner(System.in);
		String a = sca.next();
		if (a.length() > 5) { // s.length()则是字符串的一个方法,用来返回字符串的长度的
			System.out.print("输入错误");
		} else {
			System.out.println(a + "是" + a.length() + "位数");
			System.out.println("逆序输出为:");
			for (int i = a.length() - 1; i >= 0; i--) {
				System.out.print(a.charAt(i) + " ");
			}
		}
	}
	
  1. 题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int hui = sc.nextInt();
		if (hui < 10000 || hui > 99999) {
			System.out.print("输入错误");
		} else {
			if ((hui % 10 == hui / 10000) && (hui / 10 % 10 == hui / 1000 % 10)) {
				System.out.print(hui + "是回文数");
			} else {
				System.out.print(hui + "不是回文数");
			}
		}
	}

  1. 题目:对10个数进行排序
    程序分析:利用冒泡法,通过邻位的交换,把当前剩余最大数赶到右边,然后依次从右到左,确定各位的数。输入:31, 42, 21, 50, 12, 60, 81, 74, 101, 93
先第一个跟第二个比较交换,第二个跟第三个比较交换......
然后遍历完后又返回重新第一个与第二个比较交换,第二个与第三个比较交换,以此类推
public static void main(String[] args) {
		// TODO Auto-generated method stub
//利用键盘输入读取数组的方法,也可自定义一个数组即:
int[] a=new int[]{31,42,21,50,12,60,81,74,101,93} 
		int[] a = new int[10];
		int m = 0;
		Scanner sc = new Scanner(System.in);
		for (int i = 0; i < 10; i++) {
			a[i] = sc.nextInt();
		}
		for (int i = 0; i < 10; i++) {    // 外层循环控制比较次数
/*j<a.length-1是因为循环了一遍后最后一个已经是最大值,不需要再比较被推到最后的数,
			循环一遍最后面有一个最大,两遍有两个最大	*/		
			for (int j = 0; j < a.length - i - 1; j++) {  // 内层循环控制相邻
				if (a[j] > a[j + 1]) {
					m = a[j];
					a[j] = a[j + 1];
					a[j + 1] = m;
				}
			}
		}
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i] + " ");
		}
	}

  1. 题目:求一个3*3矩阵对角线元素之和
    程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[][] a = new int[][] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
		for (int i = 0; i < a.length; i++) { // 外层循环控制数组的行内容
			for (int j = 0; j < a[i].length; j++) { // 内层循环控制数组的列内容
				System.out.print(a[i][j] + "\t");
			}
			System.out.println();
		}
		int sum1 = 0, sum2 = 0;
		for (int i = 0; i < a.length; i++) {
			for (int j = 0; j < a[i].length; j++) {
				if (i == j) {
					sum1 += a[i][j];
				}
				if (i == a.length - i - 1) {
					sum2 += a[i][j];
				}
			}
		}
		System.out.print("矩阵对角线为:" + sum1 + "和" + sum2);
	}

  1. 题目:打印出杨辉三角形(要求打印出10行如下图)
    程序分析:用10×21列二维数组存储。

方法一:(利用递归方法)

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int a[][] = new int[10][21];
		for (int i = 1; i <= 10; i++) {
			for (int k = 1; k < (10 - i) + 1; k++) { // 在数字之前打印空格
				System.out.print("  ");    //此处为两个空格
			}
			for (int j = 1; j <= i; j++) {
				System.out.print(fun(i, j) + "   ");    //此处三个空格
			}
			System.out.println();
		}
	}
	public static int fun(int n, int k) {
		if (k == 1 || n == k) { // 每行第一个或者最后一个为1
			return 1;
		} else {
			return fun(n - 1, k - 1) + fun(n - 1, k); // 调用递归方法计算
		}
	}

方法二:

int[][] a=new int[10][21];   //创建一个二维数组
		//赋值
		for(int i=0;i<10;i++) {
			a[i][0]=1;      //每一行第一个为1 
			a[i][i]=1;      //每一行最后一个为1 
		}
			for(int j=2;j<10;j++) {       //第二行开始计算
				for(int n=1;n<j;n++) {     //第j行只有j个数
				a[j][n]=a[j-1][n-1]+a[j-1][n];  //每个数等于它上方两数之和。
			}
		}
		//打印
		for(int i=0;i<10;i++) {   //控制行
			for(int j=0;j<2*(10-i)-1;j++) {  				
					System.out.print(" ");       //此处为两个空格
				}
				for(int k=0;k<=i;k++){
					System.out.print(a[i][k]+"   ");  //此处三个空格
				}
				System.out.println();
			}
		}

方法三:

public static void main(String[] args) {
		// TODO Auto-generated method stub
		/**** 1 要理解下面的实现,首先要明白int数组中元素默认值为 0
	     * 2 然后每一次迭代打印新的一行的元素的时候:
	     * 新的特定位置的元素 = 该位置原来的元素 + 该位置的前一个位置的值
	     *****/
		int a[][] = new int[10][21];
		int b[] = new int[10 + 1]; // 临时存储数据用
		int previous = 1; // 默认第一个数
		for (int i = 1; i <= 10; i++) { // i 用来控制行数
			for (int j = 1; j <= 10 - i; j++) { // 输出空格
				System.out.print("  ");
			}
			for (int j = 1; j <= i; j++) {
				int current = b[j]; // 先获得后一个数
				b[j] = previous + current;
				previous = current;
				System.out.print(b[j] + "   ");
			}
			System.out.println();
		}
	}

  1. 题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
索引:数组中的元素在内存是连续排列的,有时我们我处理里面的数据并不是从头取到尾,
有时从中间取,所以这里就需要一个下标,标记是在哪个位置,这个下标就就是索引,
比如中药铺里面的药柜,要写明药名是不,这个名就是索引.而数组下标是从0开始的. 
比如a[0],a[1],a[2],a[3],a[4],a[5]0,1,2,3,4,5,就是索引
public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		System.out.println("输入人数:");
		int n = sc.nextInt();
		/**** 初始化人员 ****/
		boolean a[] = new boolean[n]; // boolean数组表示站成一圈的人,false表示退出
		// 初始化使每个人都是true,都在圈内
		for (int i = 0; i < a.length; i++) {
			a[i] = true;
		}		
/**** 报号 ****/
		int incount = n;        // 还在圈内人数
		int inNumber = 0;         // 本轮报数
		int inDex = 0;          // 数组n中的标记索引
// 圈内有9个人,此时a[0]==true,还没开始报数,先判断是否是真,是真则报数
		while (incount > 1) {      // 只要圈内多于一人就可以继续
			// 是true才报数,inNumber才加一
			if (a[inDex] == true) {
				inNumber++;              // 本轮报数加一
				if (inNumber == 3) {         // 如果本轮报数为3
					inNumber = 0;        // 本轮结束,本轮报数归零
					a[inDex] = false;     // 置false,表示退出
					incount--;        // 圈内人数减一
				}
			}
			inDex++; // 对下一个人进行判断
			if (inDex == n) {            // 得一圈后重新开始
				inDex = 0;			
}
		}
		// 如果i=1则指向第二个,此处索引应从0开始
		for (int i = 0; i < n; i++) {
			if (a[i] == true) {
				System.out.print(i + 1);       // 第i个人的下标为i-1
			}
		}
	}

  1. 题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。请编写程序,从键盘输入4位整数,然后进行加密输出。
public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("请输入四个整数:");
		Scanner sc = new Scanner(System.in);
		// 把输入的数分别取出来放在数组而不是输入数组
		int n = sc.nextInt();
		// 输入数组长度为四的数
		int a[] = new int[4];
		int temp2 = 0, temp1 = 0;
		// 输入1234默认a[0]为1234,如需a[0]=1,a[1]=2......应输入1空格2空格......
		// 从左到右取存
		for (int i = 3; i >= 0; i--) {
			a[i] = n % 10;
			n /= 10;
		}
		// 注意:要一边循环一边输出换好的值,不能运算后输出一个再回去循环再输出一个
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i]);
		}
		for (int i = 0; i < a.length; i++) {
			a[i] += 5;
			a[i] %= 10;
		}
		System.out.println();
		// 此处只要交换一次,不需要用循环,如果在循环里交换就会循环几次导致交换多次变回原来的样子
		temp1 = a[0];
		a[0] = a[3];
		a[3] = temp1;
		temp2 = a[1];
		a[1] = a[2];
		a[2] = temp2;
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i]);
		}
	}

  1. 题目:有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩,将原有的数据和计算出的平均分数存放在磁盘文件"test21.txt"中。
public class TextFifty {
// 定义学生模型
String name[] = new String[5]; // 定义名字长度为5的数组
String number[] = new String[12]; // 定义学号
double grade[][] = new double[5][3]; // 定义五个学生三门课成绩
double sum[] = new double[5]; // 定义五个学生的总成绩
	public static void main(String[] args) throws IOException {
	// TODO Auto-generated method stub
	TextFifty stud = new TextFifty();
		qw.input();
	qw.output();
}
// 输入学号、姓名、成绩
public void input() {
		Scanner sc = new Scanner(System.in);
		// 控制行内容
		for (int i = 0; i < 5; i++) {
			System.out.println("请输入学号:");
			// 每循环一次存一个到数组
			number[i] = sc.next();
			System.out.println("请输入名字:");
			name[i] = sc.next();
			// 控制列内容
			for (int j = 0; j < 3; j++) {
				System.out.println("请输入第" + (j + 1) + "门课成绩"); // 分别输入三科成绩
				grade[i][j] = sc.nextInt(); // 将成绩一个一个存到数据
			}
			System.out.println();
			sum[i] = grade[i][0] + grade[i][1] + grade[i][2]; // 计算每个人总成绩
		}
	}
	// 输出/写入文件	
public void output() throws IOException {
		// 创建文件输出流对象,“//”为分隔符,文件放在F盘的这个文件中
		FileWriter fw = new FileWriter("F://text21.txt"); 
// 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
		BufferedWriter bw = new BufferedWriter(fw); 
		bw.write("No.     " + "Name  " + "grade1" + "    grade2   " + " grade3   " + "average"); // 输出标题
// newLine():写入一个行分隔符。行分隔符字符串由系统属性 line.separator 定义,并且不一定是单个新行 ('\n') 符
		bw.newLine(); 		
		for (int i = 0; i < 5; i++) {
			bw.write(number[i]);
			bw.write("  " + name[i]);
			for (int j = 0; j < 3; j++) {
				bw.write("  " + grade[i][j]);
			}
			bw.write("  " + sum[i] / 3);
			bw.newLine();
		}		
bw.close();
	}
}

22.(1) 编写一个抽象类Shape,声明计算图形面积的抽象方法getArea。(2)分别定义Shape的子类Circle(圆)和Rectangle(矩形),子类Circle(圆)增加半径属性r,子类Rectangle(矩形)增加宽、高属性w和h,在两个子类中按照不同图形的面积计算公式,实现Shape类中计算面积的方法。(3)编写主类MainClass,在main()方法中分别创建子类Circle(圆)和Rectangle(矩形),数据自定,并输出这两个图形的面积。

方法一:

public static void main(String[] args) {
		// TODO Auto-generated method stub
		Circle c=new Circle(2);
		Rectangle re=new Rectangle(2,4);		
		System.out.println(c.getArea());
		System.out.println(re.getArea());
}
	}
abstract class  Shape{
	public abstract double getArea() ;
}
class Circle extends Shape{
	double r;
	double S;
	//实现父类抽象方法
	public Circle(double r) {
		this.r=r;
	}
	public double getArea() {
		// TODO Auto-generated method stub
		return S=3.14*r*r;
	}
}
class Rectangle extends Shape{
	double w,h,s;
	//实现父类抽象方法
	public Rectangle(double w,double h) {
		this.w=w;
		this.h=h;
	}
	public double getArea() {
		// TODO Auto-generated method stub
		return s=w*h;
	}	

方法二:

abstract class Shape{
    abstract double getArea();
}
class Circle extends Shape{
    private double r=10;
    double getArea(){
        return 3.14*r*r;
    }
}
class Rectangle extends Shape{
    private double w=10;
    private double h=20;
    double getArea(){
        return w*h;
    }
}
public class MainClass {
    public static void main(String args[]) {
        Circle cir =new Circle();
        Rectangle rec =new Rectangle();
        System.out.println("The area of Circle is:" + cir.getArea());
        System.out.println("The area of Rectangle is:" + rec.getArea());
    }
}


转载:https://blog.csdn.net/jiangchengchenga/article/details/105282319
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场