【无标题】SDZX2022/12/3-GSYT-AT

问题 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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值