ccf练习题 IP地址

IP地址
【问题描述】

一个IP地址由32位二进制的数组成,比如:

11111111111111111111111100000000(2)

为了便于记忆,我们将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≤ 10^2;

30%的测试数据组数T 10^2≤T≤ 10^3;

20%的测试数据组数T 10^3≤T≤ 10^4;

10%的测试数据组数T 10^4≤T≤ 10^5;

【输出形式】

对于每个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地址为:

11111111111111111111111100000000(2)

01111111000000000000000000000001(2)

00000000000000000000000000000001(2)

00000001000000100000001100000100(2)

00000000000000000000000000000000(2)
对每个ip地址:先取出地址中的四个数,然后对这四个数进行位运算,最后将他们1的个数加起来即可。

#include
#include
using namespace std;
int main(){
     
	int n;
	cin>>n;
	int num[n];
	for(int i=0;i<n;i++)
	num[i]=0;
	for(int i=0;i<n;i++){
     
		string s;
	    cin>>s;
	    int ip[4];
	    sscanf(s.c_str(),"%d.%d.%d.%d",&ip[0],&ip[1],&ip[2],&ip[3]);
	    for(int j=0;j<4;j++)
	    while(ip[j]){
     
	    	ip[j]=ip[j]&(ip[j]-1);
	    	num[i]++;
		}
	}
	for(int i=0;i<n;i++)
	cout<<num[i]<<endl;
	return 0;
}

你可能感兴趣的:(c++,ccf)