文章

【GESP】C++二级真题 luogu-B2073 求小数的某一位

GESP二级练习,多层循环和分支练习,直觉简单的思路容易出错,难度★★☆☆☆。

luogu-B2073 求小数的某一位

题目要求

题目描述

分数 $\dfrac{a}{b}$ 化为小数后,小数点后第 $n$ 位的数字是多少?

输入格式

三个正整数 $a$,$b$,$n$,相邻两个数之间用单个空格隔开。$0<a\le b\le100$,$1 \le n \le 10000$。

输出格式

一个数字。

输入 #1

1
1 2 1

输出 #1

1
5

题目分析

解题思路

  1. 读取输入的正整数a、b、n。
  2. 如果a等于b,则输出0并退出程序,因为在这种情况下,小数点后所有位数都是0。
  3. 初始化变量c用于存储小数点后第n位的数字。
  4. 使用循环从1到n,模拟小数点后每一位的计算过程。在每次循环中,将a乘以10,计算a除以b的商和余数,更新a为余数。
  5. 在第n次循环结束后,输出c的值,即小数点后第n位的数字。

注:需要注意题目给出的数据范围:

  1. 如果先求出结果的话,long long数据范围也不够;
  2. 如果用浮点数减法,没次减掉整数位的话,会因为浮点型的精度丢失问题导致不能AC。

—·

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <cmath>
#include <iostream>

using namespace std; // 使用标准命名空间

int main() {
    int a, b, n; // 定义变量a、b、n
    cin >> a >> b >> n; // 从输入流中读取a、b、n的值
    if (a == b) { // 如果a等于b
        cout << 0; // 输出0
        return 0; // 退出程序
    }
    int c; // 定义变量c
    for (int i = 1; i <= n; i++) { // 从1到n遍历
        a = a * 10; // 将a乘以10
        c = a / b; // 计算a除以b的商
        a = a % b; // 计算a除以b的余数
    }
    cout << c; // 输出c的值
    return 0; // 退出程序
}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页

luogu-”系列题目已加入洛谷Java、C++初学团队作业清单,可在线评测,团队名额有限,欢迎加入。

bcqm-”系列题目可在编程启蒙题库进行在线评测。

本文由作者按照 CC BY 4.0 进行授权