将字符串作为输入流来处理(提取单词)
【C系列4.7】函数训练之暗号
Description
cyn小朋友今天参加了小学举办的侦探活动,她的任务是从暗号纸条的内容上找出特工Q给出的所有的暗号(即Q开头的单词)
Input
输入一串含有空格的字符串,字符串的长度不超过300。
Output
按顺序每行输出一个找到的首字母为Q或q的单词。
Samples
input
Queen and quick run from this site
output
Queen
quick
Solution
istringstream
是 C++ 标准库中的一个类,它用于将字符串作为输入流来处理。在上述代码中,我们首先使用std::getline
函数从标准输入中读取一行字符串,并将它存储在input
变量中。
然后,我们创建了一个istringstream
对象,名为iss
,并将之前读取的字符串input
传递给它。接下来,我们可以使用iss
就像处理标准输入一样,从中逐个提取单词。
这个做法的好处是,它允许我们使用标准的输入流操作来处理输入的字符串,就像处理标准输入一样,这样我们可以使用>>
操作符逐个提取单词,使代码更加清晰和简洁。
所以,istringstream
允许我们将一个字符串作为输入流来处理,方便地从中提取数据。
#include<bits/stdc++.h>
using namespace std;
int main() {
string input;
getline(cin, input);
istringstream iss(input);
string word;
while (iss >> word) {
if (word[0] == 'Q' || word[0] == 'q') {
cout << word << endl;
}
}
return 0;
}
二进制加法
Description
计算机使用的是二进制,和十进制不同的是:二进制运算“逢二进一”。下面举一个二进制加法的运算实例:
11101
+ 110
————
100011
1所在的位置:
6、2、1
你的任务是:对于任意的两个正的二进制数,求它们和中“1”所在的位置。
Input
有多组测试数据,每组测试数据共两行:
第一行:二进制的加数A,总长度<=200。
第二行:二进制的加数B,总长度<=200。
Output
输出二进制数A+B中“1”所在的位置,位置排序为从左到右:N、N-1、N-2...1,数据之间用空格分隔,行末没有多余的空格。
温馨提醒:
输出小技巧。如何在不确定何时为第一次输出,也不知道何时为最后一次输出时控制末尾的空格,使程序不会在末尾多输出一个空格导致程序错误。下面是一个例子:
int i, hasPrinted;
hasPrinted = 0;
for (i=0; i<n; i++) {
if (xxxxxxxx) { // 这里写输出的判定条件
if (!hasPrinted) {// 如果没有进行过输出
printf(“%d”, n[i]); // 根据你的情况输出,不一定就是%d和n[i]
hasPrinted = 1;
} else {
printf(“ %d”, n[i]);
}
}
}
这样你的输出就不会在末尾多出一个空格了!
Samples
input
111
110
11101
110
output
4 3 1
6 2 1
Hint
博客题解:https://blog.csdn.net/balalinhq/article/details/107030238
Solution
#include<bits/stdc++.h>
using namespace std;
// 函数用于计算两个二进制字符串的和
string binaryAddition(const string& a, const string& b) {
int carry = 0; // 进位初始化为0
string result = "";
int i = a.length() - 1;
int j = b.length() - 1;
while (i >= 0 || j >= 0 || carry > 0) {
int sum = carry; // 当前位的和等于进位值
if (i >= 0) {
sum += a[i] - '0'; // 加上第一个二进制数的当前位(将字符转换为整数)
i--;
}
if (j >= 0) {
sum += b[j] - '0'; // 加上第二个二进制数的当前位(将字符转换为整数)
j--;
}
result = char('0' + sum % 2) + result; // 计算当前位的值,并将其添加到结果字符串的前面
carry = sum / 2; // 更新进位
}
return result;
}
// 函数用于输出二进制数中"1"所在的位置
void printOnesPosition(const string& binaryNumber) {
bool firstPrint = true;
for (int i = 0; i <= binaryNumber.length() - 1; i++) {
if (binaryNumber[i] == '1') {
if (!firstPrint) {
cout << " ";//如果不是第一次输出,则先输出一个空格,再输出值
}
cout << binaryNumber.length() - i;
firstPrint = false;
}
}
cout << endl;
}
int main() {
string binaryA, binaryB;
while (cin >> binaryA >> binaryB) {
string result = binaryAddition(binaryA, binaryB);
printOnesPosition(result);
}
return 0;
}
呆滞,怎会如此
梅坞春早
Description
西湖十景之九,梅家坞溪谷深广,常年草木繁盛,峰峦叠翠,即使数九寒冬,也不掩如春天气象。梅家坞盛产茶叶,为“西湖龙井”中的珍品。“春”在梅坞便是茶香之意,每当清明时节,云雾缭绕的山坡上,采茶女的身影隐现在碧绿如茵的茶园之间,鸟鸣茶歌,婉转相应,为秀美山水平添了一份灵气,也是春天西湖独特的人文景色。——百度百科
JLS发现茶山上共有2n棵茶树一字排开,于是想到一个游戏,他对KK说:“我们轮流摘茶叶,每次我和你挑选最左或最右的一颗茶树,摘光上面的茶叶,摘过的茶树不再算在可摘的范围内,我们比比谁最后摘到的多,我们猜拳决定先后!”,KK没有多想就答应了。
已知KK和JLS都是两个绝顶聪明的人,请问最后谁会摘到更多的茶叶呢?
Toggle Code
#include <stdio.h>
int check(int a[],int len,int k);
int main()
{
int a[210];
int t;
int n,k;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&k);
for(int i=0;i<2*n;++i)
{
scanf("%d",&a[i]);
}
if(check(a,2*n,k)==0)
{
puts("KKTXDY");
}
else
{
puts("JLSTXDY");
}
}
}
Input
第一行输入一个数字T代表有T组输入(T≤10)
每组输入第一行输入两个数字n,k代表茶树上共有2n棵茶树,k=1代表JLS先摘,k=0代表KK先摘(1≤n≤100,0≤k≤1)
每组输入第二行输入2n个数字ai,(0≤ai≤100)表示从左到右的茶树,其中ai表示这棵茶树上共有ai片茶叶
Output
若JLS能摘到更多的茶叶,输出JLSTXDY
否则输出KKTXDY
Samples
input
2
2 1
1 2 3 4
2 0
9 8 7 6
output
JLSTXDY
KKTXDY
Hint
第一组:
JLS首先摘光a4
此时无论KK摘a1还是a3,JLS都可以摘走a2,总共摘到6片茶叶胜出
第二组:
KK首先摘光a1
此时无论JLS摘a2还是a4,KK都可以摘走a3,总共摘到16片茶叶胜出
P.S.相同茶叶数量先手获胜
本题为函数题,如果使用C语言提交,只需要提交check()函数,程序主体在题面中
注意:两个都是绝顶聪明+地图全开。
Solution
int check(int a[], int len, int k) {
return k;
}
标签:input,int,题解,二进制,2023,字符串,0913,输入,string
From: https://www.cnblogs.com/yoongiBlog/p/17698925.html