经典例题(c语言):计数问题,计算从1到n内数字x的个数(事无巨细,逻辑清晰,相信小白都可以看明白)

1.代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int n =0;
    int x = 0 ; 
	int i = 0; 
	scanf("%d %d", &n, &x);
	int tool = 0;
	int count = 0; 
	for (i = 1; i <= n; i++) 
	{
	     tool = i;
		while (tool > 0) 
		{                          
			 
			if (tool%10 == x)
			{
				count++;
			}
			tool = tool / 10;   
		}                           
	}
	printf("%d", count);
	return 0;
 }

2.大致思路

a.先用for循环将我们需要的范围输出,然后再输入一个我们想要寻找的数字(x)

b.将范围内的数字顺着for循环(依次)取出

c.然后将这个被取出的数字与我们想要找的数字(x)进行取模,如果取的模和我们想要找到的数字相同,那么这个数字便是我们要找的数字,可以设定一个变量count用于计数.

d.上述步骤只是对一个数字的各位进行了判断,我们又如何去判断一个数字的十位,百位甚至是千位呢...这个时候我们便要想办法将已经判判断好的数字删除,可以使用"\"运算符将已经判断的位数删掉.

3.具体思路

3.1

题目的要求是这个数字从一开始,所以我们设置一个变量n来表示它的上限,然后再设置一个变量x来存储我们要找的数字.

int n;int x;

3.2

要把这个范围内的数字全部生成出来,以方便程式对它的调用,于是我们可以使用for循环

int i;

for (i = 1; i <= n; i++)

{

}

3.3

为了判断这个数字里面是否有我们需要的数字,众所周知,while近乎为if的循环使用,所以这里我们使用一个while循环

3.4 重点!!!这个工具人变量到底是个什么东西

for (i = 1; i <= n; i++)//将范围内的所有数字生成
    {
         tool = i;
        while (tool > 0)//在整个for循环中,如果这里不使用tool这个变量来存储i的值,直接用i进行计算,那么i的值就会发生变化,当我们用这个已经被改变的i继续进行下一次for
        {                        //循环的时候,for的判定和调整都会发生改变,因为我们是用i来生成我们所需要的范围的,所以,如此一来,我们最初设定的范围就会发生改变,从而无法达到
            int c = tool % 10;//我们需要的预期的效果

            if (c == x)
            {
                count++;
            }
            tool = tool / 10;//所以,我们需要一个容器(这里的tool)将i的值顺着for循环依次取出,并且判断,这样既可以将范围内的数字进行一一判断,又可以不改变原先的范围内的
        }                           //数字,从而达到最初的目的
    }

这个工具人变量到底是什么?!

既然这里使用了tool=i,为什么不可以将while(tool>0)直接改成while(i>0)?!

这是多次一举吗,为啥把这段代码删掉我的程式又跑不起来,好困惑!!!

我相信很多人看到这里看懵逼了ヽ(*。>Д<)o゜

不要紧,且听我细说我相信小白都可以看得懂

3.4.1 此处开始解决你的问题

首先,不妨我们试试,如果我们就不使用这个所谓的工具人变量(tool),就直接将i硬怼进去,顺着for循环,看看会发生什么:

第一步:while(i>0)开始循环

第二步:int c = i % 10;到这里,变量c因为i的变化变成了一个新的值,但此时的i并没有发生变化,仍然是while循环刚开始的那个最初的i

第三步:

if (c == x)
            {
                count++;
            }

这里是判断有没有要找的数的,与i没有直接关系,可以跳过此处的分析

第四步:

  i = i / 10

到这里,开始出问题了,i被除以了10;它的最低数位没了,此时的i发生了真正的改变

第五步:

然后,我们拿着这个真正已经被改变的i再继续进行下一次的for循环,for (i = 1; i <= n; i++),但是,刚才我说了,for和i组合是为了生成范围,在进行第二次的for循环的时候我们的i被已经被改变了,所以这个范围也随之发生了变化,不是我们想要的范围的.这便是为啥不能直接将i硬生生地怼进去.

3.4.2 解决方案

由此,我们的目的是既可以将范围中的数字一一拿出来进行对比,计算,又可以保证我们想要的这个范围及其里面的数字不发生任何变化,所以我们需要一个容器,将范围内的数字复制出来用,这个容器便是tool.

或者说是我们设置了一个tool变量将i所生成的原有的范围保护起来了.

结尾:已经尽我所能将问题讲的明白,如若还有疑惑,请在评论区留言,谢谢╰( ̄ω ̄o).

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值