欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

1009 数字1的数量(思维)

程序员文章站 2022-03-03 22:07:31
给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数。例如:n = 12,包含了5个1。1,10,12共包含3个1,11包含2个1,总共5个1。输入输入N(1 <= N <= 10^9)输出输出包含1的个数输入样例12输出样例5一个多位数21905:个位:它出现1的数为:1 ~ 21901,一共 2190 - 0 + 1 = 2191十位:它出现1的数为:1x ~ 2181x (x 从0到9)一共:(218 - 0 + 1)10 = 2190...

给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数。

例如:n = 12,包含了5个1。1,10,12共包含3个1,11包含2个1,总共5个1。
输入
输入N(1 <= N <= 10^9)
输出
输出包含1的个数
输入样例
12
输出样例
5
一个多位数21905:
个位:它出现1的数为:1 ~ 21901,一共 2190 - 0 + 1 = 2191
十位:它出现1的数为:1x ~ 2181x (x 从0到9)一共:(218 - 0 + 1)10 = 2190
百位:它出现1的数为:1xx ~ 211xx ,一共:(21 - 0 + 1)
100 = 2200
千位:它出现1的数为:1xxx ~ 11xxx 和 21000 ~ 21905 ,一共:(1 - 0 + 1)*1000 + (905 - 0 + 1)= 2000 + 906 = 2906
万位:它出现1的数为:1xxxx ~ 1xxxx,一共:10000
如果当前位是0或者大于1时,那么当前结果只与高位有关,如果是1的话,那么还要把低位的也考虑进去。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
 ios::sync_with_stdio(false);
 int n,t=1,sum=0,tmp;
 cin>>n;
 tmp=n;
 while(n)
 {
 	if(n%10==0) sum+=(n/10-1+1)*t;
 	else if(n%10>1) sum+=(n/10+1)*t;
 	else sum+=(n/10-1+1)*t+(tmp-n*t+1);
 	t*=10;
 	n/=10;
 }
 cout<<sum;
 return 0;	
}

本文地址:https://blog.csdn.net/weixin_43540515/article/details/107424764