地址:http://acm.hit.edu.cn/judge/show.php?Proid=1018
思路:主要是利用BFS原理,先對給定的數(0~9)排序,然后利用這些數不斷構造整數(該整數可以很大很大,需要用char型數組保存),先是1位數,然后是2位數、3位數……直到找到n的最小倍數或者構造無法繼續為止。建立一個char型二維數組保存構造的整數來模仿隊列機制(如果直接使用隊列保存構造的整數,頻繁地對char型數組push和front將會導致超時),一個隊列保存構造的整數對n求余的結果(與前者同步),一個bool型數組作為余數是否重復的標識,如果余數重復將不保存該構造的整數及其相應余數。注意當n為0時不需構造,直接輸出0即可。
代碼:
#include <stdio.h>
#include 
<algorithm>
#include 
<queue>
#include 
<memory.h>
#include 
<string.h>

#define MAX_ROW 5000
#define MAX_COL 5000

using namespace std;

char data[MAX_ROW][MAX_COL];

int main()
{
    
int n, m;
    
int i;
    
int digits[10];
    
int pre, now;
    queue
<int> residue;
    
bool flag[5000], done;
    
int tmp1, tmp2, leng;
    
int num;
    
    
while(scanf("%d%d"&n, &m) == 2)
    
{
        
if(n == 0)
        
{
            printf(
"0\n");
            
continue;
        }


        
for(i = 0; i < m; i++)
        
{
            scanf(
"%d"&(digits[i]));
        }


        done 
= false;
        num 
= 0;
        pre 
= now = 0;
        sort(digits, digits 
+ m);
        memset(flag, 
0sizeof(flag));
        
while(residue.size() > 0)
        
{
            residue.pop();
        }

        residue.push(
0);

        
while(done == false && residue.size() > 0)
        
{
            num
++;
            tmp1 
= residue.front();
            residue.pop();
            
for(i = 0; i < m; i++)
            
{
                
if(num == 1)
                
{
                    
if(digits[i] != 0)
                    
{
                        tmp2 
= digits[i] % n;
                        data[now][
0= digits[i] + '0';
                        data[now][
1= '\0';
                        
if(tmp2 == 0)
                        
{
                            printf(
"%s\n", data[now]);
                            done 
= true;
                            
break;
                        }

                        
else if(flag[tmp2] == false)
                        
{
                            flag[tmp2] 
= true;
                            now 
= (now + 1% MAX_ROW;
                            residue.push(tmp2);
                        }

                    }

                }

                
else
                
{
                    tmp2 
= (tmp1 * 10 + digits[i]) % n;
                    strcpy(data[now], data[pre]);
                    leng 
= strlen(data[now]);
                    data[now][leng] 
= digits[i] + '0';
                    data[now][leng 
+ 1= '\0';
                    
if(tmp2 == 0)
                    
{                
                        printf(
"%s\n", data[now]);
                        done 
= true;
                        
break;
                    }

                    
else if(flag[tmp2] == false)
                    
{
                        flag[tmp2] 
= true;
                        now 
= (now + 1% MAX_ROW;
                        residue.push(tmp2);
                    }

                }
                
            }


            
if(num != 1)
                pre 
= (pre + 1% MAX_ROW;
        }

        
        
if(done == false)
        
{
            printf(
"0\n");
        }

    }


    
return 0;
}

在編程時遇到二維數組data[MAX_ROW][MAX_COL]設置過大導致Runtime Error的問題,查閱資料后得知是因為局部變量占用棧空間,導致棧空間不足。
解決辦法如下:
(1) 將局部變量改為全局變量
(2) 使用new或者malloc在堆上申請空間
(3) 在設置中提高運行棧的大小(project->settings->link->category,選擇output->reserve中設定棧大小,最小4Byte)