放假以来第一次做题,啊,真的菜。
一共八道题,题目难度依次增加,前四个题很简单,争取都做一下(这是大佬的原话)然后开始做题,前两道题都很简单就不说了,第三题有点坑,自己逻辑出错了,再加上有个小知识点的遗忘,纪录一下吧。
对,没错就是这个题,折腾了很久,这就是实力弱鸡!
就我自己的理解,首先是把输入的值存为两个字符串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。