题目内容:
有一种特殊偶数,它每一位上的数字都两两不相同。我们现在需要找出四位数中某一区间内的这类偶数。
输入格式:
所要寻找的四位偶数的范围。每组输入有两个数字:第一个数字是最小范围;第二个数字是最大范围。如果输入遇到0,输入结束。
输出格式:
列出此范围内的所有特殊偶数,并且列出此范围内特殊偶数的个数。
输入样例:
3000 3020
6040 6090
0 0
输出样例:
3012 3014 3016 3018
counter=4
6042 6048 6052 6054 6058 6072 6074 6078 6082 6084
counter=10
输入样例:
9 101
87 -1
0 0
输出样例:
Error
Error
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
const int LEN = 2296;
void decide(int left,int right)
{
int counter=0,i,digit[4],m,j,k,flag,special[2296]={0};//数组长度以变量为参数时有的编译器不能在声明时赋值
if(left<=right&&1000<=left&&right<=9999)
{
for(i=left;i<=right;i++)
{
if(i%2==0)
{
int ic=i;//复制i
memset(digit,0,4);//归零,也可以采用循环
for(m=0;m<4;m++)//存储各数位
{
digit[m]=ic%10;
ic/=10;
//if(ic==0)break;
}//退出循环时记录了m=4位数字
flag=1;
for(j=0;j<m-1;j++)//判断各数位是否相等
{
for(k=j+1;k<m;k++)
{
if(digit[j]==digit[k])
{
flag=0;
break;
}
}
}
if(flag==1)//存储特殊数
{
special[counter++]=i;
}
}
}
for(m=0;m<LEN;m++)//输出特殊数
{
if(special[m]!=0)
{printf("%d ",special[m]);}
else break;
}
printf("\n");
printf("counter=%d\n",counter);
}
else if(left==0&&right==0){;}
else printf("Error\n");
}
int main()
{
int left,right;
do{
scanf("%d %d",&left,&right);
decide(left,right);
}while(left*left+right*right!=0);
system("pause");
return 0;
}
这里我们将special数组长度定为2296,保证能存储完所有特殊偶数(一直有个保密样例过不了,猜测可能区间长度很大1000~9999共2296个特殊偶数,但这样也比较费内存)