倒计时5

一、调和级数
使用BigDecimal,注意,BigDecimal.add(new BigDecimal(String s))这个方法使用后需要再赋值,因为BigDecimal不变。如:num=num.add(new BigDecimal(s));。否则num不变
因为t在一开始被赋值为1 ,但在while循环中,一直有t++,所以最后t–。答案是1835421

1/1 + 1/2 + 1/3 + 1/4 + … 在数学上称为调和级数。
它是发散的,也就是说,只要加上足够多的项,就可以得到任意大的数字。
但是,它发散的很慢:

前1项和达到 1.0
前4项和才超过 2.0
前83项的和才超过 5.0

那么,请你计算一下,要加多少项,才能使得和达到或超过 15.0 呢?
请填写这个整数。
注意:只需要填写一个整数,不要填写任何多余的内容。比如说明文字。

package lijie_14;

import java.math.BigDecimal;
import java.math.BigInteger;

public class B {
   public static void main(String[] args) {
   	
   	BigDecimal num=new BigDecimal("0");
   	float t=1;
   	while(num.compareTo(new BigDecimal("15"))==-1){
   		String s=Float.toString(1/t);
   		num=num.add(new BigDecimal(s));
//			num.
   		t++;
//			System.out.println(num);
   		if(t==83){
   			System.out.println(num);
   		}
   	}
   	
   	System.out.println(num);
   	System.out.println((int)t);
   }
}

二、今有7对数字:两个1,两个2,两个3,…两个7,把它们排成一行。
要求,两个1间有1个其它数字,两个2间有2个其它数字,以此类推,两个7之间有7个其它数字。如下就是一个符合要求的排列:

17126425374635

当然,如果把它倒过来,也是符合要求的。

请你找出另一种符合要求的排列法,并且这个排列法是以74开头的。

注意:只填写这个14位的整数,不能填写任何多余的内容,比如说明注释等。
答案:7 4 1 5 1 6 4 3 7 5 2 3 6 2
思路:全排列,然后根据规则进行选择答案。设定一个数组,记录该元素是否已被访问。

package lijie_14;

public class D {
  static int res=0;
  public static void main(String[] args) {
  	int []num={7,4,4,7,2,2,3,3,1,5,5,6,6,1};
  	demo(num,4,13);
  	System.out.println(res);
  	
//		int []num={1,7,1,2,6,4,2,5,3,7,4,6,3,5};
//		System.out.println(test(num));
//		int []num={7,4,1,5,2,3,4,6,7,3,6,5,1,2};
//		boolean[] vis=new boolean[14];
//		for(int i=0;i<14;i++){
//			int t=num[i];
//			vis[t]=true;
//			if(num[i]+1+i<14){
//				System.out.println("1..."+t+"..."+(num[i]+1+i)+"..."+num[num[i]+1+i]);
//				if(num[num[i]+1+i]==t){//可以
//					continue;
//				}
//			}else if(i-num[i]-1>=0){
//				System.out.println("2..."+t+"..."+(i-num[i]-1)+"..."+(num[i-num[i]-1]));
//				if(num[i-num[i]-1]==t){//可以
//					continue;
//				}
//			}else{//不可以
				return -1;
//			}
//		}
  	
  	
  }
  public static int test(int []num){
  	  boolean[]vis=new boolean[num.length+1];
  		for(int i=0;i<14;i++){
  			
  			int t=num[i];
  			
//				System.out.print(i+","+t+"*");
  			if(num[i]+1+i<14&&(!vis[t])){
//					System.out.println((num[i]+1+i)+","+num[num[i]+1+i]+",");
  				if(num[num[i]+1+i]==t){//可以
  					
  				}else{
  					return -1;
  				}
  				vis[t]=true;
  			}else if(i-num[i]-1>0&&(!vis[t])){
//					System.out.println((i-num[i]-1)+","+num[i-num[i]-1]);
  				if(num[i-num[i]-1]==t){//可以
  					
  				}else{
  					return -1;
  				}
  				vis[t]=true;
  			}else if(vis[t]==true){
  				
  			}else{//不可以
  				return -1;
  			}
  		}
  		return 0;
  	}
  
  
  /**
   * 全排列
   * */
  public static void demo(int []num,int start,int end){
  	if(start==end){
  		int temp=num[2];
  		num[2]=num[6];
  		num[6]=temp;
  		
  		temp=num[3];
  		num[3]=num[8];
  		num[8]=temp;
  		if(test(num)==0){
  			res++;
  			for(int i=0;i<=end;i++){
  				System.out.print(num[i]+" ");
  			}
  			System.out.println();
  		}
  		temp=num[2];
  		num[2]=num[6];
  		num[6]=temp;
  		
  		temp=num[3];
  		num[3]=num[8];
  		num[8]=temp;
  	}else{
  		for(int i=start;i<=end;i++){
  				swap(num,i,start);
  				demo(num,start+1,end);
  				swap(num,i,start);
  		}
  	}
  }
  
  public static void swap(int []num,int i,int j){
  	int t=num[i];
  	num[i]=num[j];
  	num[j]=t;
  }
}

三、勾股定理,西方称为毕达哥拉斯定理,它所对应的三角形现在称为:直角三角形。
已知直角三角形的斜边是某个整数,并且要求另外两条边也必须是整数。求满足这个条件的不同直角三角形的个数。

【数据格式】
输入一个整数 n (0<n<10000000) 表示直角三角形斜边的长度。
要求输出一个整数,表示满足条件的直角三角形个数。

例如,输入:
5
程序应该输出:
1

再例如,输入:
100
程序应该输出:
2

再例如,输入:
3
程序应该输出:
0

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms

思路:nn=aa+b*b
a从1开始遍历,可获得对应的b,如果a b都是整数,就将n a b送去判断是不是三角形

package lijie_14;

import java.util.Scanner;
import java.util.TreeMap;

public class E {
  public static void main(String[] args) {
  	TreeMap<Integer, Integer> tm=new TreeMap<Integer, Integer>();
  	Scanner sc=new Scanner(System.in);
  	int n=sc.nextInt();
  	for(int i=1;i<n;i++){
  		double t=Math.sqrt(n*n-i*i);
  		if(t==(int)t){
  			if(Rec(n,i,(int)t)){
  				if(i>(int)t){
  					tm.put((int)t,1);
  				}else{
  					tm.put((int)i,1);
  				}
  			}
  		}
  	}
  	System.out.println(tm.size());
  }
  /**
   * 判断是不是三角形(n>a>b)
   * */
  public static boolean Rec(int n,int a,int b){
  	if(a>=b){
  		
  	}else{
  		int t=a;
  		a=b;
  		b=a;
  	}
  	//两边之和大于第三边   两边之差小于第三边
  	if((a+b>n)&&(n-b<a)){
  		return true;
  	}else{
  		return false;
  	}
  	
  }
}

四、你一定听说过“数独”游戏。
如【图1.png】,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含1-9,不重复。数独的答案都是唯一的,所以,多个解也称为无解。本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目。但对会使用计算机编程的你来说,恐怕易如反掌了。

本题的要求就是输入数独题目,程序输出数独的唯一解。我们保证所有已知数据的格式都是合法的,并且题目有唯一的解。

格式要求,输入9行,每行9个字符,0代表未知,其它数字为已知。
输出9行,每行9个数字表示数独的解。

例如:
输入(即图中题目):
005300000
800000020
070010500
400005300
010070006
003200080
060500009
004000030
000009700

程序应该输出:
145327698
839654127
672918543
496185372
218473956
753296481
367542819
984761235
521839764

再例如,输入:
800000000
003600000
070090200
050007000
000045700
000100030
001000068
008500010
090000400

程序应该输出:
812753649
943682175
675491283
154237896
369845721
287169534
521974368
438526917
796318452

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 2000ms

思路:算是贪心???其实就是从(0,0)位置开始遍历1,然后在位置(0,1)开始遍历…直到(8,8)遍历。也不算是遍历…就是类似全排列。其中对于每一步加了个判断,如果在(i,j)位置加了数据,那就需要去判断该i行有没有这个value,该j列有没有这个value,该所在的九宫格有没有该value.

  package lijie_14;

import java.util.Scanner;

public class F {
   public static void main(String[] args) {
//		 int[][] mati = {  
//		            {0, 0, 5, 3, 0, 0, 0, 0, 0},  
//		            {8, 0, 0, 0, 0, 0, 0, 2, 0},  
//		            {0, 7, 0, 0, 1, 0, 5, 0, 0},  
//		            {4, 0, 0, 0, 0, 5, 3, 0, 0},  
//		            {0, 1, 0, 0, 7, 0, 0, 0, 6},  
//		            {0, 0, 3, 2, 0, 0, 0, 8, 0},  
//		            {0, 6, 0, 5, 0, 0, 0, 0, 9},  
//		            {0, 0, 4, 5, 0, 0, 0, 3, 0},  
//		            {0, 0, 0, 0, 0, 9, 7, 0, 0}}; 
   Scanner sc=new Scanner(System.in);
   int [][]mati = new int[9][9];
   
   for(int i=0;i<9;i++){
   	int s=sc.nextInt();
   	for(int j=8;j>=0;j--){
   		mati[i][j]=s%10;
   		s=s/10;
   	}
   }
//	for(int i=0;i<9;i++){
//		for(int j=0;j<9;j++){
//			System.out.print(mati[i][j]+" ");
//		}
//		System.out.println();
//	}
   
   	 demo(mati, 0, 0);
//		 System.out.println(mati[6][7]);
   }
   public static void demo(int [][]mati,int i,int j){
   	if(i==8&&j==9){
   		for(int a=0;a<mati.length;a++){
   			for(int b=0;b<mati.length;b++){
   				System.out.print(mati[a][b]+" ");
   			}
   			System.out.println();
   		}
   		System.out.println();
   		
   	}
   	
   	
   	if(j>8){//一行一行的进行
   		j=0;
   		i++;
   	}
   	if(i>8){
   		return;
   	}
   	
   	if(mati[i][j]==0){
   		for(int k=1;k<=9;k++){
   			if(check(mati, i, j, k)){//判断是不是可以放
   				mati[i][j]=k;
   				demo(mati,i,j+1);
   				mati[i][j]=0;
   			}
   		}
   	}else{
   		demo(mati,i,j+1);
   	}
   }
   private static boolean check(int [][]matrix,int row, int line, int number) {  
       //判断该行该列是否有重复数字  
       for (int i = 0; i < 9; i++) {  
           if (matrix[row][i] == number || matrix[i][line] == number) {  
               return false;  
           }  
       }  
       //判断小九宫格是否有重复  
       int tempRow = row / 3;  
       int tempLine = line / 3;  
       for (int i = 0; i < 3; i++) {  
           for (int j = 0; j < 3; j++) {  
               if (matrix[tempRow * 3 + i][tempLine * 3 + j] == number) {  
                   return false;  
               }  
           }  
       }  

       return true;  
   }  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值