题目分析:
一个IP地址是用四个字节(每个字节8位)的二进制码组成。请将32位二进制码表示的IP地址转换为十进制格式表示的IP地址输出。
输入数据要求:
违背以上规则程序直接输出Wrong Format
我提交的源码:
1 import java.util.Scanner; 2 import java.math.*; 3 public class Main { 4 public static void main(String[] args) { 5 Scanner input =new Scanner(System.in); 6 String s = input.nextLine(); 7 int k=s.length(); 8 if(k!=32) { 9 System.out.println("Wrong Format"); 10 } 11 else{ 12 for(int i = 0;i < k;i++) { 13 if(s.charAt(i)!=‘1‘&s.charAt(i)!=‘0‘) 14 System.out.println("Wrong Format"); 15 } 16 int a = 0,b = 0,c = 0,d = 0; 17 char num[] = new char[32];//只有char接受char的型 18 for(int i = 0;i<=7;i++) { 19 num[i] = s.charAt(i); 20 if(num[i]==‘1‘) { 21 // System.out.println(num[i]); 22 a=a+(int)Math.pow(2, 7-i); 23 } 24 } 25 for(int i = 8,j=0;i<=15;i++,j++) { 26 num[i] = s.charAt(i); 27 if(num[i]==‘1‘) { 28 // System.out.println(num[i]); 29 b=b+(int)Math.pow(2, 7-j); 30 } 31 } 32 for(int i = 16,j = 0;i<=23;i++,j++) { 33 num[i] = s.charAt(i); 34 if(num[i]==‘1‘) { 35 // System.out.println(num[i]); 36 c=c+(int)Math.pow(2, 7-j); 37 } 38 } 39 for(int i = 24,j = 0;i<=31;i++,j++) { 40 num[i] = s.charAt(i); 41 if(num[i]==‘1‘) { 42 43 // System.out.println(num[i]); 44 d=d+(int)Math.pow(2, 7-j); 45 46 } 47 } 48 System.out.println(a+"."+b+"."+c+"."+d);} 49 } 50 }
收获与心得:
这个题目考察了我们对于字符串的处理,怎样定义一个字符串以及怎样提取出字符串的某一波分进行单独处理。这些都是这个题目考察的亮点也是难点,解这道题我们首先要去定义一个字符串,而且在解这道题目的同时我们也要明白二进制转化的方式,其次就是用
charAt(i);
将字符串中的元素进行遍历,然后再看看是1还是0进行数字的运算,计算出IP地址域名四部分的数,然后在进行格式化输出,在这些运算之前,我们首先要判断这串字符是不是合法,运用到
1 String.length();
函数,这个函数可以直接得出字符串的长度,返回一个整形数值,当字符串不等于32是输出"wrong format".
题目分析:
合并两个升序排序的整型数组为一个新的升序整型数组并输出。
我提交的源码:
1 import java.util.Arrays; 2 import java.util.Scanner; 3 4 public class Main { 5 6 public static void main(String[] args) { 7 Scanner input =new Scanner(System.in); 8 int a = 0 ,b = 0; 9 int [] num1 = new int[50]; 10 int [] num2 = new int[50]; 11 int [] num3 = new int[50]; 12 a = input.nextInt(); 13 for(int i = 0 ;i < a;i++) { 14 num1[i] = input.nextInt(); 15 num3[i] = num1[i]; 16 } 17 b = input.nextInt(); 18 for(int i = 0 ;i < b;i++) { 19 num2[i] = input.nextInt(); 20 } 21 int k = a; 22 for(int j = 0;j < b;j++) { 23 num3[k] = num2[j]; 24 k++; 25 } 26 27 int m=0,n=0,temp=0; 28 for(m=0;m<a+b-1;m++) 29 { 30 for(n=m+1;n<a+b;n++) 31 { 32 if(num3[m]>num3[n]) 33 { 34 temp=num3[m]; 35 num3[m]=num3[n]; 36 num3[n]=temp; 37 38 } 39 } 40 } 41 for(int l = 0;l<a+b;l++) { 42 System.out.printf(num3[l]+" "); 43 } 44 45 } 47 }
收获与心得:
这个题我采用的方法是用一个数组分别读取输入的两个数组中的元素,将两个数组合并为一个新的数组,然后再将合并后的数组进行排序后输出,考察了对于数组的定义,以及选择排序的用法,于题目集一考察较为相似,在注意一下输出时的格式,即可通过这个题的全部测试点。
题目分析:
输入年月日的值(均为整型数),输出该年份是否为闰年,同时输出该日期为星期几。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] ; 判断星期几的算法如下:假定公元0001年1月1日为星期一,因此只要计算出当前输入日期离0001年1月1日所差的天数,然后拿这个天数除以7求余数,当余数为0时,为星期日,当余数为1时,为星期一,以此类推,当余数为6时,为星期六。
要求:Main类中必须含有如下方法,签名如下:
我提交的源码:
1 import java.util.Scanner; 2 import java.math.*; 3 public class Main { 4 5 public static void main(String[] args) { 6 Scanner input =new Scanner(System.in); 7 int year = input.nextInt(); 8 int month = input.nextInt(); 9 int day = input.nextInt(); 10 int panduan=0; 11 int[] month1=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31}; 12 int[] month2=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31}; 13 14 15 if(month>0&&month<=12){ 16 17 if(isLeapYear(year)) 18 { 19 if(day<=month1[month]&&day>0) 20 panduan=1; 21 } 22 else 23 { 24 if(day<=month2[month]&&day>0) 25 panduan=1; 26 } 27 } 28 29 if(year<1820||year>2020||month<1||month>12||day<1||day>31||panduan==0) { 30 System.out.println("Wrong Format"); 31 } 32 33 34 else { 35 if(isLeapYear(year)==true) { 36 System.out.println(year+" is a leap year."); 37 } 38 else { 39 System.out.println(year+" is not a leap year."); 40 } 41 int k = numOfDays( year, month , day); 42 43 System.out.println(year+"-"+month+"-"+day+" is "+getWhatDay(k)+"."); 44 } 45 46 } 47 public static int numOfDays(int year,int month ,int day) { 48 int num = 0; 49 int s = 0; 50 for(int i =1;i<year;i++) { 51 if((isLeapYear(i)==true)) { 52 num +=366; 53 } 54 else { 55 num +=365; 56 } 57 58 } 59 60 switch(month) { 61 case 1:s = day; break; 62 case 2:{ 63 s = 31 + day ; 64 break; 65 } 66 case 3:{ 67 if(isLeapYear(year)==true) { 68 s = 31 + 29 + day; 69 } 70 else 71 s = 31 +28 +day; 72 break; 73 } 74 case 4: { 75 if(isLeapYear(year)==true) { 76 s = 31 + 29+31 + day; 77 } 78 else 79 s = 31 +28 +31+day; 80 break; 81 82 } 83 case 5: { 84 if(isLeapYear(year)==true) { 85 s = 31 + 29+31+30 + day; 86 } 87 else 88 s = 31 +28+30 +31+day; 89 break; 90 91 } 92 case 6: { 93 if(isLeapYear(year)==true) { 94 s = 31 + 29+31+30+31 + day; 95 } 96 else 97 s = 31 +28+30 +31+31+day; 98 break; 99 100 } 101 case 7: { 102 if(isLeapYear(year)==true) { 103 s = 31 + 29+31+30+31+30 + day; 104 } 105 else 106 s = 31 +28+30 +31+31+30+day; 107 break; 108 109 } 110 case 8: { 111 if(isLeapYear(year)==true) { 112 s = 31 + 29+31+30+31+30+31 + day; 113 } 114 else 115 s = 31 +28+30 +31+31+30+31+day; 116 break; 117 118 } 119 case 9: { 120 if(isLeapYear(year)==true) { 121 s = 31 + 29+31+30+31+30+31 +31 +day; 122 } 123 else 124 s = 31 +28+30 +31+31+30+31+31+day; 125 break; 126 127 } 128 case 10: { 129 if(isLeapYear(year)==true) { 130 s = 31 + 29+31+30+31+30+31 +31+30 +day; 131 } 132 else 133 s = 31 +28+30 +31+31+30+31+31+30+day; 134 break; 135 136 } 137 case 11: { 138 if(isLeapYear(year)==true) { 139 s = 31 + 29+31+30+31+30+31 +31+30+31 +day; 140 } 141 else 142 s = 31 +28+30 +31+31+30+31+31+30+day+31; 143 break; 144 145 } 146 case 12: { 147 if(isLeapYear(year)==true) { 148 s = 31 + 29+31+30+31+30+31 +31+30+31+30 +day; 149 } 150 else 151 s = 31 +28+30 +31+31+30+31+31+30+day+31+30; 152 break; 153 154 } 155 } 156 return num+s; 157 } 158 159 public static boolean isLeapYear(int year){ 160 if((year%4==0&&year%100!=0)||year%400==0) 161 return true; 162 else 163 return false; 164 } 165 public static String getWhatDay(int days) { 166 167 int k =(days)%7; 168 if(k==0) { 169 return "Sunday"; 170 } 171 else if(k==1) { 172 return "Monday"; 173 } 174 else if(k==2) { 175 return "Tuesday"; 176 } 177 else if(k==3) { 178 return "Wednesday"; 179 } 180 else if(k==4) { 181 return "Thursday"; 182 } 183 else if(k==5) { 184 return "Friday"; 185 } 186 else 187 return "Saturday"; 188 189 } 190 191 }
收获与心得:
这个题我设置了三个类:
1 public class getWhatDay
这个类是用来判断星期几,内置的方法
public static String getWhatDay(int days)
这个方法是用来判断该天是星期几并返回相对应的星期几对应的英文。
2 public class isLeapYear
这个类是用来判断是不是闰年,是闰年返回Boolean值 true 否则则返回false。
3 public class numOfdays
这个类是用来判断输入的那一天,那一年距离0001年的具体的天数,然后传入 getWhatday.看看今天对应的是星期几,然后进行输出
这一题强化了我们对于类的概念,更多的让我们理解了Java 中的类是与C语言中的函数是有所不同的,Java中的类讲究封装性,一个类对应实现一个功能,功能单一性,这些是我有所掌握的,但是在这个题中我在判断距今还有多少天的时候是一个月一个月的年份进行相加,算法过于复杂,也很长,这是需要有所改进的地方。希望能够精简一下关于在计算天数时的算法设计,这是在下一次,习题作答时的追求。
题目分析:
输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法。
要求:Main类中必须含有如下方法,签名如下:
我提交的源码:
1 import java.util.Scanner; 2 import java.math.*; 3 public class Main { 4 5 public static void main(String[] args) { 6 Scanner input =new Scanner(System.in); 7 int year = input.nextInt(); 8 int month = input.nextInt(); 9 int day = input.nextInt(); 10 if(checkInputValidity( year, month, day)==false) { 11 System.out.println("Wrong Format"); 12 } 13 14 15 else { 16 nextDate( year, month, day); 17 } 21 } 22 public static void nextDate(int year,int month,int day) { 23 int[] yuefen1=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31}; 24 int[] yuefen2=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31}; 25 int a=0,b=0,c=0; 26 a = year; 27 c=day+1; 28 b = month; 29 if(isLeapYear( year)==true) { 30 if(c>yuefen1[month]) { 31 b++; 32 c=c-yuefen1[month]; 33 } 34 35 } 36 else { 37 if(c>yuefen2[month]) { 38 b++; 39 40 c=c-yuefen2[month]; 41 } 42 } 43 if(b>12) { 44 a++; 45 b=b-12; 46 } 47 System.out.println("Next date is:"+a+"-"+b+"-"+c); 48 } 49 50 51 public static boolean isLeapYear(int year){ 52 if((year%4==0&&year%100!=0)||year%400==0) 53 return true; 54 else 55 return false; 56 } 57 public static boolean checkInputValidity(int year,int month,int day) { 58 59 int panduan=0; 60 int[] runnian=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31}; 61 int[] pingnian=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31}; 62 63 if(month>0&&month<=12){ 64 if(isLeapYear(year)) 65 { 66 if(day<=runnian[month]&&day>0) 67 panduan=1; 68 } 69 else 70 { 71 if(day<=pingnian[month]&&day>0) 72 panduan=1; 73 } 74 } 75 if(year<1820||year>2020||month<1||month>12||day<1||day>31||panduan==0) { 76 return false; 77 78 } 79 else { 80 return true; 81 } 82 } 83 }
设计收获与心得:
这个题我一共设计了两个类,
1 public class checkInputValidity
这个类是用来检测输入的天数是不是合法的,然后返回同一个Boolean 值,若不合法则输出 rong format。
第二个类
2 public class nextDate
这个类是用来求下一天的
这个题进一步强化了我对于类的理解,不同的类有不同的功能,将功能封装在类里,主函数的代码能很好的简化。这个题和上一个题基本相似,唯一不同的是求下一天,先进行输入的天份和年份是不是合法,然后进行日期加一,若加满了这个月的天数,则月数加一,天数减去这个月的天数,若月数加满12,则年数加一,月数再减12,作为下一年的月数。
题目分析:
输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。
其中年份取值范围为 [1820,2020] ,月份取值范围为[1,12] ,日期取值范围为[1,31] 。
注意:不允许使用Java中任何与日期有关的类或方法。
我提交的源码:
1 import java.util.Scanner; 2 import java.math.*; 3 public class Main { 4 5 public static void main(String[] args) { 6 Scanner input =new Scanner(System.in); 7 int year = input.nextInt(); 8 int month = input.nextInt(); 9 int day = input.nextInt(); 10 int n = input.nextInt(); 11 if(checkInputValidity( year, month, day)==false||n>10||n<-10) { 12 System.out.println("Wrong Format"); 13 } 14 15 16 else { 17 nextDate( year, month, day,n); 18 } 19 } 20 public static void nextDate(int year,int month,int day,int n ) { 21 int[] yuefen1=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31}; 22 int[] yuefen2=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31}; 23 int a=0,b=0,c=0; 24 a = year; 25 b = month; 26 c = day; 27 28 if(isLeapYear( year)==true) { 29 if(n>0) { 30 c=c-n; 31 if(c<0) { 32 b--; 33 if(b<=0) { 34 b = b+12; 35 a--; 36 } 37 38 c=yuefen1[b]-n+day; 39 } 40 } 41 else { 42 c=c+(-n); 43 if(c>yuefen1[month]) { 44 b++; 45 c=c-yuefen1[month]; 46 47 } 48 if(b>12) { 49 a++; 50 b = b-12; 51 } 52 53 } 54 } 55 56 else { if(n>0) { 57 c=c-n; 58 if(c<0) { 59 b--; 60 if(b<=0) { 61 b = b+12; 62 a--; 63 64 } 65 66 c=yuefen2[b]-n+day; 67 } 68 } 69 else { 70 c=c+(-n); 71 if(c>yuefen2[month]) { 72 b++; 73 c=c-yuefen2[month]; 74 75 } 76 if(b>12) { 77 a++; 78 b = b-12; 79 } 80 81 } 82 83 } 84 System.out.println(n+" days ago is:"+a+"-"+b+"-"+c); 85 } 86 87 88 public static boolean isLeapYear(int year){ 89 if((year%4==0&&year%100!=0)||year%400==0) 90 return true; 91 else 92 return false; 93 } 94 public static boolean checkInputValidity(int year,int month,int day) { 95 96 int panduan=0; 97 int[] runnian=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31}; 98 int[] pingnian=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31}; 99 if(month>0&&month<=12){ 100 if(isLeapYear(year)) 101 { 102 if(day<=runnian[month]&&day>0) 103 panduan=1; 104 } 105 else 106 { 107 if(day<=pingnian[month]&&day>0) 108 panduan=1; 109 } 110 } 111 if(year<1820||year>2020||month<1||month>12||day<1||day>31||panduan==0) { 112 return false; 113 114 } 115 else { 116 return true; 117 } 118 } 119 }
设计分析与心得:
这个题设计了两个类,一个类用来判断输入的年份,天数是不是合法,求下一次天数的时候,需要导入四个参数,年份,月份,天数,需要加减的天数,在加入的天数超过这个月所在的天数时,月份需要加一,当月份加入超过12时,需要进行年份加一,这个题需要注意的是年份的操作,闰年的二月月份和平年的月份是不同的,下面展示这个圈复杂度:
这个题的圈复杂度较高,所用的if else 判断也较多,应该用较少的圈复杂度,老师说我们的是垃圾代码,就是因为圈复杂度较高,我们要做的是减少圈复杂度,这样代码才能更加的简洁和高效.这也是这个题之后要进行精进的地方。
原文:https://www.cnblogs.com/lyhzml/p/14613811.html