2046 - 炫酷的二进制算法
时间限制 : 1 秒
内存限制 : 128 MB
聪明的大家都知道,计算机是一个炫酷的二进制世界,二进制是一种神奇的进制,它可以用来表示很多东西并且应用广泛。现在相信大家对十进制的加法已经很熟悉了,再让大家做这种无聊的东西就浪费时间了,所以现在要考验大家的是炫酷的二进制加法功力了;现在有若干个十进制数相加,但是我并不会将这些数告诉你,我也不会将这些数的二进制告诉给你,唯一告诉你的是每一位中总共有多少个数在这一位有1出现,这是一个艰巨的任务?不!大家快去解决它,求出这些数的总和吧。
题目输入
第一行为一个数字T,代表有T组数据,接下来每组数据的第一行有一个n(n <= 20),第二行有n个数a_i(0 <= a_i <= 10),代表二进制第i位总共有a_i(0 <= i <= n-1)个1出现。
题目输出
根据给出的这些信息,输出这些数相加的总和(本题输出范围在32位整数内),每组测试数据输出一行。
输入/输出样例
输入格式
2 2 2 1 3 1 1 1
输出格式
4 7
C语言解答
#include<stdio.h> #include<math.h> main() { int n,i,sum,m,p; scanf("%d",&n); while(n--) { scanf("%d",&m); for(i=0,sum=0;i<m;i++) { scanf("%d",&p); sum+=pow(2,i)*p; } printf("%d\n",sum); } }
C++解答
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int V = 30; int T, n, num; int main() { int i, j; scanf("%d", &T); while(T--) { scanf("%d", &n); int ans = 0; for(i = 0; i < n; ++i) { scanf("%d", &num); ans += (1 << i) * num; } printf("%d\n", ans); } }