给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数。
例如:n = 12,包含了5个1。1,10,12共包含3个1,11包含2个1,总共5个1。
Input
输入N(1 <= N <= 10^9)
Output
输出包含1的个数
Input示例
12
Output示例
5
题目简单易懂就不多作解释了,下面说一下大体思路
把每个数拆分 用123来举例
个位:出现了13次1(1 11 21···91,101 111 121)
十位:20次 (10-19 110-119)
百位:24次(100-123)
细心的聚聚们可能已经发现了规律
把当前位数分为三类:
如果小于1:则出现1的次数只与更高位有关
如果等于1:和更高位,低位都有关
如果大于1: 只与更高位有关
这里的高位与低位不是指那一位,而是当前位之前的数和之后的数
举个例子:1234
拿百位来说 高位是1 而低位是34不是3!!!!
下面贴上蒟蒻的代码
#include<bits/stdc++.h>
using namespace std;
int N,t1,t2,t3,num;
int main()
{
ios::sync_with_stdio(false);
cin>>N;
int temp=1;
while(N/temp!=0)
{
t1=N/(temp*10);//计算更高位
t2=(N/temp)%10;//计算当前位置
t3=N-(N/temp)*temp;//计算低位
if(t2==1)
{
num=num+t1*temp+t3+1;
}
else if(t2>1)
{
num=num+(t1+1)*temp;
}
else if(t2<1)
{
num=num+t1*temp;
}
temp=temp*10;
}
cout<<num<<endl;
return 0;
}