神奇数

来源:互联网 发布:邯郸中国网络菜市场 编辑:程序博客网 时间:2024/04/26 07:51
给出一个区间[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 5int 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;否则返回0int 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的情况给覆盖了,从而丢掉了一些“神奇数”。
原创粉丝点击