基准时间限制:1 秒 空间限制:131072 KB 分值: 5
难度:1级算法
给定一个十进制正整数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
从低位一步步往高位推
#include <stdio.h> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define CLR(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define LL long long int main() { int n; int t,tn; LL ans = 0; int mul = 1; scanf ("%d",&n); tn = n; while (tn) { t = tn % 10; if (t == 0) ans += n / (mul * 10) * mul; //高位数字 else if (t == 1) { ans += n / (mul * 10) * mul; ans += (n % mul) + 1; } else //只与高位有关 ans += (n / (mul * 10) + 1) * mul; mul *= 10; tn /= 10; // printf ("%lld\n",ans); } printf ("%lld\n",ans); return 0; }