求教一道c语言的题目 感激不尽

小明的密码由N(1<=N<=12)个数字构成,每个数字都可以是0至9中任意一个数字,但小明的密码还有一个特点就是密码中连续的M(1<=M<=4)个数字的和是质数,现给定M... 小明的密码由N(1<=N<=12)个数字构成,每个数字都可以是0至9中任意一个数字,但小明的密码还有
一个特点就是密码中连续的M(1<=M<=4)个数字的和是质数,现给定M和N,求满足条件的密码共有多少
个?

输入格式
第1行是T,case数量,此后T行,每行两个数,N和M

输出格式
每个case输出一个满足条件的密码总数

输入样例
2
1 1
2 1

输出样例
4
16

求代码
输入 3 1 ,输出64,输入 4 1,输出64
展开
 我来答
foever荒城
2015-06-28 · 超过14用户采纳过TA的回答
知道答主
回答量:69
采纳率:0%
帮助的人:38.7万
展开全部
#include<stdio.h>
#include<math.h>
#include<string.h>
int n,m,cnt;
int prime[45];
void Selectprime()
{//该函数用于选择素数,prime[i]=1,i为质数,否则不为质数
    memset(prime,0,sizeof(prime));
    int s,flag,i,j;
    for(i=2; i<45; i++)
    {
        flag=0;
        s=sqrt(i);
        for(j=2; j<=s; j++)
            if(i%j==0)
            {
                flag=1;
                break;
            }
        if(!flag)
            prime[i]=1;
    }
}
int Judge(int* a,int pos)
{//判断a数组中pos之前m个数的和是否为质数
    if(pos<m-1)return 1;
    int sum=0;
    int i,j=pos-m+1;
    for(i=pos; i>=j; i--)
        sum+=a[i];
    return prime[sum];
}
void Fill(int* a,int cur)
{
    int i;
    if(cur==n)
    {
        cnt++;
        return ;
    }
    for(i=0; i<=9; i++)
    {
        a[cur]=i;
        if(!Judge(a,cur))
            continue;
        Fill(a,cur+1);
    }
}
int main()
{
    Selectprime();
    int c;
    int a[20];
    scanf("%d",&c);
    while(c--)
    {
        cnt=0;
        scanf("%d%d",&n,&m);
        Fill(a,0);
        printf("%d\n",cnt);
    }
    return 0;
}
更多追问追答
追问
不好意思,您的代码答案是正确的,可是oj提示我超时了,请问能不能把你的代码改一下呢,谢谢,拜托了,或者修改成打表的形式呢
追答
int main()
{
    Selectprime();
    int res[13][5];
    int a[20];
    memset(res,0,sizeof(res));
    for(int i=1;i<=12;i++)
    {
        for(int j=1;j<=4;j++)
        {
            cnt=0;
            n=i;
            m=j;
            Fill(a,0);
            res[i][j]=cnt;
        }
    }
    int c;
    scanf("%d",&c);
    while(c--)
    {
        scanf("%d%d",&n,&m);
        printf("%d\n",res[n][m]);
    }
    return 0;
}
//打表的,好像也超时吧..
袁世平1
2015-06-28 · TA获得超过536个赞
知道小有建树答主
回答量:459
采纳率:0%
帮助的人:387万
展开全部
#include<cstdio>
#include<cstring>
#include<cmath>

using namespace std;

int in(){ //读入优化 ,加快读入速度 
int x=0;char ch=getchar();
while(ch>'9' || ch<'0') ch=getchar();
while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
return x;
}

#define maxn 101

int n,m,ans;
int a[maxn];
bool no_prime[maxn];

void get_prime(){ //筛选法求素数 
int x=sqrt(maxn);
no_prime[1]=no_prime[0]=true;
for(int i=2;i<=x+1;i++)
if(!no_prime[i])
for(int j=i*i;j<=maxn;j+=i)
no_prime[j]=true;
}

void prework(){
    n=in();m=in();ans=0;
}

void dfs(int t){
if(t>n){ //如果到达n位说明构造成功 
ans++;
return;
}
int sum=0;
if(t>=m)
for(int i=t-1;i>=t-m;i--)
sum+=a[i]; //计算前 m-1位的值 
for(int i=0;i<=9;i++)
if(!no_prime[sum+i]){ //如果加上这一位是一个质数才向下遍历 
a[t]=i;
dfs(t+1);
}

}

void mainwork(){
dfs(1); //从第一位开始枚举,深度优先搜索 
printf("%d\n",ans);
}

int main(){
//freopen("x.in","r",stdin);
int T=in();
get_prime();
while(T--){
     prework();
     mainwork();
}
    return 0;
}
追问
不好意思,您的代码好像有个问题,输入 3 1 的话,有64种,输入为4 1的情况,应该输出256种,可是您的代码输出是61 和233种,能不能把你的代码再改一下呢,谢谢拜托了,感激不尽!!!
追答
程序39行....
        for(int i=t-1;i>t-m;i--) //sorry这里多算了一位,将>=改成> 就好啦
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式