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).