package lianxi;

import java.util.Scanner;

/**
*
* @author Administrator
*9-13号练习
*
*/
public class Lx09_13 {

public static void main(String[] args) {

//1.用二维数组输出9*9乘法表
//chengfabiao01();//用二维数组输出9*9乘法表

/*2.古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,
假如兔子都不死,问每个月的兔子总数为多少?(兔子的规律为数列1,1,2,3,5,8,13,21....)这也是著名的斐波那契数列。*/
//tuzi02();

//3.1-100之间有多少个素数,并输出所有素数及素数的个数。
//sushu03();

//4.一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6 = 1+2+3.找出10000以内的所有完数。
//wanshu04();

//5.将一个4×4的数组进行逆时针旋转90度后输出,要求原始数组的数据随机输入,新数组以4行4列的方式输出。
//shuzu_zhuanbian05();

//6.编程打印杨辉三角。
//yanghui_sanjiao06();

//7.求近似Pi值。可以用公式(如:pi/2 = 1+1/3+1/3*2/5 + 1/3*2/5*3/7 + 1/3*2/5*3/7*4/9+.....)
//pi07();

//8、判断某一年是否是闰年。(1949-2017年的闰年,同时输出闰月月份)
//runnian08();//没有输出闰月月份?000

//9.获得某年、某月的最大天数。
//maxday09();

//10.输入某年某月某日,判断这一天是这一年的第几天?
//whichDay10();

//11.求一个数的阶乘。
jiecheng11();

//12. 将10进制的数转换为2进制输出
// jinzhi12();

/*13.猴子吃桃问题:
猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
程序分析:采取逆向思维的方法,从后往前推断。
*/
//taozi13();

}


/*13.猴子吃桃问题:
猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
程序分析:采取逆向思维的方法,从后往前推断。
*/
private static void taozi13() {
int[] a = new int[10];
a[0]=1;//第10天有一个
//每天的桃子数加1乘以2是前一天的桃子数
for(int i=1;i<a.length;i++) {
a[i] = (a[i-1]+1)*2;
}
System.out.print("第一天的桃子数:"+a[a.length-1]);
}



//12. 将10进制的数转换为2进制输出
private static void jinzhi12() {
Scanner y=new Scanner(System.in);//构造一个Scanner对象,其传入参数为System.in
System.out.print("请输入十进制数:");
int n=y.nextInt();//读取一个十进制数值

int[] a=new int[32];
int k=1;

for(int i=1;n/2!=0;i++) {
a[i-1]=n%2;
n=n/2;
k=i;
}
a[k]=1;//二进制最高位
System.out.print("2进制数是:");//输出转化后的2进制数
for(int i=k;i>=0;i--) {
System.out.print(a[i]);
}
}

//11.求一个数的阶乘。
private static void jiecheng11() {
Scanner y=new Scanner(System.in);//构造一个Scanner对象,其传入参数为System.in
System.out.print("请输入数字:");
int n=y.nextInt();//指定是哪个具体数
int s=1;

for(int i=1;i<=n;i++)
{
s=s*i;
}
System.out.println("阶乘是:"+s);
}


//10.输入某年某月某日,判断这一天是这一年的第几天
private static void whichDay10() {
int[] a= {31,28,31,30,31,30,31,31,30,31,30,31};//存平年中每月的天数
int sum=0;//记录是本年中的第几天
int y=2014;//年
int m=1;//月
int d=4;//日

//先计算本月以前平年的所有天数,在判断是否是闰年的2月,是的话就在2月份之后都加一天,最后再加上本月的天数
for(int i=1;i<m;i++) {
sum+=a[i-1];
}
if(m>2) {
if(y%4==0 && y%100!=0|| y%100==0 && y%400==0 ) {
sum=sum+1;
}
}
sum=sum+d;//加上本月天数
System.out.println("是本年的第"+sum+"天");
}


//9.获得某年、某月的最大天数。
private static void maxday09() {
int month=2,year=2001;//设置为某年某月
int k = 0;
//平年中每月的最大天数
switch(month) {
case 1: k=31;break;
case 2: k=28;break;
case 3: k=31;break;
case 4: k=30;break;
case 5: k=31;break;
case 6: k=30;break;
case 7: k=31;break;
case 8: k=31;break;
case 9: k=30;break;
case 10: k=31;break;
case 11: k=30;break;
case 12: k=31;break;
default:System.out.println("请重新输入");
}
//如果是闰年,2月份加一天,并输出某年某月的最大天数
if(year%4==0 && year%100!=0 && month ==2 || year%100==0 && year%400==0 && month ==2 ) {
System.out.println("最大天数是:"+k+1);
}else {
System.out.println("最大天数是:"+k);
}
}

//8、判断某一年是否是闰年。(1949-2017年的闰年,同时输出闰月月份)
//闰年是:能被4整除而不能被100整除,或者能被100整除也能被400整除。
private static void runnian08() {


for(int i=1949;i<2018;i++) {
if(i%4==0 && i%100!=0 || i%100==0 && i%400==0 ) {
System.out.println(i+"年是闰年");
}else continue;
}

}


//7.求近似Pi值。可以用公式(如:pi/2 = 1+1/3+1/3*2/5 + 1/3*2/5*3/7 + 1/3*2/5*3/7*4/9+.....)
private static void pi07() {
double s=1;
double pi=1;
int n=111;

for(int i=1;i<n;i++) {
s=i*s/(2*i+1);
pi=pi+s;
}
System.out.println("pi="+2*pi);
}

 

//6.编程打印杨辉三角。
private static void yanghui_sanjiao06() {

int[][] a = new int[5][];

for(int i=0;i<a.length;i++) {
a[i] = new int [i+1];//行数等于每行的元素个数
}
a[0][0]=1;//第一行数赋值为1

for(int i=1;i<a.length;i++) {
a[i][0]=1;//将每行第一个数设为1
for(int j=1;j<a[i].length-1;j++) {
a[i][j] = a[i-1][j-1]+a[i-1][j];
}
a[i][a[i].length-1]=1;//将每行最后一个数设为1
}
//输出杨辉三角。
System.out.println("杨辉三角:");
for(int i=0;i<a.length;i++) {
for(int j=0;j<a[i].length;j++) {
System.out.print(a[i][j]);
}
System.out.print("\n");
}
}

 


//5.将一个4×4的数组进行逆时针旋转90度后输出,要求原始数组的数据随机输入,新数组以4行4列的方式输出。
private static void shuzu_zhuanbian05() {
int[][] a = {{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4}};
//输出原数组
System.out.print("输出原数组\n");
for(int i=0;i<4;i++) {
for(int j=0;j<4;j++) {
System.out.print(a[i][j]+" ");
}
System.out.print("\n");
}
//输出转后的数组
System.out.print("输出转后的数组\n");
for(int j=3;j>=0;j--) {
for(int i=0;i<4;i++) {
System.out.print(a[i][j]+" ");
}
System.out.print("\n");
}
}

 

//4.一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6 = 1+2+3.找出10000以内的所有完数。
private static void wanshu04() {

int m=0;//记录每个数的因子数之和

for(int i=2;i<10000;i++) {
m=0;//每次都把因子总数初始化为0
for(int j=1;j<i;j++) {
if(i%j==0) {
m=j+m;
}
}
if(m == i) {
System.out.println("完数:"+m);
}
}
}




//1-100之间有多少个素数,并输出所有素数及素数的个数。
/*思路:
* i从1到100取值,j取值是从2到i-1,第二个for循环去判断i是否是素数,
* 如果是素数,就输出该i值,计算器加1,如果不是素数九跳到L1处,从新循环判断
*/
private static void sushu03() {
int c=0;//定义计数器,计算素数的个数
L1: for(int i=1;i<101;i++) {
for(int j=2;j<i;j++) {
if(i%j == 0) {
continue L1;
}
}
System.out.print(i+" ");
c++;
}
System.out.print("\n"+c);
}


/*古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,
假如兔子都不死,问每个月的兔子总数为多少?(兔子的规律为数列1,1,2,3,5,8,13,21....)这也是著名的斐波那契数列。*/
private static void tuzi02() {
int[] a = new int[9];
//前两个月赋初值为1
a[0]=1;
a[1]=1;
//计算第三个月之后的值
for(int i=2;i<a.length;i++) {
a[i]=a[i-1]+a[i-2];
}
//输出每个月的兔子数
for(int i=0;i<a.length;i++) {
System.out.print(a[i]+" ");
}
}


//用二维数组输出9*9乘法表
private static void chengfabiao01() {

int[][] a = new int[9][9];//定义一个9行的二维数组

//用for循环打印输出,i控制行数,j控制每行的列数
for(int i=0;i<a.length;i++) {
for(int j=0;j<i+1;j++) {
System.out.print((i+1)+"*"+(j+1)+"="+(i+1)*(j+1)+" ");
}
System.out.println("\n");//每行结束后换行
}
}

}