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)*/
 
 
    本题属于大数题,核心是把大数转化为二进制,这里定义一个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;
}

 

posted @ 2013-08-06 14:46  hjf007  阅读(237)  评论(0编辑  收藏  举报