Bootstrap

[C/C++入门][for]26、统计满足条件的4位数(循环经典练习)

给定若干个四位数,求出其中满足以下条件的数的个数:个位数上的数字减去千位数上的数字,再减去百位数上的数字,再减去十位数上的数字的结果大于零。

【输入】

输入为两行,第一行为四位数的个数n,第二行为n个的四位数。(n<=100)

【输出】

输出为一行,包含一个整数,表示满足条件的四位数的个数。

【输入样例】

5
1234 1349 6119 2123 5017

【输出样例】

3

我们解决这个编程问题,其实可以回忆一下我们之前学的三位数倒置,可以从数学的角度来解析这个问题——如何从一个四位数中分别提取千位、百位、十位和个位的数字,我们可以使用基础的除法和乘法概念。

数位的概念

首先,我们需要了解数位的概念。在十进制系统中,每个位置代表不同的数值。例如,在数字1345中:

  • 5是在个位,代表的是5个1;
  • 4是在十位,代表的是4个10,即40;
  • 3是在百位,代表的是3个100,即300。
  • 1是在千位,代表的是1个1000,即1000。

如何提取每一位的数值

当我们想要从一个四位数中提取各个位的数值时,我们可以使用除法和模运算(也就是取余数)。

提取千位数

为了提取千位上的数字,我们需要看这个数除以1000的商是多少。例如,如果我们有数字1345:

  • 我们用1345除以1000得到1(忽略掉小数部分,因为我们只关心整数部分),所以千位上的数字是3。
提取百位数

为了提取百位上的数字,我们需要看这个数除以100的商是多少。例如,如果我们有数字345:

  • 我们用1345除以100得到13(忽略掉小数部分,因为我们只关心整数部分),
  • 然后再对13取余10,得到3
  • 所以百位上的数字是3。
提取十位数

提取十位上的数字稍微复杂一点,我们需要先去除百位的影响,然后再看剩余部分除以10的商是多少。还是以数字1345为例:

  • 我们先用1345对100取余数,得到45(这是因为45是345去掉百位后剩下的部分);
  • 接着,我们用45除以10得到4(同样只关注整数部分),所以十位上的数字是4。
提取个位数

提取个位上的数字是最简单的,我们只需要用原来的数对10取余数即可。还是以数字345为例:

  • 我们用1345对10取余数,得到5,所以个位上的数字是5。

所以,如果你有一个三位数,比如345,你可以按照以下步骤提取它的各个位数:

  1. 千位: 1345 ÷ 1000 = 1(商)
  2. 百位: (1345 ÷ 100)%10 = 3(取余)
  3. 十位: (1345 % 100) ÷ 10 = 4(先取余,再除以10的商)
  4. 个位: 345 % 10 = 5(取余)

这些步骤使用了基本的数学运算,特别是除法和取余数,通过这种方式,我们可以轻松地从任意四个位数中提取出各个位的数值。

循环取数法

每次循环 a变为除以10,循环中取a%10,也就是余数,当a为0时循环结束。

例:输入一个整数,从低位到高位输出其各位数字,并用空格分隔,代码为:

int n;
cin>>n;
for(int a = n; a > 0; a /= 10)
	cout<<a % 10<<endl;

解题

#include<iostream>
using namespace std;
bool isOk(int n)//数字n是否是满足条件的数字
{
    int d = n % 10;//先取出个位
    n /= 10;
    while(n > 0)
    {
        d -= n % 10;//n % 10是当前的个位
        n /= 10;
    }
    return d > 0;
}

int main()
{
   int n, s = 0;//s:满足条件的数字个数
   cin>>n;
   for(int i = 0; i < n; ++i)
   {
        int a;
        cin>>a;
        if(isOk(a))
            s++;
   }
   cout<<s;
   return 0;
}

;