目录
1.思维导图
2.单组测试用例
如:明确给出单组要输入多少个数,程序运行一次只处理一组数据,之后直接打印结果,程序结束
3.多组测试用例
1.测试数据组已知(输入)类
如:先输入组数n,再输入n组数据,因此程序运行一次会处理多组数据
模版
cin>>n
while (n--)//n次询问
{
//do_something
}
注:n次询问参见C9.【C++ Cont】n次询问、向上取整和向下取整
例题
B2064 斐波那契数列
题目描述
斐波那契数列是指这样的数列:数列的第一个和第二个数都为 1,接下来每个数都等于前面 2 个数之和。
给出一个正整数 a,要求斐波那契数列中第 a 个数是多少。
输入格式
第 1 行是测试数据的组数 n,后面跟着 n 行输入。每组测试数据占 1 行,包括一个正整数 a(1≤a≤30)。
输出格式
输出有 n 行,每行输出对应一个输入。输出应是一个正整数,为斐波那契数列中第 a 个数的大小。
输入输出样例
输入 #1
4 5 2 19 1输出 #1
5 1 4181 1
两个方法:1.每给一个a算一次第a个斐波那契数 2.打表,查找第a个斐波那契数
显然第二个方法只算一次,运行速度快!
打表,让arr[a]直接对应第a个斐波那契数,因此arr[0]要弃置不用,因此arr至少能容纳31个数
代码
#include <iostream>
#include <string>
using namespace std;
int main()
{
int a,n;
int arr[31];
//打表
arr[1]=1;
arr[2]=1;
for (int i=3;i<31;i++)
{
arr[i]=arr[i-1]+arr[i-2];
}
cin>>n;
//n次询问
while (n--)
{
cin>>a;
cout<<arr[a]<<endl;
}
return 0;
}
提交结果
2.测试数据组未知
如:输入包含多组数据(并没有告诉一共多少组),每组数据输入一行,包含......
模版
//写法1
while(cin>>a)
{
//do_something
}
//写法2
while (scanf("%d",&a) != EOF)
{
//do_something
}
//写法3
while ((ch = getchar()) != EOF)
{
//do_something
}
//写法4
while(getline())//getline的返回值类型为istream&,不能和EOF比较
{
//do_something
}
写法1具体参见C17.【C++ Cont】遍历字符串的两种方式以及按单词去读取字符串文章
3.特殊值结束测试数据
如:输入一串字符,以某个字符结束,要求......
模版
1.逐个字符处理
输入一串字符,以“?”结束
char ch;
while((ch=getchar())!='?')
{
//do_something
}
2.一次读一行
string s;
getline(cin,s);
//do_something
例题
字符统计
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
输入一串字符,以“?”结束。统计其中字母个数,数字个数,其它符号个数。
输入描述:
输入一行,包含若干个字符,以”?”结尾。输出描述:
输出三行,每行包含一个整数,依次为字母个数,数字个数,其他符号个数。示例1
输入
ab123!?
ab123!?输出
Letters=2 Digits=3 Others=1
Letters=2 Digits=3 Others=1备注:
空格也可能是一个字符
#include <iostream>
#include <cctype>
using namespace std;
int main()
{
string s;
int Letters=0;
int Digits=0;
int Others=0;
getline(cin,s);//不能用cin>>s,可能有空格!!!
s.pop_back();//尾部删除?字符
for (auto a:s)
{
if (isalpha(a))
Letters++;
else if (isdigit(a))
Digits++;
else
Others++;
}
cout<<"Letters="<<Letters<<endl;
cout<<"Digits="<<Digits<<endl;
cout<<"Others="<<Others;
return 0;
}
提交结果
4.应对空格的处理方法
1.一次读一行
模板
string s;
getline(cin,s);
2.一次读一个单词
参见C17.【C++ Cont】遍历字符串的两种方式以及按单词去读取字符串文章
5.应对数字的处理方法
两个认知
1.呈现在控制台上的内容(输入或输出)是由单个的字符组成的
如下图输入123456,在屏幕上呈现的是由单个字符1,2,3,4,5,6组成的数字
2.如何解析这些字符取决于依赖编译器对变量类型的识别
根据类型再将读取字符串数据转化成对应类型的数据:123456可以被解析为字符串(string s),可以被解析为整型变量(int a),还可以被解析为浮点数(float f或double d)
例题
https://www.nowcoder.com/practice/fcd30aac9c4f4028b23919a0c649824d?tpId=290
BC45 小乐乐改数字
描述
小乐乐喜欢数字,尤其喜欢0和1。他现在得到了一个数,想把每位的数变成0或1。如果某一位是奇数,就把它变成1,如果是偶数,那么就把它变成0。请你回答他最后得到的数是多少。
输入描述:
输入包含一个整数n (0 ≤ n ≤ 109)
输出描述:
输出一个整数,即小乐乐修改后得到的数字。
示例1
输入:
222222输出:0示例2
输入:
123输出:101
方法1:按字符串处理
#include <iostream>
using namespace std;
int main()
{
string s;
cin>>s;
for (int i=0;i<s.size();i++)
{
if (s[i]%2)
s[i]='1';
else
s[i]='0';
}
cout<<stoi(s);
}
注意:最后一定要用stoi(s),不然打印s时可能会有前导0!!
(有关stoi函数参见C16.【C++ Cont】string类字符串的关系运算和与string有关的函数文章)
提交结果
方法2:按整数处理
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n;
cin >> n;
int ret = 0;
int i = 0; //记录权重的指数
while (n)
{
if (n % 10 % 2 ) // 为奇数
{
ret += pow(10, i); // pow(a, b)
}
n /= 10;
i++;
}
cout << ret << endl;
return 0;
}
提交结果
结论
输入的数字有两种看法:按字符串读或按整数/小数读
标签:字符,Cont,OJ,输出,int,个数,cin,C18,输入 From: https://blog.csdn.net/2401_85828611/article/details/145107565