借他人的代码走了一遍,结构正确了,但发现思路或许有误,只是恰巧正确
回想解题过程,总结道理(对于此题是总结了刷题的作用之一)和方法(猜想了一套解题思路方法,即熟悉或具象出考察点名称,并对各个考察点【有具体名称,如枚举、取整数每一位上的数字、计数...这题中我用数组对应数字的方法把计数的压力变小变好理解了】进行分析,从而使考点具象化,可以使解题思路清晰
int main()
{
int a[10] = { 2021,2021,2021,2021,2021,2021,2021,2021,2021,2021 };
int i, t, q;
for (i = 1; ;i++)
{
for (t = i; t != 0;)
{
q = t % 10;
if (a[q] <= 0)
{
i--;
goto end;
}
a[q]--;
t = t / 10;
}
}
end:printf("%d", i);
return 0;
我这里下标q不用减1,因为刚好十进制0~9和下标0~9分别对应了~
i当枚举的数,因为要对i进行运算,而i得本身不能受干扰,为便操作,每次运算时,将t作为i的替身,便避免了只用i(即用i进行计算,代替上面代码中的t,减去关于t的for(){}),若需要调试时会看到 i值变来变去 的乱象(理论上我猜可以只用i,不过我还没尝试过实际可行性),使调试变得麻烦。
一个是用count记次执行数+1赋给i,要再跳出循环前注意赋 i=count-1;这个细节,因为值一层for,跳出用break或goto都行,输出 i 的值
一个是用t作替身进行运算,计数(计当所拼整数值达到i时0~9各数的剩余)并比较,因为两层for,应该只能用goto跳出循环后精确落点的特性,输出i-1的值