C++実習18 IPアドレス


タイトル:【問題説明】
1つのIPアドレスは32ビットのバイナリの数で構成され、例えば:
111111111111111111111111000000002
記憶を容易にするために、8つのバイナリビットを1つの10進数で表し、1つのIPアドレスは4つの10進数で表し、上記のIPアドレスは以下のように表す.
255.255.255.0
今あなたに1つの上述の形式のIPアドレスをあげて、IPアドレスの32のバイナリビットの中で答えてください、何ビットが1です.
IPアドレスが255.255.255.255.0の場合、24ビットは1である.
【入力形式】
複数のテストデータがあります.
テストデータの最初の行は、テストデータ群数を表す正の整数Tである.
各テストデータはIPアドレスであり、形式は以下の通りである.
IP1.IP2.IP3.IP4
このうち0≦IP 1,IP 2,IP 3,IP 4≦255は10進数で表される.各IPアドレスは、実用的なIPアドレスであることは保証されません.
40%のテストデータ群数T 10≦T≦102;
30%のテストデータ群数T 102≦T≦103;
20%のテストデータ群数T 103≦T≦104;
10%のテストデータ群数T 104≦T≦105;
【出力形式】
各IPアドレスについて、出力1行は、32個のバイナリビットのうち、1のビット数の非負の整数を含む.
【サンプル入力】
5 255.255.255.255.0.255.0127.0.0.1 0.0.0.1 1.2.3.4 0.0.0.0【サンプル出力】
24 8 1 5ヒント:サンプル中の32ビットのIPアドレスは:
111111111111111111111111000000002
011111110000000000000000000000012
000000000000000000000000000000012
000000010000001000000011000001002
000000000000000000000000000000002
#include 
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 
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;
}