# Brute Force# Number Theory# Backtracking

d183 - 00725 - Division

🔗 前往 ZeroJudge 原題

題目描述

題目要求找出兩個五位數的整數,使得第一個數除以第二個數的商為給定的 N (2 <= N <= 79),並且兩個五位數包含 0 到 9 的所有數字各一次。

解題思路

程式使用暴力法,遍歷所有可能的五位數 i (從 1234 到 99999),然後計算 n * i。接著,檢查 n * ii 是否都是五位數,並且它們包含的數字是否為 0 到 9 的排列。check 函數用於驗證兩個數字是否滿足這個條件,它使用一個陣列 a 來記錄每個數字出現的次數,如果每個數字都恰好出現一次,則返回 true。如果找到符合條件的數對,則輸出結果,否則輸出 "There are no solutions for N."。

複雜度分析

  • 時間複雜度: O(90000 * 10) = O(900000)。因為需要遍歷 1234 到 99999 之間的數,並且 check 函數需要 O(10) 的時間。
  • 空間複雜度: O(10)。check 函數使用一個大小為 10 的陣列 a 來記錄數字出現的次數。

程式碼

#include <bits/stdc++.h>
using namespace std;
int a[15];        //存每個number出現的次數 

bool check(int c,int d){
    memset(a,0,sizeof(a));
    //判斷是否>5位
    if(d > 98765) return false;
    //判斷是否出現重複 
    for(int i = 0;i < 5;i++){       //需要循環5次,判斷每一位 
        a[c % 10]++;a[d % 10]++;
        c /= 10;d /= 10;
    }

    for(int i = 0;i < 10;i++){
        if(a[i] != 1) return false;
    }
    return true;
}

int main(void){
    int n,kase = 0;
    while(scanf("%d",&n) == 1 && n){
        if(kase++ > 0) printf("\n");

        bool flag = false;
        for(int i = 1234;i < 99999;i++){
            if(check(i,n * i)){
                printf("%05d / %05d = %d\n",n*i,i,n);
                flag = true;
            }
        }

        if(flag == false){
            printf("There are no solutions for %d.\n",n);
        }
    }   
    return 0;
}

Discussion