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);
}
}*/