问题 1573: [蓝桥杯][算法提高VIP]连接乘积

题目链接:

在这里插入图片描述
在这里插入图片描述

思路:暴力枚举每一个全排列,判断当前全排列是否为一个连接乘积。

超时,不过可以先在本地上跑出来,直接提交答案嘛,嘿嘿嘿。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>

using namespace std;
typedef long long ll;

int a[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

int main()
{
	freopen("in.txt", "r", stdin);
	freopen("out.txt", "w", stdout);
 
    do {
        ll sum = 0;
        for(int i = 0; i < 9; ++i)  sum = sum * 10 + a[i];
        
        ll t = 0;
        bool flag = false;          // 判断当前全排列是否为连接乘积
        
        for(int i = 0; i < 9; ++i)
        {
            t = t * 10 + a[i];      // 依次枚举当前全排列的前几位数t
            if(t == sum)    break;
            
            ll s = 0;				//求t的连接乘积 
            for(int j = 1; (int)log10(s) + 1 < 9; ++j)
            {
                ll nxt = t * j;
                s = s * pow(10, (int)log10(nxt) + 1) + nxt;
            }
            
            if(s == sum)
            {
                flag = true;
                break;
            }
        }
        
        if(flag)
        {
        	//printf("%d\n", t);
            for(int i = 0; i < 9; ++i)  printf("%d", a[i]);
            printf("\n");
        }
    }while(next_permutation(a, a + 9));
    
	fclose(stdin);fclose(stdout);
    return 0;
}
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>

using namespace std;
typedef long long ll;

int main()
{
    printf("123456789\n192384576\n219438657\n273546819\n327654981\n672913458\n");
	printf("679213584\n692713854\n726914538\n729314586\n732914658\n769215384\n");
	printf("792315846\n793215864\n918273645\n926718534\n927318546\n932718654\n");
    
    return 0;
}
发布了822 篇原创文章 · 获赞 127 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/104947101