题目:
【问题描述】
一个IP地址由32位二进制的数组成,比如:
111111111111111111111111000000002
为了便于记忆,我们将8个二进制位用一个十进制数表示,一个IP地址由四个十进制数表示,上述的IP地址表示为:
255.255.255.0
现在给你一个上述形式的IP地址,请回答IP地址的32个二进制位中,有多少位是1。
如IP地址为255.255.255.0,其中24位是1。
【输入形式】
有多组测试数据。
测试数据第一行是一个正整数T,表示测试数据组数。
每组测试数据是一个IP地址,形式为:
IP1.IP2.IP3.IP4
其中0 ≤IP1,IP2,IP3,IP4≤ 255,用十进制表示。每个IP地址不保证是实用IP地址。
40%的测试数据组数T 10≤T≤ 102;
30%的测试数据组数T 102≤T≤ 103;
20%的测试数据组数T 103≤T≤ 104;
10%的测试数据组数T 104≤T≤ 105;
【输出形式】
对于每个IP地址,输出一行包含一个非负整数:该IP地址的32个二进制位中,1的位数。
【样例输入】
5
255.255.255.0
127.0.0.1
0.0.0.1
1.2.3.4
0.0.0.0
【样例输出】
24
8
1
5
0
提示:样例中32位的IP地址为:
111111111111111111111111000000002
011111110000000000000000000000012
000000000000000000000000000000012
000000010000001000000011000001002
000000000000000000000000000000002
#include <bits/stdc++.h>
using namespace std;
int getNum(int num){
int sum = 0;
while(num){
sum += (num & 1);
num >>= 1;
}
return sum;
}
int main(){
int n;
cin >> n;
string a;
int sum = 0;
while(n--){
int sum = 0;
cin >> a;
int num = 0;
int n = a.size();
for(int i = 0; i < n; i++){
if(a[i] == '.'){
sum += getNum(num);
num = 0;
} else{
num = num * 10 + (a[i] - '0');
}
}
sum += getNum(num);
cout << sum << endl;
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int getNum(int num){
int sum = 0;
while(num){
sum += (num & 1);
num >>= 1;
}
return sum;
}
int main(){
int n;
cin >> n;
/*
string a;
int sum = 0;
while(n--){
int sum = 0;
cin >> a;
int num = 0;
int n = a.size();
for(int i = 0; i < n; i++){
if(a[i] == '.'){
sum += getNum(num);
num = 0;
} else{
num = num * 10 + (a[i] - '0');
}
}
sum += getNum(num);
cout << sum << endl;
}
*/
int sum = 0;
int a[5];
char point;
while(n--){
int sum = 0;
scanf("%d%c%d%c%d%c%d",&a[1],&point,&a[2],&point,&a[3],&point,&a[4]);
for(int i = 1; i < 5; i++){
sum += getNum(a[i]);
}
cout << sum << endl;
}
return 0;
}
本文介绍了一种算法,用于计算IP地址中二进制位中1的数量。通过将IP地址分解为四个十进制部分,转换为二进制并计数1的出现次数,该算法可以快速准确地得出结果。适用于处理大量IP地址数据。
545

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



