• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
HaibaraAi
博客园    首页    新随笔    联系   管理    订阅  订阅

递推dp数位

1-n里有多少个1

#include <cstdio>
#include <iostream>
using namespace std;
int main() {
	int n=10;
	cin >> n;
	int f[10];
	int x[10];
	f[0] = 0;
	f[1] = 1;
	x[0] = 0;
	x[1] = 1;
	for (int i = 2; i < 10; i++) {
		x[i] = x[i - 1] * 10;
		f[i] = f[i - 1] * 10 + x[i];
	}
	int y = n;
	int s = 0;
	int k = 0;
	int len = 0;
	int rd[10];
	while (y != 0) {
		rd[len++] = y % 10;
		y /= 10;
	}
	for (int i = len - 1; i >= 0; i--) {
		if (rd[i] == 0) {
			continue;
		}
		if (rd[i] == 1) {
			s += n%x[i+1] + 1;
		}
		else {
			s += x[i+1];
		}
		s += (rd[i]) * f[i];
	}
	cout << s << endl;
}

1-n里有多少包含1的数

#include <cstdio>
#include <iostream>
using namespace std;
int main() {
	int n=10;
	cin >> n;
	int f[10];
	int x[10];
	f[0] = 0;
	f[1] = 1;
	x[0] = 0;
	x[1] = 1;
	for (int i = 2; i < 10; i++) {
		x[i] = x[i - 1] * 10;
		f[i] = f[i - 1] * 9 + x[i];
	}
	int y = n;
	int s = 0;
	int k = 0;
	int len = 0;
	int rd[10];
	while (y != 0) {
		rd[len++] = y % 10;
		y /= 10;
	}
	for (int i = len - 1; i >= 0; i--) {
		if (rd[i] == 0) {
			continue;
		}
		if (rd[i] == 1) {
			s += n%x[i+1] + 1;
			s += f[i];
			break;
		}
		else {
			s += x[i+1];
			s += (rd[i]-1) * f[i];
		}
		
	}
	cout << s << endl;
}
posted @ 2017-02-15 00:19  HaibaraAi  阅读(85)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3