2.2练习总结

  放假以来第一次做题,啊,真的菜。

  一共八道题,题目难度依次增加,前四个题很简单,争取都做一下(这是大佬的原话)然后开始做题,前两道题都很简单就不说了,第三题有点坑,自己逻辑出错了,再加上有个小知识点的遗忘,纪录一下吧。

       

       

  对,没错就是这个题,折腾了很久,这就是实力弱鸡!

就我自己的理解,首先是把输入的值存为两个字符串a,b ,然后进行字符拼接,完成了第一步。

接着把拼接的字符串转化成int型,因为这里说了a,b的范围【1,100】所以不用考虑BigInteger。这里就遇到了第一个问题,就是类型转换(这里我想用string转int),但是我忘了怎么转换了。。。只能用百度了,顺便也复习了这个点。

  

接下来,我觉得这题很稳了,判断是不是平方数就好了。快速写完了之后试了几个例子就提交了,but!!!样例没有全过。

 1 import java.util.Scanner;
 2 
 3 public class Main {
 4     public static void main(String[] args) {
 5         Scanner sc=new Scanner(System.in);
 6         String a=sc.next();
 7         String b=sc.next();
 8         String c=a+b;
 9         int bool=0;
10         int sum=Integer.parseInt(c);
11         
12         for(int i=1;i<=100;i++){
13             if(sum%i==0&&sum==i*i){
14                 bool=1;
15 } 16 } 17 18 if(bool==1){ 19 System.out.println("Yes"); 20 } 21 if(bool==0){ 22 System.out.println("No"); 23 } 24 } 25 }

 

这是我第一次写的代码,嗯,应该已经很明显了。但是我就是没有意识到那里有错,不服输的我又改了一个版本,从1到100循环a,b,然后拼接,再判断是不是平方数,我让他输出了ab的拼接数和yes or no其实这里已经能看出错误了,因为最后的大部分显示的都是xxxxx yes。但是我看见100100也写得yes,样例里有这个,我过了这个样例是no所以觉得是我程序写错了!!!啊,大坑,然后一直再改程序验证到底是那里的样例过不了。

然后我翻本子看到之前写的判断素数,发现,我循环的判断条件是Math.sqrt(n)!!!忽然发现了,我的逻辑出了漏洞啊,我当时想的是因为ab最大取100,那么ab最大就是100*100,天!蠢的无话可说了吧。忘了是拼接,再加上样例里的100100让我更坚信了(by the way,我坚信的是错的啊,100*100=10000啊)所以我取值去到100根本不全啊,最后用了Math.sqrt(sum)就全过了。

最后,再次吐槽自己的菜,我当时看见了Math.sqrt(sum)做判断条件就随手一提交(还在if(sum%i==0&&sum==i*i)里面加了break;和 else条件,因为我当时并没有意识到自己的错误)这次就过来。我一开始还以为是break 和else的问题,全做完后,重新提交有break else 没有改100的版本才发现原来是这个错误。

好了,好了,最后的代码:

 1 import java.util.Scanner;
 2 
 3 public class Main {
 4     public static void main(String[] args) {
 5         Scanner sc=new Scanner(System.in);
 6         String a=sc.next();
 7         String b=sc.next();
 8         String c=a+b;
 9         int bool=0;
10         int sum=Integer.parseInt(c);
11         
12         for(int i=1;i<=Math.sqrt(sum);i++){
13             if(sum%i==0&&sum==i*i){
14                 bool=1;
15                 break;
16             }else{
17                 bool=0;
18             }
19         }
20         
21         if(bool==1){
22             System.out.println("Yes");
23         }
24         if(bool==0){
25             System.out.println("No");
26         }    
27     }
28 }

很简单的题,以后注意啊~~~

 

不知道为什么一开始做这个题脑子抽抽了,觉得很明显是个递归题。然后写了下面的这段代码。样例1 2可以过,3就一直不出结果

 1 import java.util.Scanner;
 2 
 3 public class test4 {
 4     static int num=0;
 5     public static void main(String[] args) {
 6         Scanner sc=new Scanner(System.in);
 7         int a=sc.nextInt();//500
 8         int b=sc.nextInt();//100
 9         int c=sc.nextInt();//50
10         int x=sc.nextInt();
11         if(x%50==0){
12             /** 
13              * 递归求解其中 
14              * @param x 总共的钱数
15              */ 
16             f(x,a,b,c);
17             System.out.println(num);
18         }else{
19             System.out.println(0);
20         }
21         
22     }
23 
24     static void f(int x, int a,int b,int c) {
25         // TODO Auto-generated method stub
26         if(a<0||b<0||c<0){
27             return;
28         }
29         if(x<0){   //不符合分钱的总数,不和题意 
30             return;  
31         }
32         if(x==0){   //当x=0时,刚好分完了所有的钱
33             if(a+b+c>=1){
34                 num++;    //方案数量加1 
35                 return;
36             }
37               
38         }  
39         /** 
40          * 当钱还没有分完时,继续走下去 
41          * 每一次可以分50,100,500(q,w,e)
42          */  
43         f(x-50,a,b,c-1); 
44         f(x-100,a,b-1,c); 
45         f(x-500,a-1,b,c); 
46         
47     }
48 
49 }

但是,到现在为止,我并不知道这个那里错了。我问了同学怎么做这个题,她和我说这个直接暴力搜索就行数据不是很大能过的。然后我写了下面这个:

 1 import java.util.Scanner;
 2 
 3 public class test5 {
 4 
 5     public static void main(String[] args) {
 6         // TODO Auto-generated method stub
 7         Scanner sc=new Scanner(System.in);
 8         int a=sc.nextInt();
 9         int b=sc.nextInt();
10         int c=sc.nextInt();
11         int x=sc.nextInt();
12         int count=0;
13         for(int i=0;i<=a;i++){
14             for(int j=0;j<=b;j++){
15                 for(int k=0;k<=c;k++){
16                     if(i*500+j*100+k*50==x){
17                         count++;
18                     }
19                 }
20             }
21         }
22         System.out.println(count);
23     }
24 }

这个很简单直接就过了。一开始上面那个代码,我其实是没找到错误在哪的,先挖个坑把,说不定过几天就会有讲题到时候再回来填坑GG。

 

posted @ 2018-02-02 20:46  醒佳  阅读(263)  评论(0编辑  收藏  举报