題解西電OJ (Problem 1007 -作一名正氣的西電人 )--長整型計算

 

 

Description

  一天,wm和zyf想比比誰比較正氣,但正氣這種東西沒法量化難以比較,爲此,他們想出了一個方法,兩人各寫一個數字,而後轉化爲二進制,誰的數字中二進制1多誰就比較正氣!ios

Input
  輸入包含多組數據,EOF結束。
  每組數據包含兩行,表明兩個非負整數a,b(0<=a,b<10^100,不含前導0),a爲wm寫的數字,b爲zyf寫的數字。
Output
  每組數據輸出一行,輸出正氣的西電人名字"wm"或"zyf",若是兩人的數字中二進制1同樣多就輸出"neither"。

Sample Input
15
16
17
18
20
19
Sample Output
wm
neither
zyf

 

題目分析:算法

因爲a,b是很是大的長整數,所以須要長整數算法,對於一個整數來講,求其二進制中1的個數就是 模2,而後再除2,直到這個數變爲0 ,看看模2的過程當中出現了幾回1。那麼對於長整數也是這樣的,由於長度範圍是100位,若是咱們用一個數組,每一個數組項標示5位,這樣能夠減小進位的計算。具體代碼以下數組

 

 

 1 #include <iostream>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 using namespace std;
 5 
 6 
 7 int com(char * str)
 8 {
 9     int res = 0 ;
10     int i , j , k , l ;
11     l = 0 ;
12     unsigned int tmp[30];
13     for(i = strlen(str); i > 0 ; i -= 5){
14         j = i - 5;
15         k = j > 0 ? j:0 ;
16         const char * nump = (str+k);
17         tmp[l++] = atoi(nump);
18         str[k] = '\0';
19     }
20     unsigned int num[30];
21     for(i = 0 ; i < l ; i++){
22         num[i] = tmp[l-i-1] ;
23     }
24     
25     for(i = 0 ; num[l-1] != 0 || i < l-1;){
26         k = 0 ;
27         for(j = i ; j < l ; j++){
28             num[j] = (k*100000) + num[j] ;
29             k = num[j]%2 ;
30             num[j] /= 2 ;
31         }
32         if(k){
33             res++;
34         }
35         while(num[i] == 0){
36             i++ ;
37         }
38     }
39     return res;
40 }
41 
42 int main()
43 {
44     string wm ;
45     string zyf ;
46     while(cin >> wm >> zyf){
47         int wm1 = com((char *)wm.c_str());
48         int zyf1 = com((char *)zyf.c_str());
49         if(wm1>zyf1){
50             cout << "wm" << endl;
51         }else if(wm1<zyf1){
52             cout << "zyf" << endl ;
53         }else{
54             cout << "neither" << endl ;
55         }
56     }
57     return 0 ;
58 }
相關文章
相關標籤/搜索