7-31 字符串循环左移
分数 20
作者 白洪欢
单位 浙江大学
输入一个字符串和一个非负整数N,要求将字符串循环左移N次。

输入格式:
输入在第1行中给出一个不超过100个字符长度的、以回车结束的非空字符串;第2行给出非负整数N。

输出格式:
在一行中输出循环左移N次后的字符串。

输入样例:
Hello World!
2
输出样例:
llo World!He



import java.util.Scanner;

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

String str = scanner.nextLine();
int N = scanner.nextInt();
int len = str.length();
N=N%len;
String result = str.substring(N)+str.substring(0,N);
System.out.println(result);
scanner.close();
}
}

7-32 说反话-加强版
分数 20
作者 陈越
单位 浙江大学
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。

输出格式:
每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。

输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello

import java.util.Scanner;
import java.util.StringTokenizer;

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

// 读取整行输入
String input = scanner.nextLine().trim(); // 去除首尾空格

// 使用 StringTokenizer 分隔单词,并过滤掉多余的空格
StringTokenizer tokenizer = new StringTokenizer(input);
StringBuilder result = new StringBuilder();

// 遍历所有单词并将它们逆序添加到 StringBuilder 中
String[] words = new String[tokenizer.countTokens()];
int index = words.length - 1;
while (tokenizer.hasMoreTokens()) {
words[index--] = tokenizer.nextToken();
}

// 拼接单词
for (int i = 0; i < words.length; i++) {
result.append(words[i]);
if (i < words.length - 1) {
result.append(" ");
}
}

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

scanner.close();
}
}

7-33 有理数加法
分数 15
作者 乔林
单位 清华大学
本题要求编写程序,计算两个有理数的和。

输入格式:
输入在一行中按照a1/b1 a2/b2的格式给出两个分数形式的有理数,其中分子和分母全是整形范围内的正整数。

输出格式:
在一行中按照a/b的格式输出两个有理数的和。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。

输入样例1
1/3 1/6
输出样例1
1/2
输入样例2
4/3 2/3
输出样例2
2

import java.util.Scanner;

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

// 读取输入
String input = scanner.nextLine();
scanner.close();

// 分割输入的分数
String[] fractions = input.split(" ");
String[] fraction1 = fractions[0].split("/");
String[] fraction2 = fractions[1].split("/");

// 获取分子和分母
int a1 = Integer.parseInt(fraction1[0]);
int b1 = Integer.parseInt(fraction1[1]);
int a2 = Integer.parseInt(fraction2[0]);
int b2 = Integer.parseInt(fraction2[1]);

// 计算和的分子和分母
int numerator = a1 * b2 + a2 * b1;
int denominator = b1 * b2;

// 化简分数
int gcd = gcd(numerator, denominator);
numerator /= gcd;
denominator /= gcd;

// 输出结果
if (denominator == 1) {
System.out.println(numerator);
} else {
System.out.println(numerator + "/" + denominator);
}
}

// 求最大公约数的函数
private static int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
}

7-34 通讯录的录入与显示
分数 10
作者 乔林
单位 清华大学
通讯录中的一条记录包含下述基本信息:朋友的姓名、出生日期、性别、固定电话号码、移动电话号码。
本题要求编写程序,录入N条记录,并且根据要求显示任意某条记录。

输入格式:
输入在第一行给出正整数N(≤10);随后N行,每行按照格式姓名 生日 性别 固话 手机给出一条记录。其中姓名是不超过10个字符、不包含空格的非空字符串;生日按yyyy/mm/dd的格式给出年月日;性别用M表示“男”、F表示“女”;固话和手机均为不超过15位的连续数字,前面有可能出现+。

在通讯录记录输入完成后,最后一行给出正整数K,并且随后给出K个整数,表示要查询的记录编号(从0到N−1顺序编号)。数字间以空格分隔。

输出格式:
对每一条要查询的记录编号,在一行中按照姓名 固话 手机 性别 生日的格式输出该记录。若要查询的记录不存在,则输出Not Found。

输入样例:
3
Chris 1984/03/10 F +86181779452 13707010007
LaoLao 1967/11/30 F 057187951100 +8618618623333
QiaoLin 1980/01/01 M 84172333 10086
2 1 7
输出样例:
LaoLao 057187951100 +8618618623333 F 1967/11/30
Not Found

#include<stdio.h>
struct data{
int year;
int month;
int day;
};
struct man{
char name[15];
struct data barthday;
char sex;
char dianhua[20];
char phone[20];
int flag;
};
int main(){
int n;
int k;
int num;
struct man human[100];
for(int i=0;i<10;i++){
human[i].flag=0;
}
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%s %d/%d/%d %c %s %s",human[i].name,
&human[i].barthday.year,
&human[i].barthday.month,
&human[i].barthday.day
,&human[i].sex
,human[i].dianhua
,human[i].phone);
human[i].flag=1;
}
scanf("%d",&k);
for(int i=0;i<k;i++){
scanf("%d",&num);
if(human[num].flag==1){
printf("%s %s %s %c %02d/%02d/%02d",human[num].name,//输出数字不满两位有前导0
human[num].dianhua,
human[num].phone,
human[num].sex,
human[num].barthday.year,
human[num].barthday.month,
human[num].barthday.day);
if(i!=k-1){
printf("\n");
}
}else{
printf("Not Found");
if(i!=k-1){
printf("\n");
}
}
}
return 0;
}
7-35 有理数均值
分数 20
作者 乔林
单位 清华大学
本题要求编写程序,计算N个有理数的平均值。

输入格式:
输入第一行给出正整数N(≤100);第二行中按照a1/b1 a2/b2 …的格式给出N个分数形式的有理数,其中分子和分母全是整形范围内的整数;如果是负数,则负号一定出现在最前面。

输出格式:
在一行中按照a/b的格式输出N个有理数的平均值。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。

输入样例1
4
1/2 1/6 3/6 -5/10
输出样例1
1/6
输入样例2
2
4/3 2/3
输出样例2
1

import java.util.Scanner;

public class Main {

// Method to simplify fractions
public static void simplify(int[] fraction) {
int x = fraction[0];
int y = fraction[1];
int tmp = Math.min(x, y);
while (tmp > 1) {
if (x % tmp == 0 && y % tmp == 0) {
fraction[0] /= tmp;
fraction[1] /= tmp;
break;
}
tmp--;
}
}

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

int n = scanner.nextInt(); // Number of fractions
String[] firstFraction = scanner.next().split("/");
int zfz = Integer.parseInt(firstFraction[0]);
int zfm = Integer.parseInt(firstFraction[1]);

int[] fraction = {zfz, zfm};
simplify(fraction);
zfz = fraction[0];
zfm = fraction[1];

for (int i = 1; i < n; i++) {
String[] currentFraction = scanner.next().split("/");
int a = Integer.parseInt(currentFraction[0]);
int b = Integer.parseInt(currentFraction[1]);

zfz = zfz * b + zfm * a;
zfm *= b;

fraction[0] = zfz;
fraction[1] = zfm;
simplify(fraction);
zfz = fraction[0];
zfm = fraction[1];
}

zfm *= n; // Multiply denominator by n to calculate average
fraction[0] = zfz;
fraction[1] = zfm;
simplify(fraction);
zfz = fraction[0];
zfm = fraction[1];

if (zfm == 1) {
System.out.println(zfz);
} else if (zfz == 0) {
System.out.println("0");
} else {
System.out.println(zfz + "/" + zfm);
}

scanner.close();
}
}