2020-2-17 Quasi Binary

题目如下:
A number is called quasibinary if its decimal representation contains only digits 0 or 1. For example, numbers 0, 1, 101, 110011 — are quasibinary and numbers 2, 12, 900 are not.

You are given a positive integer n. Represent it as a sum of minimum number of quasibinary numbers.

Input
The first line contains a single integer n (1 ≤ n ≤ 106).

Output
In the first line print a single integer k — the minimum number of numbers in the representation of number n as a sum of quasibinary numbers.

In the second line print k numbers — the elements of the sum. All these numbers should be quasibinary according to the definition above, their sum should equal n. Do not have to print the leading zeroes in the numbers. The order of numbers doesn’t matter. If there are multiple possible representations, you are allowed to print any of them.

Examples
Input
9
Output
9
1 1 1 1 1 1 1 1 1
Input
32
Output
3
10 11 11

题意大概是输入一个整数,找到数目最少的1和0表示的十进制数相加等于这个整数,并输出这些数及其个数

我的思路
一开始我想当然的认为要想令其个数最少 只需尽可能地保证高位全是1即可
比如
3244 1111
2133 1111
1022 111//注意这里已经不对了,正确的应该是1011
911 111
800 11
。。。。。。。显然不对,下面的我就不写了hhhh

后来我发现了错误之处决定用字符串模拟,如果输入的整数字符串每位大于’0’的话,利用字符串的加法令其所求得的数尾部+‘1’,否则+‘0’,最后输出的时候再对前面的‘0’做个处理(注意,如果那个字符串就是0这么干就啥都不输出了。。。)

以下是我自己的AC 代码

#include <iostream>
#include <string>
using namespace std;
int main(void)
{
	string in;cin>>in;
	int len = in.length();
	string key[999];
	int head = 0, tail = 0;
	int sum = 0;
	int i, j;
	
	while(1){
		int flag = 0;
		string base = ""; 
		for(i = 0 ; i <= len-1; i++){
			if(in[i] > '0'){
				flag = 1;
				in[i] -= 1;
				base += '1';
			}
			else base += '0';
		}
		if(flag == 1){
			key[tail] = base;
			tail++;
			sum++;
		}
		else break;	
	}
	
	cout<<sum<<endl;
	int have, top;
	for(i = tail-1; i >= head; i--){
		have = 0;
		top = key[i].length();
		for(j = 0; j <= top-1; j++){
			if(have == 1) {cout<<key[i][j];continue;}
			if(key[i][j] != '0') {
				have = 1;
				cout<<key[i][j]; 
			}
		}
		if(i != head) cout<<" ";
	}
	cout<<endl;
	
	return 0;
}

我觉得把一道数字题做成了字符串处理题肯定是走弯路了,后来一看dalao的代码。。。果然是!!!
所以我就不对我的代码进行修正啦,看dalao的代码可以学到更多东西

以下是dalao的代码:

#include<iostream>
using namespace std;

int main(void)
{
	int a,b,i,m=0,t=1,g[10] = {0};	
	cin>>a;    
	while(a){
		b = a % 10;
		for(i = 9; i > 9-b; i--) g[i] += t;
		if(b > m) m = b;
		t *= 10;
		a /= 10;
	}
	cout<<m<<endl;
	
	for(i = 10-m; i < 10; i++){
		if(g[i]) cout<<g[i]<<' ';
	}
	return 0;
}

啧啧啧dalao不愧是dalao,我不想说话。。。。orz
*之所以没有想到这么做是因为我的思路是一个一个地生成01数,那么做需将生成方法要循环好多次,而且需要多次对原数进行判断,甚至还需要一个队列来存储生成的数QAQ
dalao地这种结构就非常的方便快捷思路清晰

花时间整理,常来看看哦(/ω\)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值