简单算法练习(一)
【1】两点距离
描述
输入两点坐标(X1,Y1),(X2,Y2)(0<=x1,x2,y1,y2<=1000),计算并输出两点间的距离。
输入
第一行输入一个整数n(0<n<=1000),表示有n组测试数据;
随后每组占一行,由4个实数组成,分别表示x1,y1,x2,y2,数据之间用空格隔开。
输出
对于每组输入数据,输出一行,结果保留两位小数。
样例输入
2
0 0 0 1
0 1 1 0
样例输出
1.00
1.41
package cn.ls.lanqiao;
import java.text.DecimalFormat;
import java.util.Scanner;
public class Test1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
float[] a = new float[n];
for (int i = 0; i < n; i++) {
float x1 = sc.nextFloat();
float y1 = sc.nextFloat();
float x2 = sc.nextFloat();
float y2 = sc.nextFloat();
float sum = (float) Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
a[i] = sum;
}
for (int i = 0; i < a.length; i++) {
System.out.println(new DecimalFormat("0.00").format(a[i]));
}
}
}
【2】切面条
描述
一根高筋拉面,中间切一刀,可以得到2根面条。如果先对折1次,中间切一刀,可以得到3根面条。如果连续对折2次,中间切一刀,可以得到5根面条。那么,连续对折10次,中间切一刀,会得到多少面条呢?
package cn.ls.lanqiao;
public class Test2 {
public static void main(String[] args) {
int sum = 0;
for (int i = 1; i <= 10; i++) {
sum = 2 * i + 1;
}
System.out.println(sum);
}
}
【3】 大小写互换
描述
现在给出了一个只包含大小写字母的字符串,不含空格和换行,要求把其中的大写换成小写,小写换成大写,然后输出互换后的字符串。
输入
第一行只有一个整数m(m<=10),表示测试数据组数。
接下来的m行,每行有一个字符串(长度不超过100)。
输出
输出互换后的字符串,每组输出占一行。
样例输入
2
AcmdahSH
ACCEPTED
样例输出
aCMDAHsh
accepted
package cn.ls.lanqiao;
import java.util.Scanner;
public class Test3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
String[] o = new String[m];
for (int i = 0; i < m; i++) {
String ls = sc.next();
o[i] = daXiao(ls);
}
for (int i = 0; i < o.length; i++) {
System.out.println(o[i]);
}
}
public static String daXiao(String ls) {
StringBuffer a = new StringBuffer();
for (int i = 0; i < ls.length(); i++) {
char s = ls.charAt(i);
if (s >= 'a' && s <= 'z') {
char q = (char) (s - 32);
a.append(q);
}
if (s >= 'A' && s <= 'Z') {
char p = (char) (s + 32);
a.append(p);
}
}
return a.toString();
}
}
【4】三羊献瑞
观察下面的加法算式:
祥a 瑞b 生c 辉d
+ 三e 羊f 献g 瑞b
-----------------------
三e 羊f 生c 瑞b 气h
其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。
请你利用计算机计算“三羊献瑞”所代表的4位数字(答案唯一),
package cn.ls.lanqiao;
public class Test4 {
public static void main(String[] args) {
for (int a = 0; a <= 9; a++) {
for (int b = 0; b <= 9; b++) {
for (int c = 0; c <= 9; c++) {
for (int d = 0; d <= 9; d++) {
for (int f = 0; f <= 9; f++) {
for (int g = 0; g <= 9; g++) {
for (int h = 0; h <= 9; h++) {
if (a != b && a != c && a != d && a != f && a != g && a != h && b != c && b != d
&& b != f && b != g && b != h && c != d && c != f && c != h && c != g
&& d != f && d != g && d != h && f != g && f != h && g != h && a != 1
&& b != 1 && c != 1 && d != 1 && f != 1 && g != 1 && h != 1) {
int sum = a * 1000 + b * 100 + c * 10 + d;
int sum1 = 1 * 1000 + f * 100 + g * 10 + b;
int sum2 = 1 * 10000 + f * 1000 + c * 100 + b * 10 + h;
if ((sum + sum1) == sum2) {
System.out.println(1 + "" + f + g + b);
System.out.println(2 + "--" + a + b + c + d + f + g + h);
}
}
}
}
}
}
}
}
}
}
}
【5】矩阵对角线之和
描述
求一个 3*3 矩阵对角线元素之和
输入
输入一个3*3的二维数组
输出
二维数组的两个对角线之和
样例输入
1 2 3
4 5 6
7 8 9
样例输出
15
15
package cn.ls.lanqiao;
import java.util.Scanner;
public class Test5 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[][] a = new int[3][3];
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[0].length; j++) {
a[i][j] = sc.nextInt();
}
}
int sum1 = a[0][0]+a[1][1]+a[2][2];
int sum2 = a[0][2]+a[1][1]+a[2][0];
System.out.println(sum1);
System.out.println(sum2);
}
}
【6】空心菱形
请设计一个程序,使它的运行结果如下:

package cn.ls.lanqiao;
import java.util.Scanner;
public class Test6 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for (int i = 0; i < n; i++) {
lingXing(sc.nextInt());
}
}
public static void lingXing(int n) {// 根据输入的长度输出不同大小的菱形
for (int i = 1; i <= n; i++) {
if (i == 1) {
for (int j = 1; j <= n - i; j++) {
System.out.print(" ");
}
System.out.print("*");
} else {
for (int j = 1; j <= n - i; j++) {
System.out.print(" ");
}
System.out.print("*");
for (int j = 1; j <= 2 * (i - 1) - 1; j++) {
System.out.print(" ");
}
System.out.print("*");
}
System.out.println();
}
for (int i = n - 1; i >= 1; i--) {
if (i == 1) {
for (int j = 1; j <= n - i; j++) {
System.out.print(" ");
}
System.out.print("*");
} else {
for (int j = 1; j <= n - i; j++) {
System.out.print(" ");
}
System.out.print("*");
for (int j = 1; j <= 2 * (i - 1) - 1; j++) {
System.out.print(" ");
}
System.out.print("*");
}
System.out.println();
}
}
}
【7】日期计算
时间限制:3000 ms | 内存限制:65535 KB
难度:1
描述
如题,输入一个日期,格式如:2010 10 24 ,判断这一天是这一年中的第几天。
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每行的输入数据都是一个按题目要求格式输入的日期。
输出
每组输入数据的输出占一行,输出判断出的天数n
样例输入
3
2000 4 5
2001 5 4
2010 10 24
样例输出
96
124
297
package cn.ls.lanqiao;
import java.util.Scanner;
public class Test7 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] ls = new int[n];
for (int i = 0; i < n; i++) {
int year = sc.nextInt();
int month = sc.nextInt();
int days = sc.nextInt();
ls[i] = riQi(year, month, days);
}
for (int i = 0; i < n; i++) {
System.out.println(ls[i]);
}
}
public static int riQi(int year, int month, int days) {
int[] list = { 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 };
int count = 0;
if (month == 1) {
count = days;
}
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
if (month > 1 && month < 13) {
count = list[month - 2] + days;
}
} else {
if (month > 1 && month < 13) {
count = list[month - 2] + days - 1;
}
}
return count;
}
}

浙公网安备 33010602011771号