神奇数

给出一个区间[a, b],计算区间内“神奇数”的个数。
神奇数的定义:存在不同位置的两个数位,组成一个两位数(且不含前导0),且这个两位数为质数。
比如:153,可以使用数字3和数字1组成13,13是质数,满足神奇数。同样153可以找到31和53也为质数,只要找到一个质数即满足神奇数。 
输入描述:
输入为两个整数a和b,代表[a, b]区间 (1 ≤ a ≤ b ≤ 10000)。


输出描述:
输出为一个整数,表示区间内满足条件的整数个数

输入例子:
11 20

输出例子:
6


代码如下:
#include <stdio.h>
#include<math.h>
#define SIZE 5
int prime(int );
int magnum(int * , int );
int judge(int *, int );

int main()
{
    int a,b;
    int numa[SIZE];
    int count = 0;
    int ni;
    
    scanf("%d %d", &a, &b);
    while(a<=b){
        ni=magnum(numa, a);
        count += judge(numa, ni);
        a++;
    }
    printf("%d\n",count);
    return 0;
}


//取各位数放入一个数组
int magnum(int array[],int orig)
{
    int i=0;
    while(orig){
        array[i++] = orig % 10;
        orig /= 10;
    }
    return i;
}

//判断质数
int prime(int number)
{
    int i;
    if(number > 10){
        for(i = 2;i <= sqrt(number);i++){ //注意:这里是sqrt
            if(number % i == 0)
                return 0;
        }
        return 1;
    }
    else
        return 0;
}
//判断所构成的两位数是否是质数,如果是质数,则返回1;否则返回0

int judge(int array[], int n)
{
    int i,j,t = 0;
    for(i = 0; i < n-1; i++){
        for(j = i+1; j < n; j++){
            if(array[i] * array[j]){
                t = prime(array[i] * 10 + array[j])|
                    prime(array[j] * 10 + array[i]);
            }
                if(t)
                    return 1;
        }
    }
    return 0;
}

编好后运行时发现比正确个数少,找了好长时间,一直没找出来问题出在哪。后来才发现judge函数中用穷举时内层的for循环没有把if(t) return 1;包括进来,导致内层循环一次的过程中,即使中间某一次满足 t=1,  也被这次内层循环结束后t=0的情况给覆盖了,从而丢掉了一些“神奇数”。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值