当前位置: 首页 > article >正文

【蓝桥杯】43696.小数第n位

小数第n位

题目描述

我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数。如果我们把有限小数的末尾加上无限多个0,那么有限小数和无限小数就都有了统一的形式。
本题的任务是:在上面的约定下,求整数除法小数点后的第 n 位开始的 3 个数字。

输入描述

输入一行三个整数:a,b,n,用空格分开。a是被除数,b是除数,n 是所求的小数后位置(0<a, b,n< 109)
比如,a=1,b=8,则a/b=1/8=0.125。如果n=1,输出为125;n=2,输出为250;n=3,输出为500

输出描述

输出一行 3 位数字,表示:a 除以 b,小数后第 n 位开始的 3 位数字。

输入输出样例

示例

输入
1 8 1
输出
125

一般解法(然并卵)
1,将a/b的结果保存为字符串;
2,把字符串中小数点的位置找出来,然后向后移动n位;
3,对字符串切片,把index+n : index+n+3的子字符串截取出来;
4,如果子字符串的长度不够,末尾用0补足

import os
import sys

# 请在此输入您的代码
a, b, n = map(int, input().split())
# 先进行除法运算得到小数形式(字符串表示),注意Python中整数除法会得到整数结果,这里要转为浮点数除法
result = str(a / b)
# print(result)

# 找到小数点的位置
dot_index = result.find('.')

# 如果n大于总长度(包含小数点)则不符合要求,
if dot_index + n < len(result) and n < 1000000000:
    # 提取从第n位开始的3位数字
    sub_result = result[dot_index + n: dot_index + n + 3]
    # 如果不足3位数字,在末尾补0
    if len(sub_result) < 3:
        sub_result += '0' * (3 - len(sub_result))
print(sub_result)

输入输出结果略。

然后就是只通过了一个测试用例。心中挺纳闷的。
后来看了其他作者分享的内容,才知道自己想法错了。
https://blog.csdn.net/red_red_red/article/details/89843256,
https://blog.csdn.net/A_ACM/article/details/88304399
换个思路,这道题的解法是这样:
1,获得a,b,n并转换为整数。
2,目标值即为(a ÷ b)× 10n+2 % 1000 = a× 10n+2 % (b × 1000)/ b
3,然后用快速求幂
感谢@胡歌爱亦菲 ,感谢@qdu_zhaiH,虽然还是一头雾水没看怎么看懂。

代码实现:
Python 实现

# 快速幂函数,用于计算a的b次方对mod取模的结果
def q_pow(a, b, mod):
    res = 1
    while b:
        if b & 1:
            res = (res * a) % mod
        a = (a * a) % mod
        b >>= 1
    return res


# 使用map函数将输入的字符串转换为整数,并分别赋值给a1, b1, n
a1, b1, n = map(int, input().split())

# 计算取模的数值
mod = b1 * 1000
# 调用快速幂函数计算结果
res = q_pow(10, n + 2, mod)
# 进行临时计算
tem = (a1 % mod * res % mod) % mod
# 按照格式化要求输出结果,确保输出三位宽度,不足三位前面补0
print(f"{tem // b1:03d}")

JAVA 实现

import java.util.Scanner;

public class Main {
    // 快速幂函数,用于计算a的b次方对mod取模的结果
    static long q_pow(long a, long b, long mod) {
        long res = 1;
        while (b > 0) {
            if ((b & 1) == 1) {
                res = (res * a) % mod;
            }
            a = (a * a) % mod;
            b >>= 1;
        }
        return res;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 获取用户输入的三个整数,分别赋值给a1, b1, n
        long a1 = scanner.nextLong();
        long b1 = scanner.nextLong();
        long n = scanner.nextLong();

        // 计算取模的数值
        long mod = b1 * 1000;
        // 调用快速幂函数计算结果
        long res = q_pow(10, n + 2, mod);
        // 进行临时计算
        long tem = (a1 % mod * res % mod) % mod;
        // 按照格式化要求输出结果,确保输出三位宽度,不足三位前面补0
        System.out.printf("%03d\n", tem / b1);

        scanner.close();
    }
}

C++实现

#include <iostream>
using namespace std;

// 快速幂函数,用于计算a的b次方对mod取模的结果
long long q_pow(long long a, long long b, long long mod) {
    long long res = 1;
    while (b > 0) {
        if (b & 1) {
            res = (res * a) % mod;
        }
        a = (a * a) % mod;
        b >>= 1;
        // 右移操作,相当于b /= 2;
    }
    return res;
}

int main() {
    long long a1, b1, n;
    // 获取用户输入的三个整数
    cin >> a1;
    cin >> b1;
    cin >> n;

    long long mod = b1 * 1000;
    // 调用快速幂函数计算结果
    long long res = q_pow(10, n + 2, mod);
    long long tem = (a1 % mod * res % mod) % mod;
    // 按照格式化要求输出结果,确保输出三位宽度,不足三位前面补0
    printf("%03lld\n", tem / b1);

    return 0;
}

C 实现

#include <stdio.h>

// 快速幂函数,用于计算a的b次方对mod取模的结果
long long q_pow(long long a, long long b, long long mod) {
    long long res = 1;
    while (b > 0) {
        if (b & 1) {
            res = (res * a) % mod;
        }
        a = (a * a) % mod;
        b >>= 1;
        // 右移操作,相当于b /= 2;
    }
    return res;
}

int main() {
    long long a1, b1, n;
    // 获取用户输入的三个整数
    scanf("%lld", &a1);
    scanf("%lld", &b1);
    scanf("%lld", &n);

    long long mod = b1 * 1000;
    // 调用快速幂函数计算结果
    long long res = q_pow(10, n + 2, mod);
    long long tem = (a1 % mod * res % mod) % mod;
    // 按照格式化要求输出结果,确保输出三位宽度,不足三位前面补0
    printf("%03lld\n", tem / b1);

    return 0;
}

http://www.kler.cn/a/446520.html

相关文章:

  • OpenHarmony 3.2 网卡获取ip地址缓慢分析
  • lambda初探(一)
  • 音视频入门基础:MPEG2-TS专题(21)——FFmpeg源码中,获取TS流的视频信息的实现
  • 轻松上手:使用 Vercel 部署 HTML 页面教程
  • Web3.0安全开发实践:探索比特币DeFi生态中的PSBT
  • 计算机工作流程
  • 如何创建属于自己的大语言模型:从零开始的指南
  • 目标检测与R-CNN——pytorch与paddle实现目标检测与R-CNN
  • 互联网医院系统,互联网医院系统源码可供
  • 固定资产分类,提升资产盘活效益
  • flink实现复杂kafka数据读取
  • 网工考试——数据链路层、网络层、传输层
  • 开源Genesis: 开创机器人研究的全新模拟平台
  • C++11 智能指针
  • 基于 SSM 和 Vue 打造的专业电脑测评系统:引领科技评估潮流
  • Flutter组件————Scaffold
  • iPhone恢复技巧:如何从 iPhone 恢复丢失的照片
  • 密钥管理系统在数据安全解决方案中的重要性
  • TensorFlow_T11 优化器对比实验
  • 用docker快速安装电子白板Excalidraw绘制流程图
  • GaussDB数据库中SQL诊断解析之配置SQL限流
  • Bcrypt在线密码加密生成器
  • 【人工智能】用Python实现图卷积网络(GCN):从理论到节点分类实战
  • 【网络云计算】2024第51周-每日【2024/12/20】小测-理论-周测
  • WeakAuras NES Script(lua)
  • 【微信小程序开发 - 3】:项目组成介绍