一、描述
题目1:
打印出如下菱形图案(菱形)
*
***
*****
*******
*****
***
*
程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重 for循环,外层控制行,内层控制列。
对该题进行扩展:由用户输入上半部分的行数,根据行数产生任意行的菱形,如图为用户输入数字5时的结果
*
***
*****
*******
*********
*******
*****
***
*
我们采用两种方法来实现,一种是分上半部分和下半部分分别打印,一个是直接通过条件判断,整个一起打印。
题目2:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
程序分析:请抓住分子与分母的变化规律,分子从第三项开始,都是前一项分子和分母之和;分母=前一项的分子。
在前面多加1/1项,不计算进该数列,找出项之间的关系; 后项分母=前项分子;后项分子=前项分子+前项分母
题目3:求1+2!+3!+...+20!的累加和 。
二、源代码
程序1:
<span style="font-size:14px;">package tong.yue.day2;
import java.util.Scanner;
/**
* 打印出如下图案(菱形)
*
***
*****
*******
*****
***
*
程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重 for循环,外层控制行,内层控制列。
对该题进行扩展:由用户输入上半部分的行数,根据行数产生任意行的菱形,如图为用户输入数字5时的结果
*
***
*****
*******
*********
*******
*****
***
*
我们采用两种方法来实现,一种是分上半部分和下半部分分别打印,一个是直接通过条件判断,整个一起打印。
* @author tong
*
*/
public class PrintDiamond {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入上半部分的行数(大于0,小于20的正整数):");
int line = scanner.nextInt();
if (line<=0||line>20) {
System.out.println("输入数据有误,请重新输入上半部分的行数(大于0,小于20的正整数):");
line = scanner.nextInt();
}
printDiamondByOneFor(line);
System.out.println("-------------");
printDiamondByTwoFor(line);
}
//打印菱形
private static void printDiamondByOneFor(int n){
//根据图形找关系,输入的是上半部分的行数,而打印的"*"与行数满足(2*行号-1)的关系;
//该图形中间最大的"*"数与输入的上半部分行数的关系为(2*n-1)
//而两倍的空格数加上"*"号个数为中间最大行行数。
for (int i = 1; i <= 2*n-1; i++) {
//打印上半部分
if (i<=n) {
//空格数的两倍=中间最大的"*"数-当前行"*"个数
for (int j = 1; j <= ((2*n-1)-(2*i-1))/2; j++) {
System.out.print(" ");
}
//当前行打印出的"*"
for (int j = 1; j <= 2*i-1; j++) {
System.out.print("*");
}
//打印下半部分
}else {
//打印的空格数=当前行号-输入的上半部分行数
for (int j = 1; j <= i-n; j++) {
System.out.print(" ");
}
//"*"数=中间最大的"*"数-当前行空格个数*2
for (int j = (2*n-1)-2*(i-n); j >=1 ; j--) {
System.out.print("*");
}
}
System.out.println();
}
}
//打印菱形
private static void printDiamondByTwoFor(int n){
//打印上半部分
for(int i=0;i<n;i++){
for(int j=0;j<2*n;j++){
if(j<n-i){
System.out.print(" ");
}else {
if(j<=n+i){
System.out.print("*");
}
}
}
System.out.println();
}
//打印下半部分
for(int i=1;i<n;i++){
System.out.print(" ");
for(int j=0;j<2*n-i;j++){
if(j<i){
System.out.print(" ");
}else {
if(j<2*n-i-1){
System.out.print("*");
}
}
}
System.out.println();
}
}
}
</span>
运行结果:
程序2:
<span style="font-size:14px;">package tong.yue.day2;
import java.util.Scanner;
/**
* 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
程序分析:请抓住分子与分母的变化规律,分子从第三项开始,都是前一项分子和分母之和;分母=前一项的分子。
在前面多加1/1项,不计算进该数列,找出项之间的关系
后项分母=前项分子
后项分子=前项分子+前项分母
* @author tong
*
*/
public class Fraction {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入加和的项数(<=50):");
int line = scanner.nextInt();
if (line<=0||line>50) {
System.out.println("输入数据有误,请重新输入加和的项数(<=50):");
line = scanner.nextInt();
}
printSum(line);
}
private static void printSum(int line) {
double denominator = 1;//分母
double molecular = 1;//分子
double fraction = molecular/denominator;
double sum = 0;
//1/1,2/1,3/2,5/3,8/5,13/8,21/13
//在前面多加1/1项,不计算进该数列,找出项之间的关系
//后项分母=前项分子
//后项分子=前项分子+前项分母
for (int i = 1; i <= line; i++) {
double d = molecular;
double m = denominator;
molecular = d+m;//后项分子=前项分子+前项分母
denominator = d;//后项分母=前项分子
sum +=molecular/denominator; //求和
System.out.println("第"+i+"项:"+molecular+"/"+denominator);
}
System.out.println("前"+line+"项的和为:"+sum);
}
}</span>
运行结果:
程序3:
<span style="font-size:14px;">package tong.yue.day2;
import java.util.Scanner;
/**
* 求1+2!+3!+...+20!的和,本题目要求阶乘累加和。
* @author tong
*
*/
public class FactorialSum {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入阶乘加和的项数(<=20):");
int line = scanner.nextInt();
if (line<=0||line>20) {
System.out.println("输入数据有误,请重新输入阶乘加和的项数(<=20):");
line = scanner.nextInt();
}
printFactorialSum(line);
}
private static void printFactorialSum(int line) {
long sum = 0; //累加变量
long temp = 1; //累乘变量
for (int i = 1; i <= line ; i++) {
//根据项数循环,从1!+2!+...+line!
for (int j = 1; j <= i; j++) {
temp *= j;
}
sum += temp;
//每次累加一次,该变量恢复为1,继续下次累加
temp = 1;
}
System.out.println("该阶乘的累加或为:"+sum);
}
}</span>
运行结果: