描述
一天,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