给定若干个四位数,求出其中满足以下条件的数的个数:个位数上的数字减去千位数上的数字,再减去百位数上的数字,再减去十位数上的数字的结果大于零。
【输入】
输入为两行,第一行为四位数的个数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,你可以按照以下步骤提取它的各个位数:
- 千位: 1345 ÷ 1000 = 1(商)
- 百位: (1345 ÷ 100)%10 = 3(取余)
- 十位: (1345 % 100) ÷ 10 = 4(先取余,再除以10的商)
- 个位: 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;
}