关于蓝桥杯C语言卡片的问题

就是这个判断是否还有卡片的部分出错了
题目如下

img


我的思路是用temp放置i的值防止变动,zero用于判断卡片剩余数量是否为零,答案是3138,我跑出来是100,不知道为什么。

for(i=100;zero=0;i++){
    temp=i;
    while(temp){
      if(arr[temp%10]>0){
        arr[temp%10]--;
        temp=temp/10;
      }
      else{
        zero=1;
      }
    }
  }

完整代码如下:

#include 
#include 
int main(int argc, char *argv[])
{
  int arr[10]={2021},i,temp,zero=0;
  for(i=1;i<10;i++){
    arr[i]--;
  }
  for(i=11;i<100;i++){
    arr[i%10]--;
    arr[i/10]--;
  }
  for(i=100;zero=0;i++){
    temp=i;
    while(temp){
      if(arr[temp%10]>0){
        arr[temp%10]--;
        temp=temp/10;
      }
      else{
        zero=1;
      }
    }
  }
  printf("%d",i);    
  // 请在此输入您的代码
  return 0;
}

您的代码中存在一个问题:在判断卡片剩余数量是否为零时,使用的是赋值运算符“=”,而不是相等比较运算符“==”,导致变量zero始终为1,循环无法退出。

将“zero=0”修改为“zero==0”即可解决问题。另外,程序中似乎没有对剩余卡片数进行判断,如果全部用完了,也应该退出循环。可以在while循环内加上判断:

while(temp && !zero)

这样就能确保在剩余卡片数量为零时退出循环了。

修改后的完整代码如下:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int arr[10] = {2021}, i, temp, zero = 0;
for(i = 1; i < 10; i++) {
arr[i]--;
}
for(i = 11; i < 100; i++) {
arr[i % 10]--;
arr[i / 10]--;
}
for(i = 100; !zero && i <= 9999; i++) { // 加上剩余卡片数判断,最多遍历9999次
temp = i;
while(temp && !zero) { // 加上剩余卡片数判断
if(arr[temp % 10] > 0) {
arr[temp % 10]--;
temp /= 10;
}
else {
zero = 1;
}
}
}
printf("%d", i - 1); // 因为上面循环已经将i加1了,所以输出时需要减1
return 0;
}

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^