本文共 1309 字,大约阅读时间需要 4 分钟。
当除数n给定时,我们需要输出1/n的小数展开部分。对于循环小数的情况,要求输出第一个循环节。
解决方法:
示例计算过程:n=7:
代码实现:
#include#include <_limits.h> // 模拟的极限处理const int MAXDigit = 200000;bool vis[MAXDigit] = {false};int main() { int t, n; std::cin >> t; std::memset(vis, false, sizeof(vis)); while (t--) { t--; n = 0; std::cout << std::showpoint << std::fixed << std::setprecision(0); bool negative = false; if (n < 0) { negative = true; n = -n; } if (n == 1) { std::cout << "-1\n"; continue; } std::cout << "0."; // 小数部分开始 vis[0] = true; // 防止输出多个0 int m = 1; while (!vis[m]) { vis[m] = true; if (m > n) { // 检查是否为循环小数,后面可以扩展处理,如乘10取模的方法 std::cout << std::endl; break; } m *= 10; std::cout << static_cast (m / n); m %= n; } std::cout << std::flush; } return 0;}
这个代码处理了正数和负数情况,特判了n=1的情况,并尝试找到1/n的小数展开部分和循环节。由于使用了vis数组记录余数,避免了重复计算,可以有效地找到循环节的起始点。
转载地址:http://ieziz.baihongyu.com/