给出一个区间[a, b],计算区间内“神奇数”的个数。
神奇数的定义:存在不同位置的两个数位,组成一个两位数(且不含前导0),且这个两位数为质数。
比如:153,可以使用数字3和数字1组成13,13是质数,满足神奇数。同样153可以找到31和53也为质数,只要找到一个质数即满足神奇数。
神奇数的定义:存在不同位置的两个数位,组成一个两位数(且不含前导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的情况给覆盖了,从而丢掉了一些“神奇数”。