博客
关于我
A simple problem HDU-2522 【数学技巧】
阅读量:516 次
发布时间:2019-03-08

本文共 1309 字,大约阅读时间需要 4 分钟。

当除数n给定时,我们需要输出1/n的小数展开部分。对于循环小数的情况,要求输出第一个循环节。

解决方法:

  • 首先处理n的正负问题,将负数转化为正数计算,结果前面加入一个负号。
  • 特殊情况:n=1时,1/1=1.0,所以直接输出"1"。
  • 对于其他值,进行小数展开计算。例如,1/3=0.(3),1/7=0.(142857)等。
  • 使用一个数组来记录余数,避免重复计算并检测循环节的开始。
  • 当余数重复出现时,循环节就找到了。
  • 示例计算过程:n=7:

  • 7 >1,开始计算。
  • 各位依次为1、4、2、8、5、7,余数依次为7,4,2,1
  • 发现余数7重复出现,循环节为14285。
  • 代码实现:

    #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/

    你可能感兴趣的文章
    【Flink】Flink 底层RPC框架分析
    查看>>
    MySQL错误日志(Error Log)
    查看>>
    oracle使用DBMS_RANDOM包生成随机数据
    查看>>
    C++高精度模板
    查看>>
    解决:angularjs radio默认选中失效问题
    查看>>
    windows环境下安装zookeeper(仅本地使用)
    查看>>
    缓冲区溢出实例(一)--Windows
    查看>>
    Badboy录制脚本时,提示脚本错误的解决方法
    查看>>
    PHP一句话木马小总结与SQL语句写一句话木马
    查看>>
    关于计数排序
    查看>>
    Python中字符串前添加r ,b, u, f前缀的含义
    查看>>
    Hadoop学习笔记—Yarn
    查看>>
    JSONPath小试牛刀之Snack3
    查看>>
    Jenkins - 部署在Tomcat容器里的Jenkins,提示“反向代理设置有误”
    查看>>
    2017年前端框架、类库、工具大比拼
    查看>>
    wxWidgets源码分析(1) - App启动过程
    查看>>
    wxWidgets源码分析(3) - 消息映射表
    查看>>
    wxWidgets源码分析(5) - 窗口管理
    查看>>
    wxWidgets源码分析(7) - 窗口尺寸
    查看>>
    wxWidgets源码分析(8) - MVC架构
    查看>>