Problem 1007 - 做一名正气的西电人
/*Problem 1007 - 做一名正气的西电人
Time Limit: 1000MS Memory Limit: 65536KB Difficulty: Total Submit: 970 Accepted: 189 Special Judge: No
Description
一天,wm和zyf想比比谁比较正气,但正气这种东西无法量化难以比较,为此,他们想出了一个方法,两人各写一个数字,然后转化为二进制,谁的数字中二进制1多谁就比较正气!
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
Hint
Source
2010.04内部测试赛(Author: Qinz)*/
Time Limit: 1000MS Memory Limit: 65536KB Difficulty: Total Submit: 970 Accepted: 189 Special Judge: No
Description
一天,wm和zyf想比比谁比较正气,但正气这种东西无法量化难以比较,为此,他们想出了一个方法,两人各写一个数字,然后转化为二进制,谁的数字中二进制1多谁就比较正气!
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
Hint
Source
2010.04内部测试赛(Author: Qinz)*/
本题属于大数题,核心是把大数转化为二进制,这里定义一个cals函数,记录1的个数,即sum+=num[i](因为二进制只有0,1),想不到的话先用手算模拟转化过程,然后模拟过程写出code。
#include<stdio.h>
#include<string.h>
char s1[300],s2[300];
int num[300];
int cals(char s[])
{
int len,i,x,sum=0;
len=strlen(s);
for(i=0;i<len;i++)
num[i]=s[len-i-1]-'0'; //逆序存入int型数组
while(len!=0) //数组长度为0时跳出循环
{
for(i=len-1;i>0;i--) //模拟转化过程
{
x=num[i]%2;
num[i]/=2;
num[i-1]+=10*x;
}
sum+=num[0]%2; //计数
num[0]/=2;
for(i=len-1;num[i]==0&&i>=0;i--) len--; //若高位为0则缩短数组长度,如120->60,长度就缩了1
}
return sum;
}
int main()
{
int len1,len2,i;
while(scanf("%s%s",s1,s2)!=EOF)
{
len1=cals(s1);
len2=cals(s2);
printf("%s\n",len1>len2?"wm":len1==len2?"neither":"zyf"); //比较长度后按要求输出
}
return 0;
}
#include<string.h>
char s1[300],s2[300];
int num[300];
int cals(char s[])
{
int len,i,x,sum=0;
len=strlen(s);
for(i=0;i<len;i++)
num[i]=s[len-i-1]-'0'; //逆序存入int型数组
while(len!=0) //数组长度为0时跳出循环
{
for(i=len-1;i>0;i--) //模拟转化过程
{
x=num[i]%2;
num[i]/=2;
num[i-1]+=10*x;
}
sum+=num[0]%2; //计数
num[0]/=2;
for(i=len-1;num[i]==0&&i>=0;i--) len--; //若高位为0则缩短数组长度,如120->60,长度就缩了1
}
return sum;
}
int main()
{
int len1,len2,i;
while(scanf("%s%s",s1,s2)!=EOF)
{
len1=cals(s1);
len2=cals(s2);
printf("%s\n",len1>len2?"wm":len1==len2?"neither":"zyf"); //比较长度后按要求输出
}
return 0;
}