文章申明:作者也为初学者,解答仅供参考,不一定是最优解;
一:7-1 sdut-sel-2 汽车超速罚款(选择结构)
答案:
import java.util.Scanner;
public class Main {
public static void main(String[] arg){
Scanner sc=new Scanner(System.in);
int a=sc.nextInt();
int b=sc.nextInt();
int c=b-a;
if(c>=1&&c<=20) {
System.out.println("You are speeding and your fine is 100.");
}
else if(c>=21&&c<=30){
System.out.println("You are speeding and your fine is 270.");
}
else if(c>=31)System.out.println("You are speeding and your fine is 500.");
else System.out.println("Congratulations, you are within the speed limit!");
}
}
二: 7-2 Java中二进制位运算
答案:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int a=sc.nextInt();
String c=sc.next();
int b=sc.nextInt();
switch(c){
case "&":
System.out.println(a+" & "+b+" = "+(a&b));
break;
case "|":
System.out.println(a+" | "+b+" = "+(a|b));
break;
case "^":
System.out.println(a+" ^ "+b+" = "+(a^b));
break;
default:
System.out.println("ERROR");
break;
}
}
}
三:7-3 sdut-最大公约数和最小公倍数
答案:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int a=sc.nextInt();
int b=sc.nextInt();
System.out.print(ans(a,b));
System.out.print(" "+a*b/ans(a,b));
System.out.println();
}
}
public static int ans( int a, int b){
if(b>a){
int tem=a;
a=b;
b=tem;
}
int c=a%b;
while(c!=0){
a=b;
b=c;
c=a%b;
}
return b;
}
}
四:7-4 判断回文
答案:
import java.util.Scanner;
public class Main {
static int ans(int a) {//判断位数
int count = 0;
while (a != 0) {
count++;
a = a / 10;
}
return count;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int ret = ans(a);
System.out.println(ret);
int sum=0;
int tem=a;
while (a != 0) {
int c = a % 10;
int f=ret;
while(f--!=1){
c*=10;
}
sum+=c;
ret--;
a=a/10;
}
if (tem==sum) System.out.println("Y");
else System.out.println("N");
}
}
7-5 字符串操作
答案:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input=sc.nextLine();
StringBuilder nodigit=new StringBuilder();//创建可变字符串类
for(char a:input.toCharArray()){//调用string中的方法,将input字符串转变为字符数组
if(!Character.isDigit(a)){//调用isdigit方法判断是否为数字
nodigit.append(a);//可变字符串末尾插入该字符
}
}
String ans=nodigit.reverse().toString();//对可变字符串翻转并转换为string类型
System.out.println(ans);
}
}
六:7-6 N个数的排序与查
答案:
import java.util.Scanner;
public class Main {
static void maopao(int a[]){//写一个冒泡排序吧
for(int i=0;i<a.length-1;i++){
for(int j=0;j<a.length-i-1;j++){
if(a[j]>a[j+1]){
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int c= sc.nextInt();
int a[]= new int[c];
for(int i=0;i<c;i++){
a[i]=sc.nextInt();
}
maopao(a);
int x=sc.nextInt();
for (int i = 0; i < c; i++) {
if (a[i]==x) {System.out.println(i+1);
return;}
}
System.out.println(-1);
}
}
7-7 二进制的前导的零
答案:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int count=0;
while(a!=0){
a>>>=1;//无符号右移直至全部32位均为0
count++;
}
System.out.println(32-count);//
}
}
解法二:这个好理解一些
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int count=0;
for (int i = 31; i >= 0; i--) {
if ((a & (1 << i)) == 0) {//直到第一位为1停止
count++;
} else {
break; // 找到第一个1,停止循环
}
}
System.out.println(count);
}
}
解法三:直接调用 Integer.numberOfLeadingZeros(a)方法,可以直接计算a前导的0的个数
7-8 古时年龄称谓知多少?
答案:
import java.util.Scanner;
public class Main{
public static void main(String[] arg){
Scanner sc=new Scanner(System.in);
int age=sc.nextInt();
if(age>=0&&age<=9)
System.out.println("垂髫之年");
else if(age<=19)System.out.println("志学之年");
else if(age<=29)System.out.println("弱冠之年");
else if(age<=39)System.out.println("而立之年");
else if(age<=49)System.out.println("不惑之年");
else if(age<=59)System.out.println("知命之年");
else if(age<=69)System.out.println("花甲之年");
else if(age<=79)System.out.println("古稀之年");
else if(age<=89)System.out.println("杖朝之年");
else if(age<=99)System.out.println("耄耋之年");
}
}
7-9 期末编程作业计分规则
答案:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num=sc.nextInt();//学生总数
int max=sc.nextInt();//最高分
int arr[]=new int[num+1];
for(int i=1;i<=num;i++){
arr[i]=sc.nextInt();
}
int a=sc.nextInt();//第一档百分比
int b=sc.nextInt();//第二档百分比
int c=sc.nextInt();//第三档百分比
int sb1=sc.nextInt();//减分序列1
int sb2=sc.nextInt()+sb1;//减分序列2
int sb3=sc.nextInt()+sb2;//减分序列3
int sb4=sc.nextInt()+sb3;//减分序列4
double k1=Math.ceil(num*a/100.0);//第一档人数//Math.ceil可以向上取整
double k2=Math.ceil(num*b/100.0)+k1;//第二档人数
double k3 =Math.ceil(num*c/100.0)+k2;//第三档人数
for(int i=1;i<=num;i++){
if(i<= k1)arr[i]=(int)(arr[i]/(max/100.0))-sb1;
else if (i<=k2)arr[i]=(int)(arr[i]/(max/100.0))-sb2;
else if (i<=k3)arr[i]=(int)(arr[i]/(max/100.0))-sb3;
else arr[i]=(int)(arr[i]/(max/100.0))-sb4;
}
for (int i =1; i <=num; i++) {
System.out.print(arr[i]+" ");
}
}
}
7-10 sdut-array2-3 二维方阵变变变
答案:写一个翻转函数,不同角度对应不同翻转次数
import java.util.Scanner;
public class Main {
static int n;//行列数
static int[][] reverse(int arr[][]){ //翻转函数
int f[][]=new int[n][n];//创建新数组用于反转操作,不用自身进行反转的原因是会产生覆盖问题
for(int i=0;i<f.length;i++){
for(int j=0;j<f[i].length;j++){
f[i][j]=arr[n-1-j][i];
}
}
return f;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
int k=sc.nextInt(); //翻转次数
if(k==90)k=1;
else if(k==180)k=2;
else if(k==-90)k=3;
int arr[][]=new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
arr[i][j]=sc.nextInt();
}
}
for(int i=0;i<k;i++){ //翻转k次,每次翻转90°,-90°就是顺时针翻转3次
arr= reverse(arr);
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(j!=n-1){ //本题严格控制行末空格所以不要多打印空格了
System.out.print(arr[i][j]+" ");
}
else System.out.print(arr[i][j]);
}
if(i!=n-1){ //避免多打印一个换行
System.out.println();
}
}
}
}
7-11 直角三角形
答案:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
double a = sc.nextDouble();
double b = sc.nextDouble();
double c = sc.nextDouble();
double max=a>b?(a>c?a:c):(b>c?b:c);//求三边最大的值
if (a*a+b*b==c*c||c*c+b*b==a*a||a*a+c*c==b*b){ //如果能构成直角三角形
if(c==max) System.out.println(a*b/2);
else if(b==max) System.out.println(a*c/2);
else System.out.println(b*c/2);
}
else System.out.println(0.0);
}
}