今日再写写C,遇事即决 :-((还是和字符串有关)

今日再写写C,遇事即决 😦(还是和字符串有关)

N-35. 奇怪的客人

成绩 10 开启时间 2022年04月1日 星期五 22:36
折扣 0.8 折扣时间 2022年04月27日 星期三 23:55
允许迟交 关闭时间 2022年04月27日 星期三 23:55

题目描述

​ 一天,C·H邮递公司来了一位奇怪的客人。他走进代笔室,并找了一个椅子坐下,然后拿起笔在纸上写了一些诡异的单词,并要求按照他的意思写一封信。起初,邮递公司的所有人都摸不着头脑。但突然,薇尔莉特的脑海里闪现了罗丹瑟教官的话「一位优秀的人偶可以从别人表述的话语中提炼出对方内心真正的想法」于是她悟了,原来这上面的每一个字母都是经过一定规则转换而来的,规则就是a→h,b→i,c→j,……,x→e,y→f,z→g 大写字母同理。现在给你一些这位客人所写的转换过后的单词,你能还原出原来的单词吗?

输入格式

​ 输入共两行。

第一行一个整数n,表示单词长度。

​ 第二行一个长度为n的字符串,表示被转换过后的单词。保证该字符串只出现大写和小写字母。

输出格式

​ 一行一个字符串,表示原来的单词。

样例输入

5

Dvysk

样例输出

World

数据范围

0<n≤1000.

#include<stdio.h>
#include<string.h>
/*
5
Dvysk
*/
/*
World
*/
char convertchar(char c) {
	if (c >= 'a' && c <= 'z') {
		if (c + 'W' - 'D' > 'z') {//之所以这样比较的原因额外知识处会给出 
			c = (c + 'W' - 'D' - 'a')%26+'a';
		}else{
			c=c + 'W' - 'D';
		}
	} else if(c >= 'A' && c <= 'Z') {
		c = c + 'W' - 'D';
		if (c > 'Z') {
			c = (c - 'A')%26+'A';
		}
	}
	return c;
}
int main() {
	int num = 0;
	scanf("%d\n", &num);
	char s[num + 1];
	gets(s);
	for (int i = 0; i < num; i++) {
		printf("%c", convertchar(s[i]));
	}
	printf("\n");
}

额外知识:char的小细节

我们有时写代码可能忽略这种错误:特别是在写首尾相连的字母时

比如这样

#include<stdio.h>
#include<string.h>
int main() {
	printf("%d\n",'y'+'k'-'d');
	printf("%c\n",'y'+'k'-'d');
	printf("%d\n",'y'+'k'-'d'>'z');
}
128
€
1

上面的代码我们很容易理解,单纯字符操作而已

#include<stdio.h>
#include<string.h>
int main() {
	char c='y'+'k'-'d'; 
	printf("%d\n",c);
	printf("%c\n",c);
	printf("%d\n",c>'z');
}
-128
€
0

但是把'y'+'k'-'d'写成为字符变量char c时,我们发现逻辑就不对了,由此发现了char的范围其实时从-128到127,即127的下一个数就是-128,越界了。

N-36. David不想整理文本

成绩 10 开启时间 2022年04月1日 星期五 18:23
折扣 0.8 折扣时间 2022年04月27日 星期三 23:23
允许迟交 关闭时间 2022年04月27日 星期三 23:59

题目描述:

David对网络中的各种乱七八糟的文本感到很厌恶,想让你写一个程序来完成这个任务。你的程序需要完成以下要求:

1.每一句话首字母大写,其余字母小写(默认以’.’分割每一句话);

2.清除多余的空格:

每一个单词最后要有一个空格;

如果单词后有标点的,只在标点后有一个空格(标点只有’,’’.’);

第一个单词前和最后一个标点后不留空格)。

我们认为出了大小写不匹配、空格多余之外David的同学不会犯其他错误。

注意:可以用strlen函数获取字符串长度,如strlen(str),但要在开头处添加#include <string.h>;使用gets(str)可以以回车为分界读入字符串。

输入格式:

第1行输入整理前的字符串

输出格式:

输出整理后的字符串

样例输入:

DaVid has mAny Friends .

样例输出:

David has many friends.

数据范围:

字符串长度≤255

——by 李彦君

#include<stdio.h>
#include<string.h>
/*
 Bob  has  never had  a friend .
*/
/*
Bob has never had a friend.
*/
void aglinleft(char a[]) {
	int i = 0, j = 0, ret = 1;
	for (; a[i] != '\0'; i++) {
		if (a[i] != ' ' && ret) {
			ret = 0;
		}
		if (!ret) {
			a[j++] = a[i];
		}
	}
	a[j] = '\0';
}
void delete_space(char a[]) {
	int i = 0, j = 0;
	for (; a[i] != '\0'; i++) {
		if (a[i] != ' ' || a[i + 1] != ' ') {
			a[j++] = a[i];
		}
	}
	a[j] = '\0';
}
void processpunctuation(char a[]) {
	int j = 0;
	for (int i = 0; a[i] != '\0'; i++) {
		if ((a[i] != ' ' || a[i + 1] != '.') && (a[i] != ' ' || a[i + 1] != ',')) {
			a[j++] = a[i];
		}
	}
	a[j] = '\0';
}
void processchar(char a[]) {
	if (a[0] <= 'z' && a[0] >= 'a') {
		a[0] -= 'a'-'A';
	}
	for (int i = 1; a[i] != '\0'; i++) {
		if (a[i] == '.') {
			if (a[i + 2] <= 'z' && a[i + 2] >= 'a') {
				a[i + 2] -= 'a'-'A';
			}
		} else if(a[i-2]!='.'){
			if (a[i] <= 'Z' && a[i] >= 'A') {
				a[i] += 'a'-'A';
			}
		}
	}
}
void lastprocess(char a[]){
	if(a[strlen(a)-1]==' '){
		a[strlen(a)-1]='\0';
	}
} 
int main() {
	char a[300];
	gets(a);
	aglinleft(a);
	delete_space(a);
	processpunctuation(a);
	processchar(a);
	lastprocess(a);
	printf("%s\n", a);

}

感受:这里我们又学习了一个非常有用的处理字符串删除的好方法

N-37. 爱丽丝拼三角形

成绩 10 开启时间 2022年04月1日 星期五 20:22
折扣 0.8 折扣时间 2022年04月27日 星期三 23:55
允许迟交 关闭时间 2022年04月27日 星期三 23:55

题目背景:

爱丽丝想要学几何,可是她对数学是一脸懵逼。这不,某天几何老师在黑板上出了这样一道题:给定一个长度为n的木棍,将其切割成长度为正整数a,b,c(a<=b<=c)的三段,问有多少种切割方案,使得切下来的三段可以拼成一个三角形,等腰三角形以及直角三角形,同时,三角形的三条边均要严格处于[l,r]这个区间。几何老师叫了正在做梦的爱丽丝上来回答这道题,这时她想要请你编写一个程序解决这个问题,让她免受老师的批评。

输入格式:

第一行一个整数T,代表数据组数。

此后T行每行三个正整数n,l,r,表示木棍的长度为n,三角形三条边均位于[l,r]这个区间。

输出格式:

T行,每行三个整数t1,t2,t3,分别表示满足条件的三角形的个数,等腰三角形的个数,直角三角形的个数。输出以换行符结尾。

样例输入1:

1

10 3 7

样例输出1:

1 1 0

数据范围:

1<=T<=10, 1<=n<=300, 1<=l,r<=100, r<=n

#include<stdio.h>
int fit(int a, int b, int c, int l, int r) {
	return (a >= l && a <= r) && (b >= l && b <= r) && (c >= l && c <= r);
}
int main() {
	int T;
	scanf("%d",&T);
	while (T--) {
		int n, l, r;
		int t1 = 0, t2 = 0, t3 = 0;
		scanf("%d%d%d", &n, &l, &r);
		for (int a = l; a <= r; a++) {
			for (int b = a; b <= r; b++) {
				for (int c = b; c <= r; c++) {
					if (a + b + c == n) {
						if (c - b < a) {
							t1++;
							if (a == c || a == b || b == c) {
								t2++;
							}
							if (a * a + b * b == c * c) {
								t3++;
							}
						}
					}
				}
			}
		}
		printf("%d %d %d\n", t1, t2, t3);
	}
}

N-38. 货币篮子

成绩 10 开启时间 2022年03月2日 星期三 18:00
折扣 0.8 折扣时间 2022年04月27日 星期三 23:55
允许迟交 关闭时间 2022年04月27日 星期三 23:55

题目描述:

2015 年11月30日,国际货币基金组织(IMF)执董会决定将人民币纳入特别提款权(SDR)货币篮子。由于这是历史上第一次增加SDR篮子货币,为给SDR使用者预留充裕时间做好会计和交易的准备工作,新的SDR篮子生效时间被定为2016年10月1日。在了解到这一消息后,Jaanai想要算算现在一定量的人民币在n年前可以换算成价值多少的外国货币(假设年通胀率和汇率保持不变)。

参考数据:

1 USD = 6.48 CNY

1 JPY = 0.061 CNY

1 EUR = 7.82 CNY

1 GBP = 9.02 CNY

输入格式:

第一行输入整数n和实数p,n的含义题目描述已给出,p表示年通胀率。

第二行输入一个实数x,表示想要计算的人民币价值。

第三行输入一个字符串s,保证是USD、JPY、EUR、GBP、CNY中的一种,表示Jaanai想要换算的目标货币。

输出格式:

一行一个实数,表示x元人民币在年通胀率p下在n年前等值的目标货币s的面值,保留两位小数。

(注:年通胀率指的是同样价值的物品的价格面值后一年相比前一年的增长率。)

行末没有多余空格,但是有换行符。

样例输入:

10 1

1024

CNY

样例输出:

1.00

数据范围:

n<=10,0<=p<=1,且(1+p)^n<=10,000

0<x<=100,000

——Jaanai

#include<stdio.h>
#include<string.h>
#include<math.h>
int main() {
	int n = 0;
	double p = 0;
	long double x = 0;
	scanf("%d%lf%Lf\n", &n, &p, &x);
	char s[10];
	gets(s);
	double factor = 0;
	if (strcmp(s, "USD") == 0) {
		factor =   1.0 / (pow(1 + p, n) * 6.48);
	}
	if (strcmp(s, "JPY") == 0) {
		factor = 1.0 / (pow(1 + p, n) * 0.061 );
	}
	if (strcmp(s, "EUR") == 0) {
		factor =  1.0 / (pow(1 + p, n) * 7.82 );
	}
	if (strcmp(s, "GBP") == 0) {
		factor =  1.0 / (pow(1 + p, n) * 9.02 );
	}
	if (strcmp(s, "CNY") == 0) {
		factor = 1.0 / pow(1 + p, n);
	}
	printf("%.2Lf\n", x * factor);
}
posted @ 2022-04-21 23:43  Link_kingdom  阅读(56)  评论(2编辑  收藏  举报