1.HWOJ计算字符串最后一个单词长度
题目:计算字符串最后一个单词的长度,单词以空格隔开
输入样例:
hello world
输出样例:
5
题目分析:
①由于题目中输入的字符串有空格,所以我们这里不能用scanf输入,我们采用gets(s)
②我们要检测最后一个单词的长度,也就是可以说明我们可以从后面往前面循环找出第一个空格位置,之后直接求差值我们就可以知道这个字符串最后一个单词的长度
③由于我们需要循环,所以我们考虑把输入的字符串放入一个字符串数组中
④这里还需要注意一种特殊情况,如果字符串中没有空格的情况。
学习笔记:
①如果输入的字符串中含有空格,我们需要用gets(s)
例如char s[maxn];gets(s);
②如果输入的字符串中含有空格,但是我们可以选择单个单个输入处理时,我们需要用
while((c = getchar()) != EOF)
③测量字符串的长度用strlen,这里十分注意定义int len必须要放在scanf之前定义了。
④这里补充c/c++中各种输入模式的用法:
cin
1)输入一个数字
2)接受一个字符串,遇到空格、TAB、回车都结束
cin.get()
1)cin.get(ch)用来接收字符
2)cin.get(s,n)用来接收一行字符串,可以接收空格 这个类似于getline 可以输入多个单词用空格隔开
cin.getline()
接受一个字符串,可以接收空格。这个和cin(s,n)都需要注意
char m[] = jklkjilj;
cin.getline(m,5);
cout << m << endl; 这里输出结果为jklk 因为最后一个字符为‘0’
这就可以知道直接上cin.getline()有三个参数,接收字符串到m,接收个数,结束符(当省去的时候我们就默认为'\0'或者‘/n’)
gets()
接收一个字符串,可以接收空格并输出,但是需要加上头文件#include<string>
而且需要注意不能写成m = gets();应该为gets(m)
getchar()
接收一个字符,需要有头文件#include<string>
这几需要注意,不能写成getchar(ch);应该写成ch = getchar();
=========================================================================
参考代码:
//.c #include <stdio.h> #define maxn 1000 #include <string.h> int main() { int number = 0,i,len; char s[maxn]; gets(s); len = strlen(s); for(i = len-1; i >= 0; i--) { if(s[i] == ' ') { number = len - 1 - i; printf("%d\n",number); return 1; } } printf("%d\n",len); return 0; }
2 HWOJ表示数字
描述 知识点 字符串 运行时间限制 10M 内存限制 128 输入 输入一个字符串
输出 字符中所有出现的数字前后加上符号“*”,其他字符保持不变
样例输入 Jkdi234klowe90a3 样例输出 Jkdi*234*klowe*90*a*3*
题目分析:
①这道题首先要输入一个字符串,这个字符串没有空格,所以我们可以采用cin
②因为我们需要检测是不是数字,我们可以用头文件中的#include<ctype.h>中的isdigit来判断
③本题还涉及到字符串中字符的插入问题,所以我们这个时候采用s.insert来操作
③本题还需要注意一点就是当两个或者两个以上数字同时出现的时候,我们这个时候只需要写最开始的数字前面和最后数字的后面分别加上就可以了;所以我们需要判断当前字符后面是不是也为数字,如果为数字我们需要后移动一位,而且需要一直判断,所以选择用while语句,如果不是数字,我们字需要在其后两位处插入我们需要的符号就可以。
学习笔记:
①c语言中字符测试函数 头文件为include<ctype.h>
isalnum: 测试字符是否为英文字母或数字
函数定义: int isalnum(int c);
说明: 相当于使用(isalpha(c) || isdigit(c))做测试.
isalpha: 测试字符是否为英文字母
函数定义: int isalpha(int c);
说明: 相当于使用(isupper(c) || islower(c))做测试.
isdigit: 测试字符是否为阿拉伯数字
函数定义: int isdigit(int c);
说明: 只有参数c为阿拉伯数字0到9才能返回真.
isxdigit: 测试字符是否为16进制数字
函数定义: int isxdigit(int c);
说明: 只有参数c为0123456789abcdefABCDEF才能返回真.
isblank: 测试字符是否为空格字符或定位字符
函数定义: int isblank(int c);
说明: 只有参数c是空格(space 32)或是定位符(tab 9)才能返回真.
isspace: 测试字符是否为空格字符
函数定义: int isspace(int c);
说明: 只有参数c是空格(' '), 定位符('\t'), CR('\r'), 换行('\n'), 垂直定位('\v')或翻页('\f')才能返回真.
isascii: 测试字符是否为ASCII码
函数定义: int isascii(int c);
说明: 测试字符是否为ASCII码, 也就是判断c对应的整数范围是否在0到127之间.
iscntrl: 测试字符是否为ASCII码的控制字符
函数定义: int iscntrl(int c);
说明: 测试字符是否为ASCII码的控制码, 也就是判断c对应的整数范围是否在0到31之间.
ispunct: 测试字符是否为标点符号或特殊字符
函数定义: int ispunct(int c);
说明: 只有参数c是非空格, 非数字, 非英文字母才能返回真.
isgraph: 测试字符是否为可打印字符
函数定义: int isgraph(int c);
说明: 若c所对应的ASCII码可打印, 且非空格字符则返回真.
isprint: 测试字符是否为可打印字符
函数定义: int isprint(int c);
说明: 若c所对应的ASCII码可打印, 包括空格字符则返回真.
islower: 测试字符是否为小写英文字母
函数定义: int islower(int c);
isupper: 测试字符是否为大写英文字母
函数定义: int isupper(int c);
②标准C++中的string类的用法总结
参考链接:=======================================================================
参考代码://.cpp #include <iostream> #include <ctype.h> #include <string> const int maxn = 100; using namespace std; int main() { string s; cin >> s; for(int i = 0; i< s.length(); ) { if(isdigit(s[i])) { s.insert(i,"*"); int k = i+2; while(k < s.length() && isdigit(s[k])) k++; s.insert(k,"*"); i = k + 1; } else i++; } cout << s << endl; return 0; }
题目:将一个字符中所有出现的数字前加上符号“*”,其他字符保持不变
题目分析:
①这道题和前面一道题区别在于,现在只要检测到数字我们就需要在它前面加上符号,所以我们这道题更加简单
②相同方法,采用isdigit来检测是否为数字,之后利用c++中string类insert来插入符号
②我们还想到一种方法,
算法思路:
用c语言来做,原理利用两个数组之间的搬移,也就是说我们新建一个数组用来存放加符号的数组,现在同时大小的两个数组进行循环,str[maxn] temp[maxn]我们把两个同时循环加1检测str[i]中是否为数字,这里利用str[i] >= '0' && str[i] <= '9'检测,如果是数字,那么我们就直接把符号赋给temp[j],且j++,如果不是数字,我们直接temp[j] = str[i]
最后我们利用循环i从0到j循环加1将temp[i]输出,之后输出一个换行符
学习笔记:
①我们其实可以看得出来两种方法各有巧妙的地方所在,但是比较一致的地方就是如果是数字,我们插入符号,其实我们的i是加了2的,这里千万注意不是加了1,如果不是数字,我们才是加1.
②为什么string类不用去管加上符号的字符串的大小呢?因为它会自动调节自己的大小。所以C++中常喜欢用string来定义字符串和采用string类来进行一系列方便的操作。===============================================================================
方法一:
参考代码://.cpp #include <iostream> #include <ctype.h> #include <string> const int maxn = 100; using namespace std; int main() { string s; cin >> s; for(int i = 0; i< s.length(); ) { if(isdigit(s[i])) { s.insert(i,"*"); i = i + 2; } else i++; } cout << s << endl; return 0; }
方法二:
参考代码://.c #include <stdio.h> #include <string.h> #define maxn 100 int main() { char str[maxn]; scanf("%s",str); int i,j; int len = strlen(str); char temp[maxn]; for(i = 0,j = 0; j < maxn && str[i] != '\0'; i++,j++) { if(str[i] >= '0' && str[i] <= '9') { temp[j] = '*'; j++; } temp[j] = str[i]; } //temp[j] = '\0'; for(i = 0;i <= j; i++) { //str[i] = temp[i]; printf("%c",temp[i]); } printf("\n"); return 0; }
3 HWOJ 挑7
描述 知识点 循环 运行时间限制 0M 内存限制 0 输入 一个正整数N。(N不大于30000)
输出 不大于N的与7有关的数字个数,例如输入20,与7有关的数字包括7,14,17.
样例输入 20 样例输出 3
题目分析:
就是需要找含有7的有关的数字,有可能是7的倍数或者含有7的数
算法思路:①先找出7的倍数;②利用除10找余的方法找出含有7的数
学习笔记:
这里我们需要注意就是c中常用分离数字各位上的数用的方法就是%10 -> /10循环方法。============================================================================
参考代码://.c #include <stdio.h> int main() { int i,N; int count = 0; scanf("%d",&N); for(i = 1;i <= N; i++) { if(i % 7 == 0) //先找出7的倍数 { count++; } else { int temp = i; while(temp > 0) { if(temp % 10 == 7) //找含有7的数,用求余数的方法 { count++; break; } temp = temp / 10; } } } printf("%d\n",count); return 0; }