c++ - 河内塔 - Long Int 无法处理结果 - 在 C++ 上使用时间戳
问题描述
我正在尝试解决 Urionlinejudge.com 上的挑战,问题(见下文)要求计算解决河内塔问题所需的时间并输出结束的小时(HH:MM:SS 格式)。
输入是磁盘的数量,输出是解决的小时数(认为每次移动需要一秒钟)。
我知道这个算法在 (2^n) - 1 中增长。
主要问题是,如果输入很大,则“long int”无法处理结果,因为它具有指数增长。
我尝试使用“for”来解决这个问题,并在 24 小时后减去数字,因为问题不问需要多少天,它只问问题结束当天的小时数。
但是,我超过了最大运行时间。我能做些什么?
#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;
int main()
{
int n = 0;
cin >> n;
if (n < 17)
{
n = pow(2, n);
n--;
}
else
{
int j = 1;
for (int i = 0; i < n; i++)
{
j *= 2;
if (j >= 86400)
{
j -= 86400;
}
}
n = j - 1;
}
int second, minute, hour;
if (n >= 86400)
{
n = n % 86400;
}
if (n >= 3600)
{
hour = n / 3600;
minute = n % 3600;
if (minute >= 60)
{
second = minute % 60;
minute = minute / 60;
}
else
{
minute = 0;
second = n;
}
}
else if (n >= 60)
{
hour = 0;
minute = n / 60;
second = n % 60;
}
else
{
hour = 0;
minute = 0;
second = n;
}
cout << setw(2) << setfill('0') << hour << ":" << setw(2) << setfill('0')
<< minute << ":" << setw(2) << setfill('0') << second << endl;
return 0;
}
问题:
(...) 问题由 3 个引脚组成,第一个引脚中有一堆圆盘,一个比另一个大。众所周知,不允许将较大的磁盘放在较小的磁盘之上。这意味着,要从堆中转移一个磁盘,必须首先移除所有较小的磁盘。除此之外,一次只允许移动一个磁盘。
当所有磁盘从第一个引脚转移到第三个引脚时,问题就解决了。
我们知道猴子从午夜 (00:00:00) 开始工作,它们每天 24 小时不间断地工作,移动每个磁盘至少需要 1 秒钟。你的任务是以 hh:mm:ss 格式预测白天或晚上的确切时间,即猴子最早完成游戏和世界结束的时间。
输入 输入由包含单个整数 0 < X < 10 40的单行组成,即起始堆栈中的磁盘数。
输出 输出由格式为 A:B:C 的字符串组成,其中 0 ≤ A < 24 e 0 ≤ B, C < 60 (HH:MM:SS) 格式。
来源:https ://www.urionlinejudge.com.br/judge/en/problems/view/2681
解决方案
推荐阅读
- django - 我想用 django 制作一个 webapp,这基本上是一个壁纸生成器,但是在哪里存储以及如何在 heroku 上显示图像?
- python - gunzip 管道传输到子进程缓慢
- flutter - 我尝试使用作为流的draw(dart reddit API)获取提交,然后将其显示为ListView,但我不知道该怎么做
- android - 如何在 Android Studio (kotlin) 中管理同一活动中的 2 个下拉菜单
- javascript - 网站图像不会显示在 github 页面或 netlify 上
- java - 仅在编程 powershell 中不允许获取空标识名称(用于 <>)
- javascript - 文件中的 TypeScript 私有接口
- javascript - 为什么我的 DJS 角色声明消息可以工作几个小时,但突然停止?
- typeorm - 有没有办法动态加载实体?建立连接后加载实体
- javascript - 表单提交后 next.js 更新页面