[LGOJ] 题解 P1980 【计数问题】

意概述
试计算在区间 1到 n 的所有整数中,
数字 x(0 ≤ x ≤ 9)共出现了多少次?
例如,在 1到 11中,即在 1,2,3,4,5,6,7,8,9,10,11中,数字 1 出现了 4 次。

输入格式:
2个整数n,x,之间用一个空格隔开。

输出格式:
1个整数,表示x出现的次数。

本题使用snprintf解决

snprintf 传入四个参数
  1. 要写入的字符数组
  2. 数组大小(一般用sizeof(ch)
  3. 要转的数的格式(和printf()类似)
  4. 要转的数
该函数常用来快捷的 将数转存于字符数组中,方便好用

再将数转为字符数组后,一位一位的判就AK

#include<bits/stdc++.h> 
#define ll long long 
using namespace std;
//int 似乎会爆 (逃)
ll n,tot=0;
ll x;
int zh(ll a)
{
	//以字符数组形式存储一个数
    char ch[10];
    memset(ch,'0',sizeof(ch));
    //将%lld形式的a自动写入字符数组
    snprintf(ch,sizeof(ch),"%lld",a);
    ll sum=0;
    //统计符合的个数
    for(int i=0;i<strlen(ch);i++)
    if(ch[i]==x+'0') sum++;
    return sum;
}

int main()
{
	//输入
	cin>>n>>x;
    for(int i=1;i<=n;i++)
	tot+=zh(i); //总个数加上当前数i中x的数量
	cout<<tot;//输出
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值