1417: 爲了未來的計算機

題目描述
未來是超導計算機、納米計算機、光計算機、DNA計算機和量子計算機的天下。但是基於集成電路的計算機短期內還不會退出歷史的舞臺。
2000年,上海大學金翊教授從構造計算機的基本原則和光的基本特性出發,首次將光強度與偏振方向結合起來表示三值信息,利用液晶的旋光效應和偏振器來實現三種光學狀態的相互轉換和遷移,提出了一種全新的光計算機理論——三值光學計算機(Ternary Optical Computer,簡稱TOC)。
三值光學計算機用兩個正交的偏振態和無光態表示信息,所以,它的一個數據位上有三個取值,除0和1之外,還可以再取一個值。而普通的集成電路計算機的數據位上只有兩個值0,1。
已知普通計算機上的數據位只有兩個值0和1。所以任何數據都可以用0和1表示。你的目標是求出已知數據的二進制表示中1的個數。並對其進行統計。

輸入
多組測試數據,每組測試數據各佔兩行。
第一行一個整數N,表示接下來的下一行包含多少個整數。
第二行包含N個整數。
(所有的輸入都以十進制表示,1<N<=1000,整數範圍[-2^31,2^31-1])
請讀到文件末尾。

輸出
根據每組測試數據,請統計出N個整數的二進制表示中1的個數。

樣例輸入
5
1 2 3 4 5
3
2 1 0
1
-1
樣例輸出
Case #1: 7
Case #2: 2
Case #3: 32

#include<stdio.h>
int fan(long int n)
{  
    n = (n&0x55555555) + ((n>>1)&0x55555555); 
    n = (n&0x33333333) + ((n>>2)&0x33333333); 
    n = (n&0x0f0f0f0f) + ((n>>4)&0x0f0f0f0f); 
    n = (n&0x00ff00ff) + ((n>>8)&0x00ff00ff); 
    n = (n&0x0000ffff) + ((n>>16)&0x0000ffff); 
    return n; 
}   
int main() {
    int n,i,s,t=1;
	long int a;
    while(scanf("%d",&n)!=EOF)
	{
        s=0;
        for(i=0; i<n; i++) 
		{
            scanf("%ld",&a);
            s+=fan(a);
        }
        printf("Case #%d: %d\n",t++,s);
    }
    return 0;
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章