- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
作业是编写一个 C++ 程序,它接受输入数字 n 并输出序列中的第 n 个数字:
1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 1 2 3 4 5 6 ...
这是我到目前为止想出的:
#include <iostream>
using namespace std;
int main()
{
long long n,k=1,result;
cin >> n;
if(n==1){
result=1;
}else{
for(int i=1,j=1;;i=j,j=j+k){
if(n>i&&n<=j){
result=n-i;
break;
}else{
k++;
}
}
}
cout << result << endl;
}
这也是我之前写的:
#include <iostream>
using namespace std;
int main()
{
long long n,count=0,result;
cin >> n;
for(int i=1;;i++){
for(int j=1;j<=i;j++){
count=count+1;
if(count==n){
result=j;
break;
}
}
if(count>=n){
break;
}
}
cout << result << endl;
}
这两个都适用于较小的数字,但问题是我必须遵循约束:
1 <= n <= 10^12
所以当输入更大的数字时,程序输出解决方案的时间太长并且超过了时间限制,即 2 秒。我已经为此工作了 5 个小时,但我不知道如何改进这些程序以使其更快。我还想到了一个可以帮助确定这样一个序列中的第 n 个数的特定公式,但我似乎无法在 Internet 或我的数学书籍中找到任何相关信息。有人可以指出我的解决方案吗?我将不胜感激。
最佳答案
我们可以按照您的顺序对数字进行分组:
(1) (1, 2) (1, 2, 3) ...
数字的总量是
1 + 2 + 3 + ...
后者是等差级数,其和等于x*(x+1)/2
.
我们将找到完整组的数量 k
在n+1
之前- 序列中的第一个数字。 k
等于最大整数使得 k*(k+1)/2 <= n
.为了找到它,我们将求解二次方程:
x*(x+1)/2 = n
x^2 + x - 2*n = 0
我们假设这个方程的正根是 x'
.我们将其四舍五入为最接近的整数 k
.如果x' == k
(x'
是一个整数)就是答案。否则,答案是 n - k*(k+1)/2
.
示例 c++实现:
double d = 1 + 8.0 * n;
double x = (-1 + sqrt(d)) / 2;
long long k = floor(x);
long long m = k*(k+1) / 2;
if (m == n) {
return k;
} else {
return n - m;
}
解决方案有O(1)
时间复杂度。
关于c++ - 如何找到分形序列中的第 N 个数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47260147/
例如,我有一个父类Author: class Author { String name static hasMany = [ fiction: Book,
代码如下: dojo.query(subNav.navClass).forEach(function(node, index, arr){ if(dojo.style(node, 'd
我有一个带有 Id 和姓名的学生表和一个带有 Id 和 friend Id 的 Friends 表。我想加入这两个表并找到学生的 friend 。 例如,Ashley 的 friend 是 Saman
我通过互联网浏览,但仍未找到问题的答案。应该很容易: class Parent { String name Child child } 当我有一个 child 对象时,如何获得它的 paren
我正在尝试创建一个以 Firebase 作为我的后端的社交应用。现在我正面临如何(在哪里?)找到 friend 功能的问题。 我有每个用户的邮件地址。 我可以访问用户的电话也预订。 在传统的后端中,我
我主要想澄清以下几点: 1。有人告诉我,在 iOS 5 及以下版本中,如果您使用 Game Center 设置多人游戏,则“查找 Facebook 好友”(如与好友争夺战)的功能不是内置的,因此您需要
关于redis docker镜像ENTRYPOINT脚本 docker-entrypoint.sh : #!/bin/sh set -e # first arg is `-f` or `--some-
我是一名优秀的程序员,十分优秀!