问题 I: 萌新二进制数
时间限制: 1 Sec 内存限制: 128 MB
题目描述
“世界上有10种人,一种是懂二进制的,另一种是不懂二进制的。”
快期末了,小萌新们都陆陆续续开始了紧张的复习。然而,对于小萌新来说,二进制数可是一个令人头疼的地方。什么异或啦,补码呀,计算得让人心烦。更不要说有些粗心大意的小萌新认错了进制,比如把十进制的1010当做二进制来计算,答案一下错了十万八千里了。
我们姑且把1010,111,100这样的仅有0和1构成的十进制数称之为“萌新二进制数”,比如1,11,100这样的数就是“萌新二进制数”,9,12,113这样的数则不是。那么给定一个自然数n,聪明的你能否告诉我至少需要多少个“萌新二进制数”相加之和恰好为n呢?
例如
输入:12 输出:2
我们将12拆成11+1,11和1都是“萌新二进制数”,故答案为2。
输入:22 输出:2
我们将22拆成11+11,11是“萌新二进制数”,故答案为2。
输入
输入一个整数n(0<=n<=10,000,000)。
输出
输出构成n需要“萌新二进制数”的最少个数。
样例输入
0
样例输出
1
思路
别看很难,其实很简单,找到规律就好,任意整数都可以拆成仅有1和0构成的数之和
例如 98765 = 11111 + 11111 + 11111 + 11111 + 11111 + 11110 +11100 + 11000 + 10000
由此可见 最少个数就是该整数某个位置的最大数(即9)。如果数为0需要的单独讨论
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main(){
int n,max=0;
cin >> n ;
int num=n;
while (num != 0) {
max = max > (num%10) ? max : (num%10) ;
num /= 10 ;
}
if (n == 0) {
cout << "1" ;
} else {
cout << max ;
}
return 0;
}
/**************************************************************
Problem: 2004
User: 21XXXXXXXX
Language: C++
Result: 正确
Time:0 ms
Memory:2024 kb
****************************************************************/