一道C/C++程序题

题目:当M为0时,A[0]=0;当M大于0时,A[M]=A[M-1]-M.若这个A[M]小于等于0或者其值已经出现在A数组中,则用另外一公式A[M]=A[M-1]+1.求... 题目:当M为0时,A[0]=0;当M大于0时,A[M]=A[M-1]-M.若这个A[M]小于等于0或者其值已经出现在A数组中,则用另外一公式A[M]=A[M-1]+1.求输入一个数K,输出A[K]的值.数组值为0, 1, 3, 6, 2, 7, 13, 20, 12, 21, 11, 22, 10, 23, 9 ...K值最大为50万

原题是英文的:The Recaman's sequence is defined by a0 = 0 ; for m > 0, am = am−1 − m if the rsulting am is positive and not already in the sequence, otherwise am = am−1 + m. (m是下标)
The first few numbers in the Recaman's Sequence is 0, 1, 3, 6, 2, 7, 13, 20, 12, 21, 11, 22, 10, 23, 9 ...
Given k, your task is to calculate ak.

#include<iostream>
using namespace std;
int a[500001];
int main()
{
int i,j,n;
while(n!=-1)
{
cin>>n;

for(i=0;i<=n;i++)
{
if(i==0)a[i]=0;
if(i!=0)
{
a[i]=a[i-1]-i;
if(a[i]<=0)a[i]=a[i-1]+i;
for(j=0;j<i;j++)
if(a[i]==a[j])a[i]=a[i-1]+i;
}
}
if(n==-1)break;
cout<<a[n]<<endl;
}

return 0;
}
我做的结果是对的,但当输入数大时(100000以上)要花十几秒等待,这显然不能接受.
我知道是算法有问题,它效率不高。我不知道的是要怎样去改。数据类型的确应该改为long,但这并没有解决问题。
请大家多多帮忙。
展开
 我来答
leeps_my
2006-11-15 · TA获得超过807个赞
知道小有建树答主
回答量:212
采纳率:0%
帮助的人:0
展开全部
 
 
 
你的程序的确是如 xniren 所说,线性搜索消耗的时间太多。
你用的是 C++,大可利用标准库里的 set 类。
set 是用平衡二叉树实现的,所以它的添加、移除和搜索都是 O(log n) 操作,快得多:

#include <set>
#include <iostream>
using namespace std ;

int a[ 500001 ],
    m = 1;
set<int> existing;

int main( ) {
    for ( int k; cin >> k && k != -1; ) {
        for ( ; m <= k; m++ ) {
            int current = a[ m - 1 ] - m;
            if ( current <= 0 || ! existing.insert( current ).second )
                existing.insert( current += 2 * m );
            a[ m ] = current;
        }
        cout << a[ k ] << '\n';
    }
    return 0;
}

 
 
 
锐道
2025-09-24 广告
URule Pro Java 规则引擎,一款给业务人员使用的可视化商业决策规则引擎系统,打开浏览器即可开始设计业务规则;URule Pro是一款自主研发纯Java规则引擎,亦是一款国产智能风控决策引擎,可以运行在Windows、Linux、... 点击进入详情页
本回答由锐道提供
顺利且通窍丶繁星06
2006-11-10 · TA获得超过1155个赞
知道小有建树答主
回答量:570
采纳率:100%
帮助的人:298万
展开全部
当输入的数比较大时,程序花在搜索数组A中是否存在相同数值的时间急剧增加。建议在搜索算法上多下功夫。程序中使用的如下的线性搜索算法显然是不可取的。
for(j=0;j<i;j++)
if(a[i]==a[j])a[i]=a[i-1]+i;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
一千馆原创短视频
2006-11-10 · TA获得超过1205个赞
知道小有建树答主
回答量:1105
采纳率:0%
帮助的人:1324万
展开全部
int的n能存100000以上?
还有,真的是100000以上,那么循环太多次了,这跟CPU速度有关,这得用专用计算或者服务器CPU来运行
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式