中国矿业大学数据结构实践1

如题,贴出AC代码,仅供参考不提供讲解

代码主打的就是一个叛逆(指能装逼AC但是可能没数据结构,尤指约瑟夫)

博客纯享版指路:中国矿业大学数据结构实践1 | 莱蒙黎梦

欢迎访问我的博客:莱蒙黎梦

问题 A: 找新朋友

内存限制:32 MB

时间限制:1.000 S

题目描述

新年快到了,天勤准备搞一个聚会,已经知道现有会员N人,把会员从1到N编号,其中会长的号码是N号,凡是和会长是老朋友的,那么该会员的号码肯定和N有大于1的公约数,否则都是新朋友,现在会长想知道究竟有几个新朋友?请你编程序帮会长计算出来。

输入

第一行是测试数据的组数CN(Case number,1<CN<10000),接着有CN行正整数N(1<n<32768),表示会员人数。

输出

对于每一个N,输出一行新朋友的人数,这样共有CN行输出。

样例输入
2
25608
24027
样例输出
7680
16016
代码
#include <bits/stdc++.h>
#pragma GCC optimize(2)
#define endl "\n"
#define ll long long
#define mm(a) memset(a,0,sizeof(a))
using namespace std;
int euler(int n){
    int ans = n;
    for (int i = 2; i*i <= n; i++)
        if (n % i == 0) {
            ans = ans / i * (i - 1);
            while (n % i == 0) n /= i;
        }
    if (n > 1) ans = ans / n * (n - 1);
    return ans;
}
inline void soluteA(){
    int T;
    cin>>T;
    while(T--){
        int N;
        cin>>N; 
        cout<<euler(N)<<endl;
    }
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    soluteA();
    
    return 0;
}	

问题 B: 互质

内存限制:32 MB

时间限制:1.000 S

题目描述

给你一个正整数n,请问有多少个比n小的且与n互质的正整数?
两个整数互质的意思是,这两个整数没有比1大的公约数。

输入

输入包含多组测试数据。每组输入是一个正整数n(n<=1000000000)。当n=0时,输入结束。

输出

对于每组输入,输出比n小的且与n互质的正整数个数。

样例输入
7
12
0
样例输出
6
4
代码
#include <bits/stdc++.h>
#pragma GCC optimize(2)
#define endl "\n"
#define ll long long
#define mm(a) memset(a,0,sizeof(a))
using namespace std;
int euler(int n){
    int ans = n;
    for (int i = 2; i*i <= n; i++)
        if (n % i == 0) {
            ans = ans / i * (i - 1);
            while (n % i == 0) n /= i;
        }
    if (n > 1) ans = ans / n * (n - 1);
    return ans;
}
inline void soluteB(){
    int T;
    cin>>T;
    while(T!=0){
        cout<<euler(T)<<endl;
        cin>>T;
    }
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    soluteB();
    
    return 0;
}

问题 C: CPP2023-47-约瑟夫问题

内存限制:128 MB

时间限制:1.000 S

题目描述

n个人围成一圈,按1到n的顺序编号。从第一个人开始报数(从1到m报数),凡报到m的人退出圈子,问最后留下的是原来的第几号。

输入

首先输入两个正整数n和m,n表示n个人围一个圈子(n>=2),m表示从1报数到m的人退出圈子(1=<m)。

输出

最后剩下的人的编号。

样例输入 复制
2 3
样例输出 复制
2
代码
#include <bits/stdc++.h>
#pragma GCC optimize(2)
#define endl "\n"
#define ll long long
#define mm(a) memset(a,0,sizeof(a))
using namespace std;
int f(int n, int m){
    return n == 1 ? n : (f(n - 1, m) + m - 1) % n + 1;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int n,m;
    cin>>n,m;
    cout<<f(n,m)+1;

    return 0;
}

问题 D: CPP2023-25-进制转换

内存限制:128 MB

时间限制:1.000 S

题目描述

编写程序演示把一个10进制整数转换为R进制的转换结果。

输入

正整数N和R,空格分隔
N是输入的十进制数,R需要转换的进制数,2<=R<=20

输出

将10进制整数转换为R进制的转换结果,超过9的数字符号显示为A、B、C……Z等字母。

样例输入
10 16
样例输出
A
代码
#include <bits/stdc++.h>
#pragma GCC optimize(2)
#define endl "\n"
#define ll long long
#define mm(a) memset(a, 0, sizeof(a))
using namespace std;
const char num[37] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
stack<int> st;
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, r;
    cin >> n >> r;
    while (n > 0) {
        st.push(n % r);
        n /= r;
    }
    while (st.size() != 0) {
        cout << num[st.top()];
        st.pop();
    }
    
    return 0;
}

问题 E: 整数求和式的计算

内存限制:128 MB

时间限制:1.000 S

题目描述

输入两个整数的求和式,比如1+2=,输出求和式和对应结果。请编程实现。

输入

一个求和式,形如a+b=。

输出

求和式及对应结果。

样例输入
1+2=
样例输出
1+2=3
代码
#include <bits/stdc++.h>
#pragma GCC optimize(2)
#define endl "\n"
#define ll long long
#define mm(a) memset(a,0,sizeof(a))
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    char x[200];
    cin>>x;
    cout<<x;
    int a,b,i=0;
    while(x[i]!='+')i++;
    x[strlen(x)-1]=x[i]=' ';
    sscanf(x,"%d%d",&a,&b);
    cout<<a+b;

    return 0;
}

问题 F: 波兰表达式

内存限制:128 MB

时间限制:1.000 S

题目描述

波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的波兰表示法为+ 2 3。波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的波兰表示法为* + 2 3 4。本题求解波兰表达式的值,其中运算符包括+ - * /四个。

输入

输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。

输出

输出为一行,表达式的值(保留6位小数)。

样例输入
* + 11.0 12.0 + 24.0 35.0
样例输出
1357.000000
代码
#include <bits/stdc++.h>
#pragma GCC optimize(2)
#define endl "\n"
#define ll long long
#define mm(a) memset(a, 0, sizeof(a))
using namespace std;
struct calc {
    bool is_op;
    union F {
        char op;
        double num;
    } mem;
};
int main() {

    vector<calc> vt;
    double a;
    calc m;
    char x[200];
    while (cin >> x) {
        if (x[0] > '9' || x[0] < '0') {
            m.is_op = true;
            m.mem.op = x[0];
        } else {
            m.is_op = false;
            sscanf(x, "%lf", &a);
            m.mem.num = a;
        }
        vt.push_back(m);
    }
    for (int i = vt.size() - 1; i >= 0; i--) {
        if (vt[i].is_op) {
            double &x = vt[i + 2].mem.num, &y = vt[i + 1].mem.num;
            switch (vt[i].mem.op) {
            case '+':
                y += x;
                break;
            case '-':
                y -= x;
                break;
            case '*':
                y *= x;
                break;
            case '/':
                y /= x;
                break;
            }
            vt.erase(vt.begin() + i + 2);
            vt.erase(vt.begin() + i);
        }
    }
    printf("%.6lf", vt[0].mem.num);
    return 0;
}

问题 G: 合并队列

内存限制:128 MB

时间限制:1.000 S

题目描述

上体育课的时候,老师已经把班级同学排成了两个队列,而且每个队列都是按照从底到高排好队,现在需要把两个队列合并,合并后需要保证还是从低到高排列。合并队列,你能编程实现吗?

输入

第1行为n,表示开始排成的每个队列的长度。第2、3行是代表从小到大的n个整数,每行的整数间有一个空格间隔。

输出

输出占一行,为从小到大的整数,每个整数间间隔一个空格。

样例输入 复制
5
1 3 5 8 15
2 3 4 6 9
样例输出 复制
1 2 3 3 4 5 6 8 9 15
代码
#include <bits/stdc++.h>
#pragma GCC optimize(2)
#define endl "\n"
#define ll long long
#define mm(a) memset(a,0,sizeof(a))
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int N;
    cin>>N;
    int a[20000],b[200000];
    for(register int i=0;i<N;i++) cin>>a[i];
    for(register int i=0;i<N;i++) cin>>b[i];
    int pa=0,pb=0;
    while(pa<N&&pb<N){
        if(a[pa]<b[pb])
            cout<<a[pa++]<<" ";
        else
            cout<<b[pb++]<<" ";
    }
    if(pa+pb!=2*N){
        if(pa==N){
            for(int i=pb;i<N;i++)
                cout<<b[i]<<" ";
        } else {
            for(int i=pa;i<N;i++)
                cout<<a[i]<<" ";
        }
    }

    return 0;
}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用turtle库的penup()和pendown()方法来控制画笔的移动和停止,还可以使用goto()方法来移动画笔到指定的位置。以下是使用turtle库画出“中国矿业大学”的示例代码: ```python import turtle # 设置画笔 turtle.penup() turtle.goto(-200, 0) turtle.pendown() turtle.pensize(10) # 画“中” turtle.left(90) turtle.forward(200) turtle.right(90) turtle.forward(100) turtle.left(90) turtle.forward(200) # 画“国” turtle.penup() turtle.goto(-50, 0) turtle.pendown() turtle.left(90) turtle.forward(200) turtle.right(90) turtle.forward(100) turtle.right(90) turtle.forward(100) turtle.right(90) turtle.forward(100) # 画“矿” turtle.penup() turtle.goto(100, 100) turtle.pendown() turtle.left(90) turtle.forward(200) turtle.right(90) turtle.forward(50) turtle.right(90) turtle.forward(100) turtle.right(90) turtle.forward(50) turtle.right(90) turtle.forward(100) # 画“业” turtle.penup() turtle.goto(100, -100) turtle.pendown() turtle.left(90) turtle.forward(200) turtle.right(90) turtle.forward(100) turtle.right(90) turtle.forward(100) turtle.right(90) turtle.forward(100) # 画“大” turtle.penup() turtle.goto(250, 0) turtle.pendown() turtle.left(90) turtle.forward(200) turtle.right(90) turtle.forward(100) turtle.right(90) turtle.forward(200) turtle.right(90) turtle.forward(100) # 画“学” turtle.penup() turtle.goto(400, 0) turtle.pendown() turtle.left(90) turtle.forward(200) turtle.right(90) turtle.forward(100) turtle.right(90) turtle.forward(100) turtle.right(90) turtle.forward(100) ``` 执行上述代码后,就可以在turtle窗口中看到绘制出来的“中国矿业大学”字样了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值