1. 程式人生 > >XDOJ1007--做一名正氣的西電人

XDOJ1007--做一名正氣的西電人

描述

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

Input

  輸入包含多組資料,EOF結束。
  每組資料包含兩行,代表兩個非負整數a,b(0<=a,b<10^100,不含前導0),a為wm寫的數字,b為zyf寫的數字。

Output

  每組資料輸出一行,輸出正氣的西電人名字"wm"或"zyf",如果兩人的數字中二進位制1一樣多就輸出"neither"。
 

樣例輸入

15
16
17
18
20
19

樣例輸出

wm
neither
zyf

解題思路:

由於a,b的取值範圍很大,所以考慮使用string來儲存它們的值,之後把string中的數值儲存在整數陣列中。那麼問題的核心就是怎麼計算這樣一個大整數中1的個數呢?最樸素的方法就是用2除以這個數,我們分析一個例子就能明白了。

整數238

238/2 = 119, 它實際上可以這樣計算

8/2=4            4+15%10=9

3*10/2=15         15/10 = 1         1+10%10 = 1

2*10/2=10    10/10 = 1

而每次除2後是否判斷有1的存在都是在個位數上,看個位數%2是否為1。

基於上面分析可以得到程式:

#include<iostream>
#include<string>
using namespace std;

int cac(string numStr)
{
    int sum = 0;
    int num[101];
    int len = numStr.length();
    for(int i=0;i<len;++i)
        num[i] = numStr[i]-'0';
    int t = 0;
    int curLen = len;
    while(curLen>0)
    {
        t = num[len-1];
        if(t%2==1)
            ++sum;
        num[len-1] = t/2;
        for(int i=len-2;i>=len-curLen;--i)
        {
            t = 10*num[i];
            num[i+1] += (t/2)%10;
            num[i] = (t/2)/10;
        }
        for(int i=len-curLen;i<len;++i)
        {
            if(num[i]==0)
                --curLen;
            else
                break;
        }
    }
    return sum;
}
int main()
{
    string num1Str,num2Str;
    while(cin>>num1Str>>num2Str)
    {
      int sum1 = cac(num1Str);
      int sum2 = cac(num2Str);
      if(sum1>sum2)
        cout<<"wm"<<endl;
      else if(sum1<sum2)
        cout<<"zyf"<<endl;
      else
        cout<<"neither"<<endl;
    }
    return 0;
}

最後歡迎大家訪問我的個人網站: 1024s