神奇的数组和神奇的算法

C++的题目如下:

 

 

然后我看到一个大佬的代码是这样的,很简洁很神奇,但是我看了很久始终没搞懂为什么。

大佬代码如下:

#include <iostream>
using namespace std;
int k,n,i=1,j=1,l=1;

long long q[1001]={0,1};

inline long long min(long long a,long long b){return a<b?a:b;}

int main(){

    cin>>k>>n;
    while(l<n){

        long long a=q[i]*k,b=q[j]*k+1;//1 = 3^0
        q[++l]=min(a,b);

        if(q[l]==a)i++;
        if(q[l]==b)j++;

    }
cout<<q[n]<<endl;

}

 

有没有老师能解释一下为什么!谢谢啦

其实就是规律吧,你多列几组数据就能明白了,重要的是题目中的那个递增还是很重要的。其实多列几组的话,规律其实更加清楚了。

int res1[1001];
void fun1(int k) {
    res1[1] = 1;
    int a = 1;
    for (int i = 2; i <= 1000;)
    {
        res1[i++] = res1[a] * k;
        if (i <= 1000)
            res1[i++] = res1[a] * k + 1;
        a ++;
    }
}
int main()
{
    fun1(3);
    return 0;
}

代码就像这样了,其实看上去更加清楚了,而不是在哪里猜测下一个数应该是啥。

就用数组存状态就好了。


希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10581430.html
希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10768339.html
 

其实应该批评代码质量,变量命名应该有意义,代码部具要整洁易读。

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y