问题 A: 括弧匹配检验(check)
时间限制: 1 Sec 内存限制: 128 MB
提交: 132 解决: 30
[提交] [状态] [命题人:外部导入]
题目描述
假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,如([ ]())或[([ ][ ])]等为正确的匹配,[( ])或([ ]( )或 ( ( ) ) )均为错误的匹配。
现在的问题是,要求检验一个给定表达式中的括弧是否正确匹配?
输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出 “OK” ,不匹配就输出“Wrong”。输入一个字符串:[([][])],输出:OK
输入
输入仅一行字符(字符个数小于 255)
输出
匹配就输出 “OK” ,不匹配就输出“Wrong”。
样例输入 Copy
[(])
样例输出 Copy
Wrong
这题主要是运用栈来判断括号的对应,以及对题目解读的严谨
这是我第一次打的代码,得了89
#include<bits/stdc++.h>
using namespace std;
stack<char> s;
stack<char> h;
char a[1001];
//int x[11];
int main(){
gets(a);
int len=strlen(a);
for(int i=0;i<=len;i++){
if(a[i]=='(')//分开判断(,[(其实放一起也不是不可以,只是个人
//感觉要难理解一些
s.push(1);//入栈
if(a[i]==')')
if(s.empty()){//没有所对应的的前括号
cout<<"Wrong";
return 0;
}else
s.pop();
if(a[i]=='[')//同理
h.push(1);
if(a[i]==']')
if(h.empty()){
cout<<"Wrong";
return 0;
}else
h.pop();
}
if(s.empty() && h.empty() )cout<<"OK";//判断没有多余的括号才OK
else cout<<"Wrong";
//下面是我这个sb用的暴力
// for(int i=0;i<len;i++){
// if(a[i]=='('){
// x[1]++;
// }else if(a[i]=='['){
// x[2]++;
// }else if(a[i]==')'){
// x[1]--;
// }else if(a[i]==']'){
// x[2]--;
// }
// if(a[1]==0 && a[2]==0 && a[3]==0){
// cout<<"OK";
// }else{
// cout<<"Wrong";
// return 0;
// }
// }
return 0;
}
这是正解:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int stack[21];
char str[256];
int main(){
int i,len,top=0;
cin>>str;
len=strlen(str);
for(i=0;i<len;i++){
if(str[i]=='(')
stack[++top]=str[i];
else if(str[i]==')'){
if(top!=0&&stack[top]=='(')
top--;
else{
cout<<"Wrong";//如果top是')'或者'['或者‘]’都不可能最终匹配
return 0;
}
}
else if(str[i]=='[')
stack[++top]=str[i];
else if(str[i]==']'){
if(top!=0&&stack[top]=='[')
top--;
else{
cout<<"Wrong";//如果top是'('或者')'或者‘]’都不可能最终匹配
return 0;
}
}
}
if(top!=0) cout<<"Wrong";
else cout<<"OK";
return 0;
}
问题 B: 进制转换
时间限制: 1 Sec 内存限制: 128 MB
提交: 324 解决: 129
[提交] [状态] [命题人:外部导入]
题目描述
将任意一个 n 进制整数 x 转换成十进制。
输入
第 1 行 1 个正整数 n,1<n<10;
第 2 行 1 个整数 x。
输出
一行一个数,表示转换得到的十进制数,保证答案不超过 2147483647。
样例输入 Copy
2
100110
样例输出 Copy
38
这题思路就是转数乘以权值,但我想复杂了,艹,看了老师正解发现我是个“大聪明”
#include<bits/stdc++.h>
//进制转换
using namespace std;
int main(){
string num; //需要转换的n进制数,用字符数组char num[maxn]也是一样的
int n, m, ten = 0; //ten为转换成的十进制数
cin>>n>>num;
int len = num.size(); //获取num长度
for (int i = len-1, k = 0; i >= 0; i--, k++){ //从右至左倒序,k为n的k次方(同二进制)
int tmp;
if (num[i] >= 'A' && num[i] <= 'F') //如果n大于10
tmp=num[i]-'A'+ 10;
else
tmp=num[i]-'0'; //使用ascii码实现字符->数字的转换
ten += tmp * pow(n, k); //累加
}
stack<char> stk;
while(ten)
{
int u = ten % 10;
ten /= 10;
char tmp;
if (u < 10)
tmp = u +'0';
else
tmp = u + 'A' - 10;
stk.push(tmp); //入栈
}
while(stk.size())//逆序输出
{
cout << stk.top();
stk.pop();
}
cout << endl;
return 0;
}
问题 C: 带小数的十进制转二进制
时间限制: 1 Sec 内存限制: 128 MB
提交: 158 解决: 98
[提交] [状态] [命题人:外部导入]
题目描述
输入一个实数型十进制数,输出它的二进制数(小数点后保留4位)。
输入
输入一个实数型十进制数a。
输出
输出其转换成的二进制数。
样例输入 Copy
39.325
样例输出 Copy
100111.0101
没什么说的,水题一道
#include<bits/stdc++.h>
using namespace std;
int ans1[1001],ans2[1001];
int main(){
int a;
double b;
double n;
cin>>n;
a=int(n);
b=n-int(n);
//小数点之前
int sum1=1;//计数 ,其实只需要sum2,这是我之前的思路,输出有问题
while(a!=0){
ans1[sum1]=a%2;
a/=2;
sum1++;
}
for(int i=sum1-1;1<=i;i--){
cout<<ans1[i];
}
cout<<".";
int sum2=1;
while(b!=0 && sum2<=4){A//保留4位小数
if(b*2>1){
cout<<"1";
b=b*2-1;
}else{
cout<<"0";
b*=2;
}
sum2++;
}
// for(int i=sum1;i>=1;i--){
// cout<<ans1[i];
// }
// cout<<".";
// for(int i=1;i<=sum2;i++){
// cout<<ans2[i];
// }
return 0;
}
问题 D: 十进制转十六进制
时间限制: 1 Sec 内存限制: 128 MB
提交: 149 解决: 113
[提交] [状态] [命题人:zhuyumo]
题目描述
输入一个十进制数整数,将其转换成十六进制输出。
输入
一行一个整数n,为输入的十进制数,整数n不超过超长整型范围
输出
一行,为十进制数转换成的十六进制数。
样例输入 Copy
123
样例输出 Copy
7B
我以为我B题写的太复杂,结果和这道题的解法差不多(嘿嘿,因祸得福力(喜
#include<bits/stdc++.h>
//进制转换
using namespace std;
int main(){
string num; //需要转换的n进制数,用字符数组char num[maxn]也是一样的
int ten=0; //ten为转换成的十进制数
cin>>num;
//1、n进制转换为十进制
int len = num.size(); //获取num长度
for (int i = len-1, k = 0; i >= 0; i--, k++){ //从右至左倒序,k为n的k次方(同二进制)
int tmp;
if (num[i] >= 'A' && num[i] <= 'F') //如果n大于10
tmp=num[i]-'A'+ 10;
else
tmp=num[i]-'0'; //使用ascii码实现字符->数字的转换
ten += tmp * pow(10, k); //累加
}
stack<char> stk;
while(ten){
int u=ten%16;
ten/=16;
char tmp;
if (u<10)
tmp = u +'0';
else
tmp = u + 'A' - 10;
stk.push(tmp); //入栈
}
while(stk.size())//逆序输出
{
cout << stk.top();
stk.pop();
}
cout << endl;
return 0;
}
问题 E: 带小数八进制转二进制
时间限制: 1 Sec 内存限制: 128 MB
提交: 178 解决: 58
[提交] [状态] [命题人:xiaofang]
题目描述
请将输入的带小数8进制转为二进制
输入
一个带小数的8进制数(长度小于30)
输出
二进制数
样例输入 Copy
123.47
样例输出 Copy
1010011.100111
说真的,这道题有点东西,出来要处理队首的0,还有队尾的0,活生生的老六
这是我弟一次尝试的代码,错了,也不知道为什么,等长大就知道啦!
#include<bits/stdc++.h>
using namespace std;
int ans1[1001],ans2[1001];
int a,x;
double b;
char n[1001];
int main(){
int j,k;
char a[10001];
int aa[10001];
gets(a);//获得数组
int len=strlen(a);//获取长度
for(j=0;j<len;j++){
if(a[j]=='.'){ //记录'.'位置
x=j;
break;
}
}
for(int i=0;i<len;i++)
aa[i]=a[i]-48;
for(int i=0;i<len;i++){
if(i==0){
if(aa[0]==1){
cout<<"1";
}else if(aa[0]==2){
cout<<"10";
}else if(aa[0]==3){
cout<<"11";
}else if(aa[0]==4){
cout<<"100";
}else if(aa[0]==5){
cout<<"101";
}else if(aa[0]==6){
cout<<"110";
}else if(aa[0]==7){
cout<<"111";
}
}else if(i==x){
cout<<".";
}else{
if(aa[i]==1){
cout<<"001";
}else if(aa[i]==2){
cout<<"010";
}else if(aa[i]==3){
cout<<"011";
}else if(aa[i]==4){
cout<<"100";
}else if(aa[i]==5){
cout<<"101";
}else if(aa[i]==6){
cout<<"110";
}else if(aa[i]==7){
cout<<"111";
}
}
}
return 0;
}
下面才是正解:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int main(){
char a[50];
int b[3];
int len,i,j;
gets(a);
len=strlen(a);
for(i=0;i<len;i++)
{
if(a[i]=='.')
break;
}//判断小数点
for(j=0;j<=i-1;j++)
{
int c=a[j]-'0';
b[2]=c%2;
c=(c-b[2])/2;
b[1]=c%2;
c=(c-b[1])/2;
b[0]=c;
if(j==0)
{
if(b[0]==0)
{
if(b[1]==0)
{
cout<<b[2];
}
else
cout<<b[1]<<b[2];
}
else
cout<<b[0]<<b[1]<<b[2];
}
else
cout<<b[0]<<b[1]<<b[2];
}
cout<<".";
for(j=i+1;j<len;j++)
{
int c=a[j]-'0';
b[2]=c%2;
c=(c-b[2])/2;
b[1]=c%2;
c=(c-b[1])/2;
b[0]=c;
cout<<b[0];
if(j==len-1)
{
if(b[2]==0)
{
if(b[1]==0)
continue;
else
cout<<b[1];
}
else
cout<<b[1]<<b[2];
}
else
cout<<b[1]<<b[2];
}
return 0;
}
问题 F: 二进制分类
时间限制: 1 Sec 内存限制: 128 MB
提交: 88 解决: 67
[提交] [状态] [命题人:zhuyumo]
题目描述
若将一个十进制正整数化为二进制数,在此二进制数中,我们将数字1的个数多于数字0的个数的这类二进制数称为A类数,否则就称为B类数。
例如:
(13)10=(1101)2,其中1的个数为3, 0的个数为1,则称此数为A类数
(10)10=(1010)2,其中1的个数为2, 0的个数为2,则称此数为B类数
(24)10=(11000)2,其中1的个数为2, 0的个数为3,则称此数为B类数
求1~n中,全部A、B两类数的个数
输入
一个正整数n(1<=n<=10000)
输出
输出1~n(包括1和n)中A类数和B类数的数量,中间以空格隔开
样例输入 Copy
5
样例输出 Copy
3 2
说真的,这道题的题目我至少理解了10min,结果就是判断2进制中1和0的个数
#include<bits/stdc++.h>
using namespace std;
int n,a,b;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
int k=i,c,o=0,l=0;
//进制转换,没什么好说的
while(k){
c=k%2;
k/=2;
if(c==1)o++;
l++;
}
if(o>l-o)a++;//比较大小,还以为会超时
else b++;
}
cout<<a<<" "<<b;//水题*2
return 0;
}
问题 G: 产生数(Produce)
时间限制: 1 Sec 内存限制: 128 MB
提交: 177 解决: 62
[提交] [状态] [命题人:外部导入]
题目描述
给出一个整数 n(n<=8000)和 k 个变换规则(k≤15)。规则:
1)1 个数字可以变换成另 1 个数字;
2)规则中,右边的数字不能为零。
例如:n=234,k=2 规则为 2 → 5 3 → 6
上面的整数 234 经过变换后可能产生出的整数为(包括原数)234,534,264,564 共 4种不同的产生数。
求经过任意次的变换(0 次或多次),能产生出多少个不同的整数。仅要求输出不同整数个数。
输入
n
k
x1 y1
x2 y2
… …
xn yn
输出
格式为一个整数(满足条件的整数个数)。
样例输入 Copy
234
2
2 5
3 6
样例输出 Copy
4
判断“n”中相同且要变换的数,然后sum计数,最后是2的sum次方,做完之后发现这么简单我就是个烧杯
#include<bits/stdc++.h>
using namespace std;
int n, k, ans = 1;
pair<int, int> p[20];
vector<int> v;
int vis[10010];
void init(int n){
while (n!=0){
v.push_back(n%10);
n/=10;
}
std::reverse(v.begin(), v.end());
}
int generate() {
int res=0;
for (int i=0;i<v.size();++i) {
res=res*10+v[i];
}
return res;
}
void dfs() {
for (int i=0;i<v.size();++i) {
for (int j=0;j<k;++j) {
if (v[i]==p[j].first) {
v[i]=p[j].second;
int newNum = generate();
if (!vis[newNum]) {
vis[newNum]=1;
ans++;
dfs();
}
v[i]=p[j].first;
}
}
}
}
int main(){
cin.tie(0);
cin>>n>>k;
init(n);
for (int i=0;i<k;++i) {
cin>>p[i].first;
cin>>p[i].second;
}
vis[n]=1;
dfs();
cout<<ans;
return 0;
}