51nod 1413 权势二进制(模拟)

1413 权势二进制 

题目来源: CodeForces

基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题

一个十进制整数被叫做权势二进制,当他的十进制表示的时候只由0或1组成。例如0,1,101,110011都是权势二进制而2,12,900不是。

当给定一个n的时候,计算一下最少要多少个权势二进制相加才能得到n。

Input

单组测试数据。
第一行给出一个整数n (1<=n<=1,000,000)

Output

输出答案占一行。

Input示例

9

Output示例

9

在没看题解的情况下,已经连续做出来二道题了,很开心,尽管是2级题,我大部分还是要看别人思路的。

思路:本道题就是模拟,建个原数的数位数组和辅助数组,每次找出这个数各位上的非零的最小数minn,辅助数组对应原数组,原数组[i]=0,则辅助数组[i]=0,原数组[i] ! = 0,则辅助数组[i]=1 ,,然后原数组[i] - =minn*辅助数组[i],这代表加了minn次权势二进制,再去找这个数各位上的非零的最小数minn,直至原数组每一位都为0.

#include<algorithm>
#include<stdio.h>
using namespace std;
int num[1000005];//原数组 
int a[1000005];//辅助数组 
int main()
{
	int n;
	scanf("%d",&n);
	int pos=0;
	while(n!=0)
	{//将整数n分解 
		num[pos++]=n%10;
		n/=10;
	}
	int maxn=0;//n的各数位中最大的数,初始化为0 
	int minn=10;//n的各数位中最小的非零的数 
	int flag=1;//标志位 
	int sum=0;
	while(flag)
	{
		for(int i=0;i<pos;i++)
		{//a数组就是权势二进制
			if(num[i]==0) a[i]=0;
			else
			{
				a[i]=1;
				minn=min(minn,num[i]);
				maxn=max(maxn,num[i]);
			}
		}
		flag=0;
		for(int i=0;i<pos;i++)
		{ 
			num[i]-=minn*a[i];
			if(num[i]!=0)
			{ 
				flag=1;
			}
		}
		sum+=minn;//加了minn次 
		minn=maxn;//n的各数位中最大的数 
		maxn=0;//初始化 
	}
	printf("%d\n",sum);
	return 0; 
}

猜你喜欢

转载自blog.csdn.net/BBHHTT/article/details/81708583