统计——sprintf的使用和三位数的拆分

统计——sprintf的使用和三位数的拆分

题目描述

在数字王国中,有900多种三位数。他们都是由三个数字组成,且最高位不为零。其中有很多种是:三个数中有两个是相同的数字。例如:112、121、211……
现给出N个三位数,请你统计出有多少个是两个数字相同的三位数。

输入

输入数据有两行。
第一行只有一个数N(1<=N<=100000)
第二行有N个三位数,每个数有一个空格隔开。

输出

输出只有一个数,即统计出有多少个是两个数字相同的三位数。

样例输入

5
123 113 111 442 113

样例输出

3

题解/思路

法一:题意均为三位数,则就是简单的字符串和数字之间的转化和运用,将读入的数字转化为一个一个的字符,再比较三个字符中是否存在“三个数中有两个数相同”,使用一个计数器即可。
*不会使用sprintf的,请参考上篇文章《幸运数字》的转载博客,有sprintf用法详解

法二:不使用sprintf,直接对输入的三位数用除法和取模拆分,分别得到个十百三位数,再比较三个字符中是否存在“三个数中有两个数相同”,使用一个计数器即可。

代码

法一:

#include <bits/stdc++.h>

#define N 100000

using namespace std;

int main()
{
    
    
    int n,i,j,num[N];
    int count=0;
    char str[1000]={
    
    '0'};//定义一个字符串数组
    cin>>n;
    for(i=0;i<n;i++)
    {
    
    
        cin>>num[i];//定义一个数字数组
        sprintf(str,"%d",num[i]);//将数字数组输出到字符串数组中,进行一个转化
        for(j=0;j<3;j++){
    
    
            if(str[j]==str[j+1]||str[j]==str[j+2]||str[j+1]==str[j+2])
                count++;
                break;
        }
        //排除三位数均相同的情况
        for(j=0;j<3;j++){
    
    
            if(str[j]==str[j+1]&&str[j]==str[j+2]&&str[j+1]==str[j+2])
                count--;
                break;
        }
    }
    printf("%d",count);
    return 0;
}

法二:

#include <bits/stdc++.h>

#define N 100000

using namespace std;

int main()
{
    
    
    int n,i,num[N];
    int count=0;
    cin>>n;
    for(i=0;i<n;i++)
    {
    
    
        cin>>num[i];//定义并读入数字数组,即存入三位数的每一位
        int a=num[i]%10;//个位数
        int b=num[i]/10%10;//十位数
        int c=num[i]/100;//百位数
        if(a==b||a==c||b==c)
            count++;
        //排除三位数均相同的情况
        if(a==b&&a==c&&b==c)
            count--;
    }
    printf("%d",count);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_51344172/article/details/110039120