c语言金典100题“从入门到放弃”10-15
## 过滤多余的空格
描述
一个句子中也许有多个连续空格,过滤掉多余的空格,只留下一个空格。
输入
输入1行:
一行,一个字符串(长度不超过 1000),句子的头和尾都没有空格。
输出
输出1行:
过滤多个空格之后的字符串
输入样例 1
Hello world.This is c language.
输出样例 1
Hello world.This is c language.
参考代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int k;
string a,s="";
getline(cin,a);
k=a.size();
for(int i=0;i<k;i++){
if(a[i]==' '&&a[i-1]!=' '){
s+=a[i];
}
if(a[i]!=' ')
s+=a[i];
}
cout<<s<<endl;
return 0;
}
##字符串的包含问题
描述
现在有2个字符串a,b,请你判断它们之间的包含关系。
若能在b串中发现a串,则称:a in b。
若二者相等,则输出same。
若无包含关系,则输出no。
例如: app和apple
则app in apple
输入
输入2行:
每行1个字符串,最多1000个字符,不含空格。
输出
输出1行:
字符串a和b的关系。
输入样例 1
app apple
输出样例 1
app in apple
输入样例 2
ppap apple
输出样例 2
no
参考代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int k,m;
string a,s;
getline(cin,a);
getline(cin,s);
k=a.find(s,0);
m=s.find(a,0);
if(k!=-1&&m!=-1){
cout<<"same";
}
else if(k!=-1){
cout<<s<<" in "<<a;
}
else if(m!=-1){
cout<<a<<" in "<<s;
}
else{
cout<<"no";
}
return 0;
}
##计算面积(area)
描述
小开是某小学的学生。在数学课上,小开的数学老师孟老师教会了大家梯形面积的计算公式:梯形面积=(上底+下底)*高/2。孟老师布置了多个关于梯形面积的计算题,作为当天的家庭作业。小开在完成了题目以后,决定编写一个程序计算梯形面积,检验自己计算的结果。给定梯形的上底a、下底b、高h的值(单位:厘米),请计算输出梯形的面积s(面积:平方厘米)。
输入
一行,三个正整数a,b,h
输出
一行,一个正整数s
输入样例 1
3 6 5
输出样例 1
22
提示
样例说明:
面积为(3+6)*5/2=22,结果取商的整数部分,没有小数。
【数据规模与约定】
对于50%的数据,1<=a,b,h<=50000。
对于100%的数据,1<=a,b,h<=1000000000。
结果取商的整数部分,没有小数。
参考代码
#include<bits/stdc++.h>
using namespace std;
int main(){
long long a,b,h,s;
cin>>a>>b>>h;
s=(a+b)*h/2;
cout<<s;
return 0;
}
##括号匹配
描述
假设表达式中允许包含圆括号和方括号两种括号,其嵌套的顺序随意,如([]())或[([][])]等为正确的匹配,[(])或([]()或(()))均为错误的匹配。
本题的任务是检验一个给定表达式中的括号是否正确匹配。
输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出“OK”,不匹配就输出“Wrong”。
输入
一行字符,只含有圆括号和方括号,括号个数小于 255。
输出
匹配就输出一行文本“OK”,不匹配就输出一行文本“Wrong”。
输入样例 1
[(])
输出样例 1
Wrong
#include<bits/stdc++.h>
using namespace std;
int main() {
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
stack<char> s;
string a;
cin>>a;
int i,j;
for(i=0; i<a.size(); i++) {
if(a[i]=='('||a[i]=='[') {
s.push(a[i]);
}
if(a[i]==')') {
if(s.empty()) {
cout<<"Wrong"<<endl;
return 0;
}
if(s.top()=='(') {
s.pop();
}
}
if(a[i]==']') {
if(s.empty()) {
cout<<"Wrong"<<endl;
return 0;
}
if(s.top()=='[') {
s.pop();
}
}
}
if(s.empty()) {
cout<<"OK"<<endl;
} else {
cout<<"Wrong"<<endl;
}
//fclose(stdin);
//fclose(stdout);
return 0;
}
##汉诺塔
描述
有三根相邻的柱子,标号为a,b,c,a柱子上从下到上按金字塔状叠放着n(n <= 15)个不同大小的圆盘,你可以借助b柱子,把所有盘子一个一个移动到柱子c上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,请你输出移动的步骤。
输入
输入1行:
第1行:1个整数n, 1<= n <= 15。
输出
输出1行:
第1行:若干行,表示移动的步骤,格式参考样例
输入样例 1
1
输出样例 1
1:a->c
输入样例 2
3
输出样例 2
1:a->c 2:a->b 1:c->b 3:a->c 1:b->a 2:b->c 1:a->c
#include<bits/stdc++.h>
using namespace std;
void hnt(int n,char a,char b,char c){
if(n==0){
return ;
}
hnt(n-1,a,c,b);//n-1 个盘子,从a移动到b
cout<<n<<":"<<a<<"->"<<c<<endl;//第n个盘子,从a移动到c
hnt(n-1,b,a,c);//n-1 个盘子,从b移动到c
}
int main(){
int n;
cin>>n;
hnt(n,'a','b','c');//n个盘子从a移动到c
return 0;
}