求一个算法思路问题,关于倍数的问题,请高手们指点啊,谢谢

aboy85 2006-05-05 09:53:45
求倍数
问题描述
写一个程序,对于给定的一个自然数N(1≤N≤4999),和M个互不相同的十进制数字X1, X2,…,XM (M≥1), 找出N的一个最小的正倍数,使得该倍数中没有X1,X2,…,XM之外的其它数字。
输入
第一行为整数N,第二行为整数 M,接下来M行分别列出数字 X1,X2..XM 。

输出为这个倍数,如果无解输出0。在所有的测试数据中答案都不会超过500位。
输入样例

22
3
7
0
1

【输出样例】
110

我没想好思路,但我觉得应该把m个数先排列,从小到大



...全文
266 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
nobush 2006-05-05
  • 打赏
  • 举报
回复
不需要把m个数先排列
因为是数字 所以m不会超过十
我的想法是用一大小为10的数组 用x1,x2,..xm置位

m=10必定无解~
bbflyerwww 2006-05-05
  • 打赏
  • 举报
回复
好像在ACM编程题中看到过这道题目哦:)
不过没做过
可能用bfs来做(采用树结构实现,用k叉树)
楼上的显然不行
JoyerHuang_悦 2006-05-05
  • 打赏
  • 举报
回复
最直接的算法如下,不过,要算500位的话,太勉强了,
能不能把时间空间要要求也说一下,这是ACM的题目吧?

//##############################################################
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

int main(){
int n,ni,m=0,bit[10]={0,0,0,0,0,0,0,0,0,0};
int tmp,tmpbit,flag,i=1,j;

scanf("%d",&n); assert(n>=1 && n<=4999);

while(scanf("%d",&tmp) && !feof(stdin) ){
assert(tmp>=0 && tmp<=9);
++m;
bit[tmp]=1;}
ni = n;
while(ni<200000000){
flag = 0;
tmp = ni;
do{
tmpbit= tmp % 10;
tmp = tmp/10;
if (!bit[tmpbit]) {flag = 1;} } while(tmp!=0);
if (!flag) {
printf("%d\n",ni);
return 0;}
ni = n * (++i);}}

33,317

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧