问题
2017
2017
年
9
9
月日:
腾讯有一道机试题:
大概意思是:
小
Q
Q
非常富有,拥有非常多的硬币,小的拥有的硬币是有规律的,对于所有的非负整数
K
K
,小恰好各有两个数值为
2k
2
k
,的硬币,所以小Q拥有的硬币是
1,1,2,2,4,4…
1
,
1
,
2
,
2
,
4
,
4
…
,小
Q
Q
卖东西需要支付元钱,请问小
Q
Q
想知道有多少种组合方案。
输入:一个,代表要付的钱
输出:表示小
Q
Q
可以拼凑的方案数目
思路
具体思路是,因为小有 20,21,22…2k 2 0 , 2 1 , 2 2 … 2 k 的硬币各两个,所以他们可以分成两组,组成两个数值为 a,b a , b 的两个数字,他们的和是 a+b=n a + b = n ;
答案
java版:
package tablejava;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Help2 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
Set<Integer> countset=new HashSet<>();
int stop=n/2;
for(int i=1;i<=stop;i++) {
int result=(i)^(n-i);
countset.add(result);
}
System.out.println(countset.size());
}
}
C++版
#include <cstdio>
#include<set>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
set<int> countset;
for(int i=1;i<=n/2;i++){
int result =i^(n-i);
countset.insert(result);
}
printf("%d\n",countset.size());
return 0;
}