循环小数的第 n 位数字 - C++ 代码实现

问题描述:

数学课上,楠楠学习了一个新的知识。两数相除,如果得不到整数商,会有两种情况:一种是得到有限小数,另一种是得到无限小数。从小数点后某一位开始依次不断地重复出现前一个或一节数字的十进制无限小数,叫做循环小数,如 '2.9666...', (在数学中它读作“二点九六,六循环” ),定义循环小数的缩写法是将第一个循环节以后的数字全部略去,并将第一个循环节首末用括号括起来。

例如:

'2.966666...' 缩写为 '2.9(6)' '35.232323…' 缩写为 '35.(23)'

楠楠发现,根据循环小数的特征,很快能算出这个循环小数中小数点后第 n 位的数字,你能吗?

输入格式:

输入数据有两行。 第一行,输入一个整数 n(n<=100000),表示求小数点后的第 n 位。 第二行,一个字符串,用缩写法表示的一个循环小数。

输出格式:

输出一个整数,求出循环小数中小数点后第 n 位的数字。

输入样例 1:

10 352.19(7)

输出样例 1:

7

输入样例 2:

5 7328.(192)

输出样例 2:

9

cpp code 内容:

#include <iostream>
#include <string>
#include <cmath>
using namespace std;

int main() {
    int n;
    string decimal;
    cin >> n;
    cin >> decimal;
    
    // 去掉小数点和括号
    decimal.erase(decimal.find('.'), 1);
    decimal.erase(decimal.find('('), 1);
    decimal.erase(decimal.find(')'), 1);
    
    // 计算循环节的长度
    int length = decimal.length() - decimal.find('(');
    
    // 计算循环节之前的数字的长度
    int prefixLen = decimal.find('(');
    
    // 将循环节之前的数字转为整数
    int prefix = stoi(decimal.substr(0, prefixLen));
    
    // 将循环节转为整数
    int cycle = stoi(decimal.substr(prefixLen));
    
    // 计算循环次数
    int cycles = ceil((double)n / length);
    
    // 计算循环小数中小数点后第n位的数字
    int digit = (prefix * pow(10, length * cycles) + cycle * cycles) / pow(10, n % length) % 10;
    
    cout << digit << endl;
    
    return 0;
}
循环小数的第 n 位数字 - C++ 代码实现

原文地址: https://www.cveoy.top/t/topic/bLlb 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录