思维题——Quasi Binary

本文介绍了一个有趣的编程问题:如何将一个整数n分解为若干个只包含0和1的数之和,并找到最少的数的个数及一种可行的分解方案。通过分析和给出的C++代码示例,读者可以了解解决问题的具体思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

题目描述

给出一个数 n,你需要将 n 写成若干个数的和,其中每个数的十进制表示中仅包含 0 和 1。

问最少需要多少个数。

输入输出格式

输入格式:

一行 一个数 n(1 ≤ n ≤ 106

输出格式:

最少的数的个数,并给出一种方案。

输入输出样例

输入样例 1

9

输出样例 1

9
1 1 1 1 1 1 1 1 1

输入样例 2

32

输出样例 2

3
10 11 11

分析

可以先找出每位上的数,最大的数就是最少的数的个数。因为我是从个位开始找的,所以可以从后往前进行枚举,若这一位上的数大于 0,则输出 1,然后还要记录一下第一个 1 出现在哪一位,如果之后的数小于这个标记的位置,并且这个数等于 0,则输出 0。

#include<bits/stdc++.h>
using namespace std;

int main()
{
	int n,f[10];
	int cnt=1;
	cin>>n;
	int mx=0;
	while(n>0){
		mx=max(mx,n%10);
		f[cnt++]=n%10;
		n/=10;
	}
	cout<<mx<<endl;
	while(mx--){
		for(int i=cnt-1;i>=1;i--){
			if(f[i]){
				cout<<1;
				f[i]--;	
			}
			else{
				if(i<cnt){
					cout<<0;
				}
			}	
		}
		cout<<" ";
		while(f[cnt-1]==0){
			cnt--;
		}
	}
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值