7-21 求特殊方程的正整数解
分数 15
作者 张彤彧
单位 浙江大学
本题要求对任意给定的正整数N,求方程X
2
+Y
2
=N的全部正整数解。

输入格式:
输入在一行中给出正整数N(≤10000)。

输出格式:
输出方程X
2
+Y
2
=N的全部正整数解,其中X≤Y。每组解占1行,两数字间以1空格分隔,按X的递增顺序输出。如果没有解,则输出No Solution。

输入样例1
884
输出样例1
10 28
20 22
输入样例2
11
输出样例2
No Solution

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
scanner.close();

boolean foundSolution = false;

// 遍历可能的 X 值
for (int x = 1; x <= Math.sqrt(N); x++) {
int x2 = x * x;
int y2 = N - x2;

// 计算 Y
int y = (int) Math.sqrt(y2);

// 检查 Y 是否满足条件
if (y * y == y2 && x <= y) {
System.out.println(x + " " + y);
foundSolution = true;
}
}

// 如果没有找到解
if (!foundSolution) {
System.out.println("No Solution");
}
}
}

7-22 龟兔赛跑
分数 20
作者 陈建海
单位 浙江大学
乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?

输入格式:
输入在一行中给出比赛时间T(分钟)。

输出格式:
在一行中输出比赛的结果:乌龟赢输出@_@,兔子赢输出^_^,平局则输出-_-;后跟1空格,再输出胜利者跑完的距离。

输入样例:
242
输出样例:
@_@ 726
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int minute = sc.nextInt();
sc.close();
int turtle = 0,rabbit =0;
int rest = -1,run=10;
while(minute-->0){
turtle +=3;
if(run-- > 0){
rabbit+=9;
}
if(run ==0){
if(rabbit>turtle && rest!=0){
rest = 30;
}
else{
run = 10;
}
}
if(rest--==0){
run =10;
}

}
if(turtle>rabbit){
System.out.printf("@_@ %d",turtle);
}else if(rabbit > turtle){
System.out.printf("^_^ %d",rabbit);
}else{
System.out.printf("-_- %d",rabbit);
}

}

}

7-23 币值转换
分数 20
作者 陈建海
单位 浙江大学
输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式。如23108元,转换后变成“贰万叁仟壹百零捌”元。为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S、B、Q、W、Y分别代表拾、百、仟、万、亿。于是23108元应被转换输出为“cWdQbBai”元。

输入格式:
输入在一行中给出一个不超过9位的非负整数。

输出格式:
在一行中输出转换后的结果。注意“零”的用法必须符合中文习惯。

输入样例1
813227345
输出样例1
iYbQdBcScWhQdBeSf
输入样例2
6900
输出样例2
gQjB

import java.util.Scanner;

public class Main {

public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
long num = scanner.nextLong();
scanner.close();

// 数字字符和单位字符
char[] number = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'};
char[] unit = {'\0', 'S', 'B', 'Q', 'W', 'S', 'B', 'Q', 'Y'};

if (num == 0) {
System.out.println("a");
return;
}

int[] a = new int[10];
int i = 0;

// 将数字按位拆分
while (num > 0) {
a[i++] = (int) (num % 10);
num /= 10;
}

i--; // 索引调整到最后一个非零位

StringBuilder result = new StringBuilder();

while (i >= 0) {
if (a[i] != 0) {
result.append(number[a[i]]);
result.append(unit[i]);
} else {
if (i == 4 && (a[5] != 0 || a[6] != 0 || a[7] != 0)) {
result.append('W');
}
if ((i - 1) >= 0 && a[i - 1] != 0) {
result.append('a');
}
}
i--;
}

System.out.println(result.toString());
}
}

7-24 约分最简分式
分数 15
作者 翁恺
单位 浙江大学
分数可以表示为分子/分母的形式。编写一个程序,要求用户输入一个分数,然后将其约分为最简分式。最简分式是指分子和分母不具有可以约分的成分了。如6/12可以被约分为1/2。当分子大于分母时,不需要表达为整数又分数的形式,即11/8还是11/8;而当分子分母相等时,仍然表达为1/1的分数形式。

输入格式:
输入在一行中给出一个分数,分子和分母中间以斜杠/分隔,如:12/34表示34分之12。分子和分母都是正整数(不包含0,如果不清楚正整数的定义的话)。

提示:

对于C语言,在scanf的格式字符串中加入/,让scanf来处理这个斜杠。
对于Python语言,用a,b=map(int, input().split('/'))这样的代码来处理这个斜杠。
输出格式:
在一行中输出这个分数对应的最简分式,格式与输入的相同,即采用分子/分母的形式表示分数。如
5/6表示6分之5

输入样例:
66/120
输出样例:
11/20

import java.util.Scanner;

public class Main{

// 计算最大公约数的递归函数
public static int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a % b);
}

public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
scanner.close();

// 解析输入分数
String[] parts = input.split("/");
int numerator = Integer.parseInt(parts[0]);
int denominator = Integer.parseInt(parts[1]);

// 计算最大公约数
int gcdValue = gcd(numerator, denominator);

// 约分分子和分母
int simplifiedNumerator = numerator / gcdValue;
int simplifiedDenominator = denominator / gcdValue;

// 输出最简分式
System.out.println(simplifiedNumerator + "/" + simplifiedDenominator);
}
}

7-25 念数字
分数 15
作者 翁恺
单位 浙江大学
输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:

0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu
输入格式:
输入在一行中给出一个整数,如:1234

提示:整数包括负数、零和正数。

输出格式:
在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如
yi er san si。

输入样例:
-600
输出样例:
fu liu ling ling


import java.util.Scanner;

public class Main {

// 定义数字到拼音的映射
private static final String[] PINYIN = {
"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"
};

public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
scanner.close();

// 处理负数
StringBuilder result = new StringBuilder();
if (input.charAt(0) == '-') {
result.append("fu ");
input = input.substring(1); // 去掉负号
}

// 处理每个数字
for (int i = 0; i < input.length(); i++) {
char ch = input.charAt(i);
if (Character.isDigit(ch)) {
int digit = ch - '0'; // 将字符转换为对应的数字
result.append(PINYIN[digit]).append(" ");
}
}

// 移除最后一个多余的空格
if (result.length() > 0) {
result.setLength(result.length() - 1);
}

// 输出结果
System.out.println(result.toString());
}
}