当前位置: 移动技术网 > 移动技术>移动开发>Android > 1009 数字1的数量(思维)

1009 数字1的数量(思维)

2020年07月23日  | 移动技术网移动技术  | 我要评论
给定一个十进制正整数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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网