OR148. 好奇的薯队长
描述
输入描述
正整数n(0<n<=2147483647)输出描述
从1到n(包括n)的所有整数数字里含有多少个1示例1
输入:
1
输出:
1
示例2
输入:
13
输出:
6
说明:
从1到13(包括13)有13个数字,其中包含1的数字有1,10,11,12,13,这些数字里分别有1,1,2,1,1个1,所以从1到13(包括13)的整数数字中一共有1+1+2+1+1=6个1C++ 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2020-07-07
#include<bits/stdc++.h> using namespace std; int main() { int n; cin>>n; long ans = 0; int left, right = 0, idx = 0, cur = 0; while(n) { cur = n % 10; left = n/10; if(cur == 0){ ans += left*pow(10, idx); }else if(cur == 1){ ans += left*pow(10, idx) + right + 1; }else{ ans += (left + 1)*pow(10, idx); } right += cur*pow(10, idx); n /= 10; idx ++; } cout<<ans; return 0; }
C 解法, 执行用时: 2ms, 内存消耗: 332KB, 提交时间: 2022-04-01
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdbool.h> int dd[11] = {0}; int ddd[11] = {0}; int main() { int n; scanf("%d", &n); if (n < 10) { printf("1"); return 0; } dd[1] = 1; ddd[0] = 1; //10 ^ 0; int base = 1; for (int i = 1; i < 10; i++) { dd[i] = i * base; base *= 10; ddd[i] = base; //printf("%d\n",dd[i]); } int c = 1; int h = 0; int hs[11] = {0}; hs[0] = n % 10; int t = n / 10; while (t > 0) { hs[c] = t % 10; t = t / 10; c++; } long res = 0; for (int j = c - 1; j >= 0; j--) { int tmp = hs[j]; //printf("%d-%d\n",tmp,j); for (int k = 0; k < tmp; k++) { res += dd[j]; if (k == 1) { res += ddd[j]; } } //printf("res=-%d\n",res); if (tmp == 1) { int t = 0; //printf("%d-%d\n",t,j); for (int m = j - 1; m >= 0; m--) { t = t * 10 + hs[m]; } //printf("t===%d\n",t); res += t + 1; } } //printf("%d,%d",c,res + 1); printf("%ld", res); }