一、调和级数
使用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;
}
}