信息学奥赛复赛复习01-CSP-J2019-01-字符、字符数组、字符串、string、字符串读取
PDF文档公众号回复关键字:20240923
1 2019 CSP-J 题目1 数字游戏
[题目描述]
小 K 同学向小 P 同学发送了一个长度为 8 的 01 字符串来玩数字游戏,小 P 同学想要知道字符串中究竟有多少个 1。
注意:01 字符串为每一个字符是 0 或者 1 的字符串,如 101
为一个长度为 3 的 01 字符串。
[输入格式]
输入文件只有一行,一个长度为 8 的 01 字符串 s
[输出格式]
输出文件只有一行,包含一个整数,即 01 字符串中字符 1的个数
[输入输出样例]
输入 #1
00010100
输出 #1
2
输入 #2
11111111
输出 #2
8
说明/提示
样例 1 说明
该 01 字符串中有 2 个字符 1
样例 2 说明
该 01 字符串中有 8 个字符 1
数据规模与约定
对于 20% 的数据,保证输入的字符全部为 0
对于 100%的数据,输入只可能包含字符 0 和字符 1,字符串长度固定为 8
2 相关知识点
1) 字符
C语言有字符类型,也就是char类型,char类型的数据占内存大小为1字节。
C语言中不存在字符串类型,可以使用字符数组表示
字符是一种图形符号,不同国家不同地区都有自己特殊的字符,于是就衍生了“字符集合”这个名词。其中ASCII (American Standard Code for Information Interchange: 美国信息交换标准代码)是国际通用的标准字符集
例如
char a='0';
char b='P';
char c='@';
char c='65';//ascii 码 对应大写字母A
2) 字符数组
用来存放字符的数组称为字符数组
例如
//定义一个,总长度为5,有效长度为5的字符数组
char c1[5]={'h','e','l','l','o'};//定义一个,总长度为10,有效长度为5的字符数组
char c2[10]={'h','e','l','l','o'};//定义一个总长度为5,有效长度为5的字符数组
char c3[]={'h','e','l','l','o'};
字符数组输出的字符
#include <bits/stdc++.h>
using namespace std;
int main(){//int 数组直接输出是地址int a[5]={1,2,3,4,5};cout<<a<<endl;// 字符数组输出 不是地址 直接输出字符char c[5]={'1','2','3','4','5'};cout<<c;return 0;
}
/*
输出
0x71fe00
12345
*/
3) 字符串
是由“ ”包括起来的字符序列字符串的结束标志是‘\0’,用双引号括起来的一串字符就是字符串常量,它的末尾将由系统自动添加一个字符串结束标志‘\0’
在c语言中不能定义字符串,但是在c语言中使用字符串,通常会用字符数组来模拟字符串,必须是’\0'结尾的字符数组。如果字符数组中没有‘\0'结尾,那该字符数组就是普通的字符数组,不是字符串
例如
字符串赋值
//定义一个,总长度为10,有效长度为5的字符串 \0为结束符号
char c1[10]={'h','e','l','l','o','\0'};//定义一个总长度为10,有效长度为4的字符串 \0 有效长度只包括\0 前面的
char c2[10]={'h','e','l','l','\0','o'};//定义一个总长度为10,有效长度为9的字符串
char c3[10]="hello 123";
4) C++字符串 string
在 C++ 中,std::string
是一个表示字符串的类,它提供了许多方便的操作来处理字符串。std::string
是 C++ 标准库的一部分,因此你需要在代码中包含 <string>
头文件来使用它
//定义
string s;
//定义时赋值
string s1="abcd";
string s2("abcdef"); // s2 = "abcd"
string s3(4, 'a'); // s3 = "aaaa"
string s4("abcdef", 1, 3); //s4 = "bcd",即 "abcdef" 的从下标 1 开始,长度为 3 的子串
5) 字符串读取
cin 读取
cin
是 C++ 标准库中的一个输入流对象,它用于从标准输入设备(通常是键盘)读取数据
可以自动识别和处理不同类型的数据,如整数、浮点数、字符和字符串等
读取整数
#include <iostream>
using namespace std;int main() {int age;cout << "请输入您的年龄: ";cin >> age;cout << "您的年龄是: " << age << endl;return 0;
}
/*
请输入您的年龄: 19
您的年龄是: 19
*/
读取字符串
#include <iostream>
#include <string>
using namespace std;int main() {string name;cout << "请输入您的名字: ";cin >> name;cout << "您的名字是: " << name << endl;return 0;
}
/*
请输入您的名字: newcode
您的名字是: newcode
*/
getline函数
getline()
是 C++ 标准库中的一个函数,用于从输入流中读取一行文本
使用语法
std::istream& getline(std::istream& is, std::string& str, char delim);
参数说明:
is:输入流对象,通常使用 std::cin
str:用于存储读取到的字符串的 std::string 对象
delim:分隔符,默认为换行符 \n#include <iostream>
#include <string>
using namespace std;int main() {string line;cout << "请输入一行文本: ";getline(cin, line);cout << "您输入的文本是: " << line << endl;return 0;
}
/*
请输入一行文本: newcode
您输入的文本是: newcode
*/
3 思路分析
思路1
定义1个字符,逐一接收8次字符
每次接收到字符后,判断是否为1,如果为1累加到变量cnt
#include<bits/stdc++.h>
using namespace std;
int cnt;
char c;
int main(){for(int i=0;i<8;i++){cin>>c;if(c=='1'){cnt++;}}cout<<cnt;return 0;
}
思路2
定义1个字符数组,读取8个字符到c字符数组
循环字符数组每个元素,判断是否为1,如果为1累加到变量cnt
#include<bits/stdc++.h>
using namespace std;
int cnt;
char c[8];
int main(){cin>>c;for(int i=0;i<8;i++){if(c[i]=='1'){cnt++;}}cout<<cnt;return 0;
}
思路3
定义1个字符串s1,读取8个字符到字符串s1中
循环字符数组每个元素,判断是否为1,如果为1累加到变量cnt
#include<bits/stdc++.h>
using namespace std;
string s1;
int cnt;
int main(){getline(cin,s1);for(int i=0;i<8;i++){if(s1[i]=='1'){cnt++;}}cout<<cnt;return 0;
}
思路4
由于只有0和1这2个数字
10除以9余数为1
10/9=1......1
如果后面继续是0,此时余数不变
100=11.......1
如果后面是1,此时余数加1
101=11.......2
根据这个规则,可以读取整数后和9取余数
此方法只能计算最多8位
#include<cstdio>
int main(){int n;scanf("%d",&n);printf("%d",n%9);
}