题目描述
输入一个数组 a ,包含有 n 个元素 a1, a2, · · · , an 。对这个数组进行 m 次 变换,每次变换会将数组 a 中的每个元素 ai 转换为 ai · bitCount(ai) 。其中 bitCount(x) 表示数字 x 的二进制表示中 1 出现的次数,例如 bitCount(3) = 2 , 因为 3 的二进制表示为 11 ,其中 1 出现了两次。
请输出变换之后的数组内容。
输入格式
输入的第一行包含一个正整数 n ,表示数组 a 中的元素个数。
第二行包含 n 个整数 a1, a2, · · · , an ,相邻整数之间使用一个空格分隔。
第三行包含一个整数 m ,表示变换次数。
输出格式
输出一行,包含 n 个整数,相邻整数之间使用一个空格分隔,表示变换之 后得到的数组 a 。
样例输入
2 5 7 2
样例输出
20 63
提示
【样例说明】
5 = (101)2 ,7 = (111)2 ,第一次变化后 a = [10, 21] 。
10 = (1010)2 ,21 = (10101)2 ,第二次变换后 a = [20, 63] 。
对于 30% 的评测用例,1 ≤ n ≤ 10 ;
对于 60% 的评测用例,1 ≤ n ≤ 100 ;
对于所有评测用例,1 ≤ n ≤ 103 ,0 ≤ m ≤ 5 ,0 ≤ ai ≤ 1000 。
思路
二进制中1的数量可以用除以2求余的方法得到,将a[i]进行m次运算后输出
#include<stdio.h>
int bitCount(int n) {//求出二进制中1的数量
int score = 0;
while (n > 0) {
score += n % 2;
n = n / 2;
}
return score;
}
void compute(int* a, int n, int m) {
int i, j;
int k;
for (i = 0;i < n;i++) {
for (j = 0;j < m;j++) {//m次运算
a[i]*= bitCount(a[i]);
}
printf("%d ", a[i]);
}
printf("\n");
}
int main() {
int n;
int a[1010];
int m;
int i;
scanf("%d", &n);
for (i = 0;i < n;i++) {
scanf("%d", &a[i]);
}
scanf("%d", &m);
compute(a, n, m);
return 0;
}
&spm=1001.2101.3001.5002&articleId=149975703&d=1&t=3&u=ac08b283971a408da8e91ba3fabdd12f)
263

被折叠的 条评论
为什么被折叠?



