博客
关于我
A simple problem HDU-2522 【数学技巧】
阅读量:515 次
发布时间: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/

    你可能感兴趣的文章
    vue添加答题功能
    查看>>
    SyntaxError: Unexpected token in JSON at position 4
    查看>>
    网狐客户端-win32
    查看>>
    Ubuntu 20.10 QT 5.12.2 cannot find -lGL错误解决
    查看>>
    QT报make: Circular all <- first dependency dropped.错误解决。
    查看>>
    设计模式二十三之工厂模式--工厂方法模式
    查看>>
    设计模式二十三之工厂模式--建造者模式
    查看>>
    细聊商品
    查看>>
    串行通信原理及实验仿真
    查看>>
    豪威科技2021数字电路设计笔试
    查看>>
    复位策略
    查看>>
    [Telerik]RadDocking第05篇 在同一个RadSplitContainer中定义多个面板分组
    查看>>
    ERP项目成功的关键因素:团队建设
    查看>>
    [MEF]第02篇 MEF的导入导出契约
    查看>>
    IBM曝光率下降,为何仍举足轻重
    查看>>
    项目沟通管理
    查看>>
    用 shell 脚本制造连接频繁中断的场景
    查看>>
    如果注解是错误百出,那么代码也好不了
    查看>>
    Silverlight初始屏幕
    查看>>
    演练:使用Visual Basic或Visual C#访问Web服务
    查看>>