这个题考察对数组内元素是否相同的判断,我有两种思路
一:桶装数字,出现一次记一次
优点在于简单易懂
最容易出错的点在于循环内变量的重定义
#include<stdio.h>
int main()//桶装法,用0到9的数组记录数字出现次数,试试看
{
int i, n, x, y, a, t;
scanf("%d %d", &y, &n);
for (x = 0;; x++)
{
int arr[10] = { 0 };
int j = 0;
t = y;//中间变量
//很重要的一点:数组,计数器j,中间变量t要重定义!!!
for (i = 0; i < 4; i++)//统计
{
a = t % 10;
t = t / 10;
arr[a] += 1;//某一个数字出现,则在数组相应位置+1
}
for (i = 0; i < 10; i++)
{
if (arr[i] >= 1)
j++;
}
if(j==n)
{
printf("%d %04d", x, y);
break;
}
y++;//for循环里找不到好位置干脆放最后了
}
return 0;
}
二:进行循环比较
这个不太好理解,但是理解了后也挺简单的,不容易出错。
适合较少位数的判断,不只限于数字,如果位数多的话,得考虑再加一个循环。
#include<stdio.h>
int main()
{
int x, n, y = 0;
int t, i;
int a = 1;
int arr[4];//长度为四的数组接受四个数字
scanf("%d %d", &y, &n);
for (x = 0;; x++)
{
t = y;//中间变量
a = 1;//重定义!!!
for (i = 0; i < 4; i++)//拆分数位到arr[]
{
arr[i] = t % 10;
t = t / 10;
}
//让arr[0]与123比较。全都不同说明至少有两个不同数字(第一位与234其中一位,因为不确定234位数是否重复)
//让arr[1]与23比较。对234位做进一步比较,全都不同说明又出现了一个
//让arr[2]与3比较,再加一个
if (arr[0] != arr[1] && arr[0] != arr[2] && arr[0] != arr[3])
a++;
if (arr[1] != arr[2] && arr[1] != arr[3])
a++;
if (arr[2] != arr[3])
a++;
if (a == n)
{
printf("%d %04d\n", x, y);
break;
}
y++;
}
return 0;
}