XDOJ1007--做一名正氣的西電人
阿新 • • 發佈:2019-02-01
描述
一天,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