栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【算法】Aphelios会数数 (数位统计)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【算法】Aphelios会数数 (数位统计)

Aphelios这孩子打小就聪明,天生就会数数!
他从0开始数,一直数到n,然后这些数字排成一行,用火柴棒一笔一笔的摆出来,如图所示。现在给定n,Aphelios想知道他需要多少根火柴棒,才能够数到n。
由于Aphelios这孩子打小就聪明,所以他不屑于计算,现在请你帮他计算一下最终答案

输入格式:
单组测试数据,输入第一行为正整数n,n<=10^5

输入样例:
3
输出样例:
18

1、暴力出奇迹

这题暴力居然是满分,挺无语的

#include 
using namespace std;
int main()
{
	int n;
	int c[10] = {6,2,5,5,4,5,6,3,7,6}; 
	long long ans = c[0];
	cin>>n;
	for(int i=0;i<=n;i++){
		int t = i;
		while(t){
			int digit =  t%10;
			ans += c[digit];
			t /= 10;
		}
	}
	cout< 
2、数位统计经典例题修改 

统计位数是个经典题,力扣上有,《指offer》也有。
AcWing 338.计数问题 (类似整数中1出现的次数 数位统计DP C++)
关键理解图:

站在巨人肩膀上修改后:

#include 
#include 
using namespace std;

int cnt_digit(int n,int digit)
{
	int ans = 0, len = 0;
	if(digit == 0) ans =1; //火柴数从0开始计算
	int nt = n;
	while(nt) { //计算输入数字多少位
		len++;
		nt /= 10;
	}
	for(int j=0; jdigit) ans += p;	// 右边情况2:部分要
	}
	return ans;
}

int main()
{
	int n;
	cin>>n;
	long long sum = 0;
	int c[10] = {6,2,5,5,4,5,6,3,7,6};
	for(int i=0; i<=9; i++) { //不同数字出现次数
		sum += cnt_digit(n,i)*c[i];
	}
	cout<
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/303357.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号