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