问题 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
c
#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
c
#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:y
void 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.
还有一种思路是分开算,将整数和小数。
犯的错误:数组开的小了