统计——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;
}