问题 C: 21级期末机试-密码设置(20分)
[命题人 : 外部导入]
时间限制 : 1.000 sec 内存限制 : 128 MB
题目描述
小南有个密码本,详细记录着她在每个网站上的密码,但是有的密码设置可能存在安全问题,她想请聪明的你帮她看看密码设置是否正确。安全密码的判断有以下几个规则:
(1)密码长度必须≥8
(2)包含数字
(3)包含大写字母
(4)包含小写字母
(5)至少包含6个特殊字符(! @ # $ * ~)中的一个
以上规则,除(1)必须满足外,其他四个条件至少满足其中三个才是安全的密码。
输入
多组样例。每行一个样例,输入一个字符串S代表密码,字符串S的长度len(S)满足:1≤len(S)≤30,且只包含密码设置要求的数字、字母和特殊字符,无其他非法字符。
输出
对于每一组样例,输出一个判断结果。如果满足安全密码的设置要求则输出yes,不满足则输出no。每个输出占一行。
样例输入 Copy
ttttttttt
123Aa~
123456QqWe
aQwe!1234
123$#abc
样例输出 Copy
no
no
yes
yes
yes
#include<stdio.h>
#include<string.h>
int main(void)
{char arr[31] = { 0 };while (~scanf("%s", &arr)){int sum = 0;int flag1 = 0, flag2 = 0, flag3 = 0, flag4 = 0;int n = strlen(arr);if (n >= 8){for (int i = 0; i < n; i++){if (arr[i] >= '1' && arr[i] <= '9')flag1 = 1;else if (arr[i] >= 'A' && arr[i] <= 'Z')flag2 = 1;else if (arr[i] >= 'a' && arr[i] <= 'z')flag3 = 1;else if (arr[i] == '!' || arr[i] == '@' || arr[i] == '#' || arr[i] == '$' || arr[i] == '*' || arr[i] == '~')flag4 = 1;}if (flag1 == 1)sum++;if (flag2 == 1)sum++;if (flag3 == 1)sum++;if (flag4 == 1)sum++;if (sum >= 3){printf("yes\n");}else{printf("no\n");}}else{printf("no\n");}}return 0;
}
问题 D: 21级期末机试-实数相加(10分)
[命题人 : 外部导入]
时间限制 : 1.000 sec 内存限制 : 128 MB
题目描述
C语言就要期末考试了,经过一学期的学习,小南学会了分数相加、分数相减、大整数相加,可就是没有尝试过将两个最大达400位的实数相加。在调试过程中,小南遇到了很多问题,一直解决不了。你能帮他编写一个程序实现两个实数相加吗?
输入
多组样例。每行输入一个样例包括两个用空格分开的实数x和y,其中x和y是长度不大于400位的非负实数。注意,非负实数中也可能包括非负整数,正整数会省略小数点和后面的0,只包括整数部分。
输出
对于每一行输入,输出两个实数x和y相加的结果。输出结果中整数部分的前面和小数部分的末尾不输出多余的0;如果是整数,不输出小数点和小数点后面的0。每个输出占一行。
样例输入 Copy
1.1 2.9
1.1111111111 2.3444323343
1 1.1
1.1111 1.1889
样例输出 Copy
4
3.4555434454
2.1
2.3
#include<stdio.h>
#include<string.h>
#define count(xLength,xzheng,x,xxiao) \for (int i = 0; i < xLength; i++)\
{\if (x[i] != '.')\xzheng++;\else\{\xxiao = xLength - xzheng - 1;break;\}\}
#define MAX(x,y) x>y?x:yvoid fuxiaoshu(char* x, int xzheng, char* xnew, int xxiao)
{while (*xnew != 0) xnew++;for (int i = xzheng +1;i < xzheng + 1 + xxiao; i++){*xnew = x[i];xnew++;}
}
int main(void)
{char x[410] = { 0 };char y[410] = { 0 };while (~scanf("%s %s", x, y)){int xLength = strlen(x), xzheng = 0, xxiao = 0;int yLength = strlen(y), yzheng = 0, yxiao = 0;count(xLength, xzheng, x, xxiao);count(yLength, yzheng, y, yxiao);int mzheng = MAX(xLength, yLength);char xnew[900] = { 0 }, ynew[900] = { 0 };if (xzheng >= yzheng){strncpy(xnew, x,xzheng);for (int i = 0; i < xzheng - yzheng; i++){ynew[i] = '0';}strcat(ynew, y);for (int i = xzheng; i < yLength+xzheng; i++){ynew[i] = 0;}}else{strncpy(ynew, y,yzheng);for (int i = 0; i < yzheng - xzheng; i++){xnew[i] = '0';}strcat(xnew, x);for (int i = yzheng; i <yLength+yzheng; i++){xnew[i] = 0;}}mzheng = (MAX(xzheng, yzheng)) + (MAX(xxiao, yxiao))+1;fuxiaoshu(x, xzheng, xnew, xxiao);fuxiaoshu(y, yzheng, ynew, yxiao);char arr[900] = { 0 };for (int i = mzheng-2; i>=1;i--){if (xnew[i] == 0)xnew[i] = '0';if (ynew[i] ==0 )ynew[i] = '0';arr[i] += xnew[i] - '0' + ynew[i] - '0'+'0';if (arr[i] -'0' >= 10){arr[i] -= 10;arr[i - 1]++;}}arr[0] += xnew[0] - '0' + ynew[0] - '0';printf("%d", arr[0]);arr[0] += '0';for (int i = 1; i < (MAX(xzheng, yzheng)); i++){printf("%c", arr[i]);}int nn = strlen(arr)-1;while (arr[nn] == '0'&&nn>= (MAX(xzheng, yzheng))){arr[nn] = 0;nn--;}if (nn+1 > (MAX(xzheng, yzheng))){printf(".%s\n", arr + (MAX(xzheng, yzheng)));}else{printf("\n");}}return 0;
}
我的思路是把整数和小数的小数点去掉,当作一个大的字符串相加。给少的前面补齐0,后面补齐0.
还有一种思路是分开算,将整数和小数。
犯的错误:数组开的小了