背景
有一种特殊偶数,它每一位上的数字都两两不相同。我们现在需要找出四位数中某一区间内的这类偶数。
输入
所要寻找的四位偶数的范围。每组输入有两个数字:第一个数字是最小范围;第二个数字是最大范围。如果输入遇到0,输入结束。
输出
列出此范围内的所有特殊偶数,并且列出此范围内特殊偶数的个数。
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 2 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
思路:
本题的难点在于多次(循环)输入完成后,一次性输入结果。这种循环输入其实很符合数组的输入方式,我们不妨建立一个二维数组来储存每次输入的两个数字。
写了循环,我们就要明确循环如何终止。我这里选择用for循环+flag1来判断输入何时终止。
使用数组中的数据时也要应用循环,我这里也用for循环+flag2来判断何时终止数据的使用:用到0了就停止,没用到就正常按流程走。别忘了打印计数器(ctr)的数据后让计数器归零,以便下次循环使用。
我这个二维数组最多只能输入五次,大家也可以按需多设置点。
#include <stdio.h>
int main()
{
int x, y, flag1 = 1, flag2 = 1, ctr = 0;
int arr[5][2];
for (x = 0; x < 5; ++x)
{
if (flag1 == 0)
{
break;
}
for (y = 0; y < 1; ++y)
{
scanf("%d %d", &arr[x][y], &arr[x][y + 1]);
if (arr[x][y] == 0 || arr[x][y + 1] == 0)
{
flag1 = 0;
break;
}
}
}
for (x = 0; x < 5; ++x)
{
if (flag2 == 0)
{
return 0;
}
for (y = 0; y < 1; ++y)
{
if (arr[x][y] == 0 || arr[x][y + 1] == 0)
{
flag2 = 0;
break;
}
else if (arr[x][y] >= arr[x][y + 1] || arr[x][y] <= 999 || arr[x][y + 1] > 9999)
{
printf("Error\n");
}
else
{
for (int j = arr[x][y] % 2 == 0 ? arr[x][y] : arr[x][y] + 1; j <= arr[x][y + 1]; j += 2)
{
if ((j / 1000) != (j / 100 % 10) && (j / 1000) != (j / 10 % 10) && (j / 1000) != (j % 10)
&& (j / 100 % 10) != (j / 10 % 10) && (j / 100 % 10) != (j % 10)
&& (j / 10 % 10) != (j % 10))
{
printf("%d ", j);
ctr++;
}
}
printf("\ncounter=%d\n", ctr);
ctr=0;
}
}
}
}