首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

求解一个题。该如何处理

2012-11-07 
求解一个题。。Sramoc问题描述Sramoc ( K , M ) 表示用数字0、1、2…、K-1组成的自然数中能被M整除的最小数。给定

求解一个题。。
Sramoc问题

描述

Sramoc ( K , M ) 表示用数字0、1、2…、K-1组成的自然数中能被M整除的最小数。给定 K、M,求Sramoc ( K,M )。例如 K=2,M=7的时候,Sramoc( 2 , 7 ) = 1001。

输入

第一行为两个整数K、M满足2<=K<=10、1<=M<=1000。

输出

输出Sramoc(K,M)。

样例输入

2 7

样例输出

1001

C/C++ code
#include <stdio.h>int Sramoc(int k,int m){    int l,rlt;    int r[6]={0,0,0,0,0,0};    while(1){        for(l=0;l<6;l++){            if(++r[l]<k) break;            r[l]=0;        }        rlt=r[0]+r[1]*1e1+r[2]*1e2+r[3]*1e3+r[4]*1e4+r[5]*1e5;        if(rlt%m==0) return rlt;    }    return -1;}void main(){    int k,m;    scanf("%d %d",&k,&m);    printf("%d",Sramoc(k,m));}


总是结果错误。。大神们帮忙解决一下啊

[解决办法]
你想得太简单了,这个要用到dfs和哈希表!
看这里吧
http://blog.sina.com.cn/s/blog_9aa2786a0101b88z.html
[解决办法]
嗯,2楼正解。代码如下:
C/C++ code
因为不确定位数,所以最好用广搜。另外,为了避免诸如超空间、超时之类的问题,有如下处理方法:    1:队列维护三个值,最后一位的数字,当前的余数,还有就是其前趋。    2:开一个哈希表:hash[i][j]表示尾数为i,余数为j是否出现过。    这样就能极大地减小枚举量。因为这样做的话,如果尾数一样余数也一样,就等于做了无用功,重复入队了。这样就能极大地减少无效状态。    一旦出现第一个余数为0的,就直接输出,结束。    Code:#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>using namespace std; int k,m;struct point{       int x,mod,f;       }q[5000000];bool hash[10][1000];      void dfs(int x){     if (x==-1)  return;     dfs(q[x].f);     printf("%d",q[x].x); } int main(){    freopen("sramoc.in","r",stdin);    freopen("sramoc.out","w",stdout);    scanf("%d%d",&k,&m);       int l=0,r=0;    for (int i=1; i<k; i++)    {        q[r].x=i;  q[r].f=-1;  q[r++].mod=(i % m);        hash[i][(i % m)]=1;        if (!(i % m))        {            printf("%d\n",i);            fclose(stdin);            fclose(stdout);            exit(0);                }    }       while (l<r)    {        point tmp=q[l++];        for (int i=0; i<k; i++)        {            point now=tmp;            now.x=i;  now.f=l-1;  now.mod=(tmp.mod*10+i)%m;            if (!hash[now.x][now.mod])            {                q[r++]=now;                hash[now.x][now.mod]=1;                                      }                                                 if (!now.mod)            {                dfs(r-1);                printf("\n");                fclose(stdin);                fclose(stdout);                exit(0);                         }        }          }return 0;} 

热点排行