统计数字问题递归法

统计数字问题,我个菜鸡想不出递归法只能借鉴别人的思路。。

#include
#include
using namespace std;

//method1
//时间复杂度太大,一般的计算机无法满足10^9
void Solution1() {

int n;

cin >> n;

int nums[10] = { 0 };


for (int i = 1; i <= n; i++) {

	int j = i;

	while (j != 0) {

		nums[j % 10]++;
		j = j / 10;
	}
}

for (int i = 0; i < 10; i++) {

	cout << nums[i] << " ";
}

cout << endl;

}

//method2 这种方法妙啊

int nums[10];

void Solve(int n) {

//第一步计算数字n的位数
int len = log10(n) + 1;

//第二部计算区间数,也是最高位的值
int p = n / int(round(pow(10.0, len - 1)));

for (int i = 0; i < 10; i++) {

	// (len - 1) * (int)round(pow(10.0,len - 2) 计算每个区间有多少个数
	nums[i] += p * (len - 1) * (int)round(pow(10.0, len - 2));
}

for (int i = 0; i < p; i++) {
	
	//计算每个区间最高位出现多少次。
	nums[i] += (int)round(pow(10.0, len - 1));
}

//剩余的数
int t = n % (int)round(pow(10.0, len - 1));

// t == 200,300之类的情况
if (t == 0) {

	nums[p]++;
	nums[0] += len - 1;
	return;
}

int lenT = log10(t) + 1;

if (lenT != len - 1) {
	//处理10010这种中间有0的情况
	nums[0] += (len - lenT - 1) * (t + 1);
}

nums[p] += t + 1;

Solve(t);

}

void Solution2() {

int n;

cin >> n;

int len = log10(n) + 1;

Solve(n);

for (int i = 0; i < len; i++) {
	nums[0] -= (int)round(pow(10.0, i));
}

for (int i = 0; i < 10; i++) {

	cout << nums[i] << " ";
}

cout << endl;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值