蓝桥杯上的一题,题目为排列数,用了暴力算法超时,请问该怎么处理,谢谢!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯上的一题,题目为排列数,用了暴力算法超时,请问该怎么处理,谢谢!相关的知识,希望对你有一定的参考价值。

/*问题描述
  7254是一个不寻常的数,因为它可以表示为7254 = 39 x 186,这个式子中1~9每个数字正好出现一次
  输出所有这样的不同的式子(乘数交换被认为是相同的式子)
  结果小的先输出;结果相同的,较小的乘数较小的先输出。
输出格式
  每一行输出一个式子,式子中的等号前后空格、乘号(用字母x代表)前后空格
  较小的乘数写在前面
样例输出
问题中的式子在结果中会出现一行如下:
7254 = 39 x 186*/
#include <iostream>
using namespace std;
int main()

int a,b,c,d,e,f,g,h,i;
for(a=1;a<=9;a++)
for(b=1;b<=9;b++)
for(c=1;c<=9;c++)
for(d=1;d<=9;d++)
for(e=1;e<=9;e++)
for(f=1;f<=9;f++)
for(g=1;g<=9;g++)
for(h=1;h<=9;h++)
for(i=1;i<=9;i++)

if(a!=b&&a!=c&&a!=d&&a!=e&&a!=f&&a!=g&&a!=h&&a!=i&&b!=c&&b!=d&&b!=e&&b!=f&&b!=g&&b!=h&&b!=i&&c!=d&&c!=e&&c!=f&&c!=g&&c!=h&&c!=i&&d!=e&&d!=f&&d!=g&&d!=h&&d!=i&&e!=f&&e!=g&&e!=h&&e!=i&&f!=g&&f!=h&&f!=i&&g!=h&&g!=i&&h!=i)

if(a*1000+b*100+c*10+d==e*(f*1000+g*100+h*10+i))
cout<<a<<b<<c<<d<<'='<<e<<'X'<<f<<g<<h<<i<<endl;
if(a*1000+b*100+c*10+d==(e*10+f)*(g*100+h*10+i))
cout<<a<<b<<c<<d<<'='<<e<<f<<'X'<<g<<h<<i<<endl;


return 0;

不用担心的,看看别人是怎么学习单片机的,加油。 最近论坛上发了一个连载帖子——吴鉴鹰单片机实战项目精讲,因此受到不少网友的关注,在这里吴鉴谢谢各位网友的支持、关心和信任。 在帖子中留了几个群号,有两千多读者加了群,通过QQ向我询问了很多问题,如果在工作不是太忙的时候我看到了就会回答,但是有时候做项目太忙就没时间解答。 为此,在这里应群内成员以及一些网友的要求,专门写一篇文章来针对这些问题做一个总结。希望能为大家的疑惑有一点点帮助就足以。不足之处,也希望大家客观指出,君子和而不同。 1、学习单片机有用吗? 有很多初学者有这样的困惑,单片机初学者感觉入门很难,学着学着,就会产生这样的疑问——自己辛辛苦苦学习单片机,将来有用吗? 单片机只是一个工具,重要的还是思想,有了自己的想法,电子行业地域辽阔,随便你闯。单片机这个切入点入手还是不错的,可以让你尽快进入电子殿堂的大门,如果你还在上学,不要眼睛里面只盯着暂时的薪水,哪怕是毕业两三年的也一样。重要的是掌握程度和对技术的理解程度,有句话叫“水到渠成”,到时候再去研究工资的事情也不晚。 2、学习嵌入式编程有必要从51单片机开始吗? 我原本来在读大学的时候,有很多同学听说学习ARM很牛逼,于是就跑到图书馆借了一两本关于ARM的书,学一两天后发现跟自己想的不太像,于是学着学着就慢慢放弃了。所以我总结一下,与其迈很大的步子,不如放慢脚步一步步走。从最基本的做起,一步步走,等单片机学会之后再进行像ARM,DSP之类高端处理器的运用,也就能得心应手了,如果想一口吃成一个胖子,只怕最后没胖起来,倒把自己给噎死了! 3、会用高端处理器就牛了吗? 不少网友问我:是不是学会了ARM、嵌入式操作系统就会很牛?是不是单片机就是运用在低档产品上,ARM做出来的产品就高端了。 首先,从本质上说,是同一类东西,都是嵌入式应用方面的主力。十八般兵器,没有优劣之分,只是在乎持兵器的人修为高低,当年解放军凭借小米加步枪不也取得了抗战胜利。 微处理器,单片机、DSP、FPGA、ARM,每一种都有自己的侧重点,都具备自己的优势和劣势。 单片机:技术比较成熟,运用在工控领域比较多,但进行嵌入式应用显得太庞大,因而派生出ARM单片机进行高端应用,可以进行操作系统的移植,但是现在一些高端单片机也可以移植操作系统,单片机跟ARM并没有什么本质的区别。 DSP:是数据处理的缩写。也可以做控制运用,它的优势是运算,主要用在运算量大的领域,如数字信号处理,图像处理,视屏处理,导弹雷达上也等等。如果要用的好,需要学会很多高深的算法,需要有较强的数学功底。 FPGA:可编程逻辑阵列的缩写。实际上就是做一个芯片,用软件实现它的内部连接,达到用软件的方法实现硬件的目标。是用硬件实现的一种方法。是早期单片机(功能简单的逻辑应用)的现代实现方法。 总结:一个嵌入式软件工程师,其实核心竞争力不是你会运用什么芯片,当你会了一两种以后,再学其他的,就会觉得很容易了。一个真正的有竞争力的工程师,应该是具备良好的编程习惯,编程思路,还应该具备扎实的数学功底。只有把握核心的东西,才能走的更远。 4、单片机行业技术研发有前途吗? 这也是初学者最为关心的一个话题,单片机行业的技术研发将来前途如何? 著名的高尔夫球手,老虎伍兹说过一句话:我只需成为高尔夫数一数二的高手,钱自然会追着我来。 单片机技术研发,也就是一个类型的职业岗位,同样叫做“单片机工程师”,能力、经验、学历,参差不齐,因此待遇肯定也不尽相同。 高待遇者,年薪数百万也有,低收入者,养家糊口都难。 只有倒闭的企业,没有倒闭的行业! 不是行业没有前景,只能反思自己为何没有足够的优秀。 5、单片机技术研发太苦太累,值得去坚持吗? 在论坛里看到很多人在抱怨:现在电子行业的研发做起来太累,待遇又不是很好,感觉没什么出路。 既然我们选择了单片机行业,就坚持做下去,不要轻信别人讲的:单片机研发工程师没有前途,太苦太累。 学好单片机你至少可以找一份技术性的工作,就算目前累一点,至少你可以看到希望,随着自己经验的积累,未来的路会越走越宽!至少可以坐在办公室里面,有自由的时间可以支配。 你知道那种专业课没学好,只能去车间做一线工人的感觉吗?坐在车间里像一个机器人一样每天重复同样的工作吗?你喜欢过那种一点自由都没有,在流水线上忙碌着,连上厕所时间都没有的工作吗?我相信没有人喜欢! 所有不要被一些工作了几年的工程师的话语所迷惑,说做技术很苦,拿的钱又少,当你真正有一天想去做技术,发现原来因为自己缺少知识的积累,没有公司愿意要你。 简单地分享了自己对单片机领域一些问题的看法,欢迎同行积极分享自己的心得,能让更多初学者少走弯路,摆正心态进行单片机的学习。追问

???

参考技术A #include<iostream>
#include<algorithm>
using namespace std;
int main()
int a[9]=1,2,3,4,5,6,7,8,9;
while(next_permutation(a,a+9))
if((a[0]*1000+a[1]*100+a[2]*10+a[3])==(a[4]*10+a[5])*(a[6]*100+a[7]*10+a[8]))
cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<" "<<a[3]<<" "<<a[4]<<" "<<a[5]<<" "<<a[6]<<" "<<a[7]<<" "<<a[8]<<endl;

return 0;

《LeetCode之每日一题》:269.快乐数

快乐数


题目链接: 快乐数

有关题目

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」定义为:
	对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
	然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
	如果 可以变为  1,那么这个数就是快乐数。
	
如果 n 是快乐数就返回 true ;不是,则返回 false
示例 1:

输入:n = 19
输出:true
解释:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1
示例 2:

输入:n = 2
输出:false
提示:

1 <= n <= 2^31 - 1

题解

法一:哈希表
参考官方题解

class Solution 
public:
    int getNext(int n)
    
        int total = 0;
        while(n)
        
            int d = n % 10;
            n /= 10;
            total += d * d;
        
        
        return total;
    
    bool isHappy(int n) 
        set<int> s;
        while(n != 1 && !s.count(n))
        
            s.insert(n);
            n = getNext(n);
        

        return n == 1;
    
;

法二:快慢指针
参考官方题解

class Solution 
public:
    int getNext(int n)
    
        int total = 0;
        while(n)
        
            int d = n % 10;
            n /= 10;
            total += d * d;
        
        
        return total;
    
    bool isHappy(int n) 
        int fastRunner = getNext(n);
        int slowRunner = n;
        while(fastRunner != 1 && fastRunner != slowRunner)
        
            slowRunner = getNext(slowRunner);
            fastRunner = getNext(getNext(fastRunner));
        

        return fastRunner == 1;
    
;

以上是关于蓝桥杯上的一题,题目为排列数,用了暴力算法超时,请问该怎么处理,谢谢!的主要内容,如果未能解决你的问题,请参考以下文章

蓝桥杯试题 算法训练 数字游戏

蓝桥杯三羊献瑞题目

蓝桥杯:Python组再也不怕组合数计数

蓝桥杯 算法训练 ALGO-147 4-3水仙花数

2019年第十届蓝桥杯组队题目第一题

蓝桥 :算法提高 排列数(深度优先)