C++之數字計數演算法
1、問題
輸入n,m,求n~m範圍內的所有數字中,分別輸出0~9出現的總數是多少?
2、思路
列舉0在個十百千位上出現的次數
個:個位為0時,後面不需要考慮,只需考慮前面,因為0比4小,所以前面即使取到最大也不會過限,所以前面可以是1~203(因為當前位是0,所以前面不能是0)。一共203種。
十:十位為0時,前面取1~20,後面取0~9。一共123*10種。
百:百位為0時,因為0與當前位上限0相等,所以前面取1時,後面可以取0~99,前面取2時,後面只能取0~34。一共1*100+35種。
千位顯然不能為0,所以總數為0。 0和1~9要分開處理,是因為字首0的問題。因為當某一位取0時,前面部分的數是不能為0的,而取1~9是可以前面為0的。
把上述思想轉化為程式碼即可。
// NumberFrq.cpp : 定義控制檯應用程式的入口點。
//
#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <cmath>
#include <map>
using namespace std;
#define LL long long
LL p[20];
LL ans[10] = {};
void init()
{
p[0] = 1;
for (int i = 1; i < 18; i++)
p[i] = p[i - 1] * 10;
}
void solve(LL x, int f)
{
if (x == -1)
{
ans[0]++;
return;
}
for (int k = 1; k < 10; k++)
{
for (int i = 1; ; i++)
{
LL l = x / p[i];
LL r = x%p[i - 1];
LL now = x%p[i] / p[i - 1];
if (now > k)
ans[k] += (l + 1)*p[i - 1] * f;
else if (now == k)
ans[k] += (l*p[i - 1] + r + 1)*f;
else
ans[k] += l*p[i - 1] * f;
if (p[i] > x)
break;
}
}
for (int i = 1; ; i++)
{
LL l = x / p[i];
LL r = x%p[i - 1];
LL now = x%p[i] / p[i - 1];
if (now > 0)
ans[0] += l*p[i - 1] * f;
else
ans[0] += ((l - 1)*p[i - 1] + r + 1)*f;
if (p[i] > x)
break;
}
}
int main()
{
LL n, m;
init();
cin >> n >> m;
solve(m, 1);
solve(n - 1, -1);
for (int i = 0; i < 9; i++)
printf("%lld ", ans[i]);
printf("%lld\n", ans[9]);
return 0;
}
相關文章
- 統計位數為偶數的數字(C++)C++
- 開心檔之C++ 數字C++
- C++/C:數字轉成字串, 字串轉成數字C++字串
- C++數字訊號處理演算法庫SP++C++演算法
- 演算法 猜數字演算法
- ORACLE數字演算法Oracle演算法
- C++中的魔鬼數字C++
- 演算法 | 數字影像處理之「中值濾波」演算法
- 【c++】引用計數C++
- 每天一道演算法題系列十三之羅馬數字轉整數演算法
- Visual C++數字影象處理典型演算法及實現C++演算法
- 吸血鬼數字演算法演算法
- 1102:與指定數字相同的數的個數(C C++)C++
- C++搜尋與回溯演算法之Lake Counting(數湖)C++演算法
- C++列舉演算法之滿足條件的整數C++演算法
- 每日一道演算法:羅馬數字轉整數演算法
- 【美妙的Python之四】變數:數字、字串Python變數字串
- C++有理數類設計C++
- C++ 統計單詞數C++
- 演算法程式設計之美連續數之和等於某個數演算法程式設計
- c++中數字和字串的轉換C++字串
- visual C++數字影像處理類C++
- C++將數字轉為字串,並拼接C++字串
- python學習之數字Python
- 演算法數字轉化為字串演算法字串
- 使用CSS計數器美化數字有序列表CSS
- 數學之美:平方根倒數速演算法中的神奇數字 0x5f3759df演算法
- 力扣 1342. 將數字變成 0 的操作次數 C++力扣C++
- 演算法學習記錄十(C++)--->數值的整數次方演算法C++
- <數字IC設計> 實戰專案之GPIO埠設計 3
- L1-056 猜數字 (20分) C++C++
- 對金額數字擷取兩位小數的演算法演算法
- 數字設計ic晶片流程晶片
- 演算法題:刪除 K 位數字演算法
- 排序演算法__計數排序排序演算法
- JavaScript計數排序演算法JavaScript排序演算法
- 演算法之絕對眾數演算法
- HOME: Count Digits —— 計算字串中數字個數Git字串