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