知识在等待


私信TA

用户名:zxw389259877

访问量:12632

签 名:

自学编程,望和大佬多多交流

等  级
排  名 668
经  验 4028
参赛次数 0
文章发表 31
年  龄 0
在职情况 学生
学  校 华南理工大学
专  业

  自我简介:

解题思路:

1、声明变量m,声明一个字符指针ch,标记flag,设置四个标志up_f,down_f,num_f,other_f

2、循环m次,每次测试的都只有一组数据

1)五个标志都初始化

2)为这个指针动态分配50char内存

3)将第一个密码读入ch中

4)判断是否密码长度是否大于8且小于16,如果不是则flag=0

5)如果flag=1,则再判断是否有四种字符中的至少三种

6)循环,次数为密码长度

    如果up_f=0并且这个字符处于'A'和'Z'之间,令up_f=1

    如果down_f=0并且这个字符处于'a'和'z'之间,令down_f=1

    如果num_f=0并且这个字符处于'0'和'9'之间,令num_f=1

    如果other_f=0并且这个字符是特殊字符,令other_f=1

3、如果flag=1,并且up_f+down_f+....>=3,则输出YES,否则输出NO

注意事项:

1、使用up_f等四个标志,保证了在多个相同类型的字符输入时,判断只进入一次

2、这里使用动态数组,是因为假如使用定长数组,每次测试都必须初始化,这无疑是很难做到的,采用动态数组,可以在每次测试结束的时候就把内存释放掉,从而达到了初始化数组的目的

参考代码:

int main(int argc, char* argv[])
{
	int m, flag, up_f, down_f, num_f, other_f, i, len;
	char* ch;

	scanf("%d", &m);

	for (i = 0; i < m; i++)
	{
		/*标志初始化*/
		up_f = down_f = other_f = num_f = 0;
		flag = 1;

		/*创建一个动态的char数组*/
		ch = (char*)malloc(sizeof(char) * 50);

		/*把第一个密码读到ch中*/
		scanf("%s", ch);

		len = strlen(ch);

		/*判断长度是否介于8-16*/
		if (len < 8 || len >= 16)
			flag = 0;

		/*如果介于8-16*/
		if (flag)
		{
			for (int j = 0; j < len; j++)
			{
				/*判断字符是什么类型的*/
				if (up_f == 0 && ch[j] >= 'A' && ch[j] <= 'Z')
					up_f = 1;
				if (down_f == 0 && ch[j] >= 'a' && ch[j] <= 'z')
					down_f = 1;
				if (num_f == 0 && ch[j] >= '0' && ch[j] <= '1')
					num_f = 1;
				if (other_f == 0 && ch[j] == '~' || ch[j] == '!' || ch[j] == '@' || ch[j] == '#' || ch[j] == '$' || ch[j] == '%' || ch[j] == '^')
					other_f = 1;
			}
		}

		/*输出*/
		if (flag == 1 && up_f + down_f + num_f + other_f >= 3)
		{
			printf("YES\n");
		} 
		else
		{
			printf("NO\n");
		}

		free(ch);
	}
	return 0;
}


 

0.0分

10 人评分

新上线《蓝桥杯辅导》课程,近五年的蓝桥杯省赛与国赛真题都有,从读题开始理解题意、梳理思路、实现代码再提交评测全过程,可有效提升获奖比例甚至进国赛!课程介绍、试听请猛击这里

  评论区

  • «
  • »