24-2-23

文章提供了四个编程练习题,涉及整数除法、调整学生分组人数、计算购买文具数量和硬币翻转次数,以及进制转换,展示了基本的算法设计和计算技巧。
摘要由CSDN通过智能技术生成

练习题

P1480 A/B Problem

# A/B Problem

## 题目描述

输入两个整数 $a,b$,输出它们的商。

## 输入格式

两行,第一行是被除数,第二行是除数。

## 输出格式

一行,商的整数部分。

## 样例 #1

### 样例输入 #1

```
10
2
```

### 样例输出 #1

```
5
```

## 提示

$0\le a\le 10^{5000}$,$1\le b\le 10^9$。

#include<bits/stdc++.h>
using namespace std;


int main()
{
    string a;
    int num[5001] = { 0 }, ans[5001] = { 0 };
    int b, len, res = 0;
    cin >> a >> b;
    len = a.length();
    for (int i = 0; i < len; i++)
    {
        num[i] = a[len - 1 - i] - '0';
    }
    for (int i = len - 1; i >= 0; i--)
    {
        res = res * 10 + num[i];
        ans[i] = res / b;
        res %= b;
    }
    while (ans[len] == 0 && len > 0)
        len--;
    for (int i = len; i >= 0; i--)
    {
        cout << ans[i];
    }
    return 0;
}

P1109 学生分组

# 学生分组

## 题目描述

有 $n$ 组学生,给出初始时每组中的学生个数,再给出每组学生人数的上界 $R$ 和下界 $L\ (L \le R)$,每次你可以在某组中选出一个学生把他安排到另外一组中,问最少要多少次才可以使 $N$ 组学生的人数都在 $[L,R]$ 中。

## 输入格式

第一行一个整数 $n$,表示学生组数;

第二行 $n$ 个整数,表示每组的学生个数;

第三行两个整数 $L,R$,表示下界和上界。

## 输出格式

一个数,表示最少的交换次数,如果不能满足题目条件输出 $-1$。

## 样例 #1

### 样例输入 #1

```
2
10 20
10 15
```

### 样例输出 #1

```
5
```

## 提示

### 数据范围及约定

对于全部数据,保证 $1\le n \le 50$。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int sum = 0, r, l, n, x = 0, y = 0;
    int a[51] = { 0 };
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
    }
    cin >> l >> r;
    for (int i = 1; i <= n; i++)
    {
        sum += a[i];
        if (a[i] > r)
            x += a[i] - r;
        if (a[i] < l)
            y += l - a[i];
    }
    if (sum<n * l || sum>n * r)
    {
        printf("-1");
        return 0;
    }
    if (x > y)
        printf("%d", x);
    else
        printf("%d", y);
    return 0;
}

P1421 小玉买文具

# 小玉买文具

## 题目描述

班主任给小玉一个任务,到文具店里买尽量多的签字笔。已知一只签字笔的价格是 $1$ 元 $9$ 角,而班主任给小玉的钱是 $a$ 元 $b$ 角,小玉想知道,她最多能买多少只签字笔呢。

## 输入格式

输入只有一行两个整数,分别表示 $a$ 和 $b$。

## 输出格式

输出一行一个整数,表示小玉最多能买多少只签字笔。

## 样例 #1

### 样例输入 #1

```
10 3
```

### 样例输出 #1

```
5
```

## 提示

#### 数据规模与约定

对于全部的测试点,保

证 $0 \leq a \leq 10^4$,$0 \leq b \leq 9$。

#include<bits/stdc++.h>
using namespace std;


int main()
{
    int a, b, c;
    cin >> a >> b;
    c = a * 10 + b;
    int ans = c / 19;
    cout << ans;
    
}

P2708 硬币翻转

# 硬币翻转

## 题目描述

有很多个硬币摆在一行,有正面朝上的,也有背面朝上的。正面朝上的用 $1$ 表示,背面朝上的用 $0$ 表示。

现在要求从这行的第一个硬币开始,将**从第一个硬币开始的前若干个硬币**同时翻面,求如果要将所有硬币翻到正面朝上,最少要进行这样的操作多少次?

## 输入格式

一个字符串,由 $0$ 和 $1$ 组成,表示硬币的初始状态。

## 输出格式

一个整数,表示要翻转的最少次数。

## 样例 #1

### 样例输入 #1

```
10
```

### 样例输出 #1

```
2
```

## 提示

### 样例解释

- 第 $1$ 次翻转:把第一个硬币翻到反面,字符串为 $00$;
- 第 $2$ 次翻转:把第一、二个硬币一起翻到正面,字符串为 $11$,翻转完成,输出 $2$。

### 数据范围

记 $n$ 表示硬币的总个数,

- 对于 $20\%$ 的数据,$1\le n\leq10$;
- 对于 $50\%$ 的数据,$1\le n\leq10^4$;
- 对于 $100\%$ 的数据,$1\le n\leq10^6$。

#include<bits/stdc++.h>
using namespace std;


int main()
{
    string s;
    cin >> s;
    while (s.back() == '1')
        s.pop_back();
    if (!s.length())
    {
        cout << '0';
        return 0;
    }
    int ans = 0;
    for (int i = 1; i <= s.length(); i++)
    {
        if (s[i] != s[i - 1])
            ans++;
    }
    cout << ans;
    return 0;
}

B3849 [GESP样题 三级] 进制转换

# [GESP样题 三级] 进制转换

## 题目描述

小美刚刚学习了十六进制,她觉得很有趣,想到是不是还有更大的进制呢?在十六进制中,用 `A` 表示 $10$、`F` 表示 $15$。如果扩展到用 `Z` 表示 $35$,岂不是可以表示 $36$ 进制数了嘛!

所以,你需要帮助她写一个程序,完成十进制转 $R$ 进制($2\le R\le 36$)的工作。

## 输入格式

输入两行,第一行包含一个正整数 $N$,第二行包含一个正整数 $R$,保证 $1\le N\le 10^6$。

## 输出格式

输出一行,为 $N$ 的 $R$ 进制表示。

## 样例 #1

### 样例输入 #1

```
123
25
```

### 样例输出 #1

```
4N
```

#include<bits/stdc++.h>
using namespace std;
int x, r, s;
int a[1001];
void func(int num, int step)
{
    if (num < r)
    {
        a[step] = num;
        s = step;
        return;
    }
    int i = num % r;
    a[step] = i;
    int j = num / r;
    func(j, step + 1);
}
int main()
{
    cin >> x >> r;
    func(x, 1);
    for (int i = s; i >= 1; i--)
    {
        if (a[i] <= 9)
        {
            cout << (char)(a[i] + '0');
        }
        else
        {
            cout << (char)(a[i] + 55);
        }
    }
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值