C/C++题库整理(一)

2017年10月1日牛客网

题目一:

/*
小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。
你能帮帮小Q吗?
输入描述:

输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.

输出描述:

对于每组数据,输出移位后的字符串。

输入例子1:
AkleBiCeilD

输出例子1:
kleieilABCD

#include <stdio.h>
#include <string.h>

int main() 
{
	char str[1000];
	scanf("%s", &str);
	
	for (int i = 0; i <= strlen(str); i++)
	{
		if ((str[i] >= 'a') && (str[i] <= 'z')) {
			printf("%c", str[i]);
		}
	}
	for (int i = 0; i <= strlen(str); i++)
	{
		if ((str[i] >= 'A') && (str[i] <= 'Z'))
			printf("%c", str[i]);
	}
	int n = strlen(str);
	str[n] = '\0';
	
	return 0;
}



//我的答案(错误)
#include <stdio.h>
#include <string.h>

int main()
{
	while (1)
	{
		char str[1000];
		char save[1];
		scanf("%s", &str);
		int n = strlen(str);
		for (int i = 0; i <= n; i++)
		{
			if ((str[i] >= 'A') && (str[i] <= 'Z'))
			{
				save[0] = str[i];
				for (int j = i; j <= n; j++)
				{
					str[j] = str[j + 1];
				}
				str[n - 1] = save[0];
				str[n] = '\0';
				
				
			}
			
		}
		printf("%s", str);
	}
	return 0;
}
*/

题目一分析一下,实质上这是一种投机取巧的做法。


题目二:

/*
有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少?



#include <iostream>
using namespace std;

int main() {
	int m;
	while (cin >> m) {
		int a = 1, b = 0, c = 0;//a-一岁图,b-二岁兔,c-三岁及以上兔子
		while (--m) {//每过一个月兔子数变化
			c += b;//二岁兔子长大一岁,三岁兔子长大但是还是三岁及以上
			b = a;//一岁兔子变成了两岁
			a = c;//所有的三岁兔子都会产下一个一岁兔子
		}
		cout << a + b + c << endl;
	}
}

//实际上是斐波拉契数列,通过测试
#include <stdio.h>

int ff(int n)
{

	if (n <= 2)	return	1;
	else	return	ff(n - 2) + ff(n - 1);
}
int main() {

	int i;
	while (scanf("%d", &i) != EOF)
		printf("%d\n", ff(i));
	return 0;

}*/

斐波拉切数列的练习。用递归效率确实很低,不如用循环去做。通过这题也看到一种大神的做法,把兔子分成三类,一岁,二岁和三岁的兔子。

题目三:


/*
密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分。
一、密码长度:
5 分: 小于等于4 个字符
10 分: 5 到7 字符
25 分: 大于等于8 个字符
二、字母:
0 分: 没有字母
10 分: 全都是小(大)写字母
20 分: 大小写混合字母
三、数字:
0 分: 没有数字
10 分: 1 个数字
20 分: 大于1 个数字
四、符号:
0 分: 没有符号
10 分: 1 个符号
25 分: 大于1 个符号
五、奖励:
2 分: 字母和数字
3 分: 字母、数字和符号
5 分: 大小写字母、数字和符号
最后的评分标准:
>= 90: 非常安全
>= 80: 安全(Secure)
>= 70: 非常强
>= 60: 强(Strong)
>= 50: 一般(Average)
>= 25: 弱(Weak)
>= 0:  非常弱

对应输出为:
VERY_WEAK,
WEAK,
AVERAGE,
STRONG,
VERY_STRONG,
SECURE,
VERY_SECURE


请根据输入的密码字符串,进行安全评定。
注:
字母:a-z, A-Z
数字:-9
符号包含如下: (ASCII码表可以在UltraEdit的菜单view->ASCII Table查看)
!"#$%&'()*+,-./     (ASCII码:x21~0x2F)
:;<=>?@             (ASCII<=><=><=><=><=>码:x3A~0x40)
[\]^_`              (ASCII码:x5B~0x60)
{|}~                (ASCII码:x7B~0x7E)


//通过测试,简单题
#include <stdio.h>
#include <string.h>

int main()
{
	char key_word[200];
	
	while (scanf("%s", &key_word) != EOF) {
int tot = 0;
	int score[5] = {0};
	int num_small=0, num_big=0,num_num=0, num_sign=0, num_gift=0;
		int size = strlen(key_word);
		for (int i = 0; i < size; i++) {
			if ((key_word[i] >= 'a') && (key_word[i] <= 'z'))
			{
				num_small++;
			}
			if ((key_word[i] >= 'A') && (key_word[i] <= 'Z'))
			{
				num_big++;
			}
			if ((key_word[i] >= '0') && (key_word[i] <= '9'))
			{
				num_num++;
			}
			if ((key_word[i] >= 0x21) && (key_word[i] <= 0x2f) ||
				(key_word[i] >= 0x3A) && (key_word[i] <= 0x40) ||
				(key_word[i] >= 0x5b) && (key_word[i] <= 0x60) ||
				(key_word[i] >= 0x7b) && (key_word[i] <= 0x7e)
				)
			{
				num_sign++;
			}
		}//for循环的括号
		
		if ((num_small != 0) && (num_big != 0))
		{
			score[1] = 20;
		}
		else if ((num_small == 0) && (num_big == 0))
		{
			score[1] = 0;
		}
		else
		{
			score[1] = 10;
		}
		if (num_num == 0)
		{
			score[2] = 0;
		}
		else if (num_num == 1)
		{
			score[2] = 10;
		}
		else
		{
			score[2] = 20;
		}
		if (num_sign == 0)
		{
			score[3] = 0;
		}
		else if (num_sign == 1)
		{
			score[3] = 10;
		}
		else
		{
			score[3] = 25;
		}

		
		if ((num_num != 0) && ((num_big != 0) || (num_small != 0)))
		{
			score[4] = 2;
		}
		if ((num_num != 0) && ((num_big != 0) || (num_small != 0)) && (num_sign != 0))
		{
			score[4] = 3;
		}
		if ((num_num != 0) && (num_big != 0) && (num_small != 0) && (num_sign != 0))
		{
			score[4] = 5;
		}

		if (size >= 8)	score[0] = 25;
		else if ((size >= 5) && (size <= 7))	score[0] = 10;
		else
		{
			score[0] = 5;
		}
		tot = score[0] + score[1] + score[2] + score[3] + score[4];
		if (tot >= 90) printf("VERY_SECURE\n");
		else if (tot >= 80) printf("SECURE\n");
		else if (tot >= 70) printf("VERY_STRONG\n");
		else if (tot >= 60) printf("STRONG\n");
		else if (tot >= 50) printf("AVERAGE\n");
		else if (tot >= 25) printf("WEAK\n");
		else if (tot >= 0)  printf("VERY_WEAK\n");

	}

	
	return 0;
}*/


这个题目吧,很简单,就是比较烦。这里面有一个考点挺好的,就是if的用法,有大量的if,我还犯了点错。一定要记住,if else的句子是——如果怎样就怎样,不然如果怎样就怎样,不然如果怎样就怎样。if和接着的else if一定是互相没有交集的。

题目四:


/*
输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数。

//本题已通过测试
#include <stdio.h>
#include <string.h>

int main()
{
	int num;
	while (scanf("%d", &num) != EOF) {
	int zero_flag = 0;
	while ((num) != 0)
	{
		if (num % 2 == 1) zero_flag++;
		num = num / 2;
	}
	printf("%d\n",zero_flag);
	}
	return 0;
}*/

这题目就是考察一个二进制转换,很简单。其实在C Primer Plus上介绍了一种用递归调用函数本身来转化二进制的做法,我贴在下面——

#include <stdio.h>
void to_binary(unsigned long n);

int main()
{
	unsigned long number;
	printf("Enter an integer(q to quit):\n");
	while (scanf("%ul", &number) == 1)
	{
		printf("Binary equibalent: ");
		to_binary(number);
		putchar('\n');
		printf("Enter an integer(q to quit):\n");
	}
	printf("Done.\n");
	return 0;

}
	void to_binary(unsigned long n)
	{
		int r;
		r = n % 2;
		if (n >= 2)
			to_binary(n / 2);
		putchar('0' + r);
		return ;
	}



题目五:

/*
计算字符串最后一个单词的长度,单词以空格隔开。
*/
/*
#include <stdio.h>
#include <string.h>

int main()
{

	char word[1000];
	gets_s(word);
	int length;
	int space_flag = 0;
	for (int i = 0; i < strlen(word); i++)
	{
		if (word[i] == ' ') space_flag = i;
		//i始终储存最后一个空格的位置
	}
	//int length = strlen(word) - space_flag;
	if (space_flag != 0){
		length = strlen(word) - space_flag - 1;}
	else
	{	length = strlen(word) - space_flag;}


		printf("%d\n", length);
	
	/*char ch[5000];
	int i, count = 0;
	gets_s(ch);
	
	gets()函数总结:
		(1)gets() 从标准输入设备读取字符串,以回车结束读取,使用'\0'结尾,回车符'\n'被舍弃没有遗留在缓冲区。
		(2)可以用来输入带空格的字符串。
		(3)可以无限读取,不会判断上限,因此使用gets不安全,可能会造成溢出
	
	int n = strlen(ch);
	if (n == 0 || n >= 5000)
		printf("error!");
	else
	{
		for (i = n; i >= 0; i--)
		{
			if (ch[i] != ' ')
				count++;
			else
				break;
		}
		printf("%d", count - 1);
	}

}*/


本题的重点一定要注意gets()函数与scanf()函数的区别,gets不以空格作为分隔符,只获取最后一个空格后的。注意,在C11中,gets变成了gets_s().

  • 24
    点赞
  • 108
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值