地址:
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, 0, sizeof(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)