問題 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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章