地址:
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)