举报

C 语言蓝桥杯:在 1 至 2020 中,有多少个数的数位中包含数字 9?

0

【问题描述】在 1 至 2020 中,有多少个数的数位中包含数字 9?

注意,有的数中的数位中包含多个 9,这个数只算一次。
例如,1999 这个数包含数字 9,在计算只是算一个数。
编程求解。

我的错误代码如下

#include <stdio.h>

int main()
{
	int i = 1, y = 0, z = 0;
	for (i = 1; i <= 2020; i++)
	{
		while (i)
		{
			if (9 == i % 10)
			{
				y++;
			}
			i /= 10;
		}
		if (y >= 1)
		{
			z++;
		}
	}
	printf("包含9的数有%d个", z);
	return 0;
}
ava
陳以卿

2020-9-4

举报
0

①int abs, nbs = 0,cbs;
for (abs = 1; abs < 2021; abs++)
{ if (abs >= 9 && (abs - 9) % 10 == 0)      
{ printf("%d ", abs);        
nbs++;        
}
} printf("\n2020个数中包含9的数字一共有 %d 个\n",nbs );
② for (abs = 1; abs < 2021; abs++)
{ cbs = abs;

  int jss = nbs;   
  while (cbs >= 9)  
  {   if ((cbs - 9) % 10 == 0)      
      { if (jss == nbs)

           printf("%d ", abs);  

        nbs++;                
       }        
      cbs /= 10;    
  }
} printf("\n2020个数中每个数中包含9的个数一共有 %d 个\n", nbs);

ava
Quinlan

2020-9-9

举报
2

 i/=10;这里炸了,无限除以10导致无限循环,应该整一副本的

而且每循环一次,y没有复位,导致第一个有9的数之后全部都被判定为“有9的数”

讲讲正解,这是组合数学的模板题

首先考虑1-1999的情况:

因为数字不超过2020,故千位不可能为9

于是这样考虑:

千位小于2,有2种情况,即0或1

然后我们分百、十、个三种情况讨论:

当百位为9,有21010=200种情况

当十位为9,有2910=180种情况

当个位为9,有299=162种情况

再考虑2000-2020,易得有2种情况

则总共有200+180+162+2=544种

附修改好的代码:

#include <stdio.h>
int main(){
	int i=1,y=0,z=0;
	for (i=1; i<=2020; i++) {
		int j=i;
		y=0;
		while(j) {
			if (9==j%10) {
				y++;
				break;
			}
			j/=10;
		}
		if(y) {
			z++;
		}
	}
	printf("包含9的数有%d个",z);
	return 0;

}
ava
无名氏

2020-9-4

技术讨论社区