博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
题解西电OJ (Problem 1007 -做一名正气的西电人 )--长整型计算
阅读量:5836 次
发布时间:2019-06-18

本文共 1674 字,大约阅读时间需要 5 分钟。

 

 

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

 

题目分析:

由于a,b是非常大的长整数,因此需要长整数算法,对于一个整数来说,求其二进制中1的个数就是 模2,然后再除2,直到这个数变为0 ,看看模2的过程中出现了几次1。那么对于长整数也是这样的,因为长度范围是100位,如果我们用一个数组,每个数组项标示5位,这样可以减少进位的计算。具体代码如下

 

 

1 #include 
2 #include
3 #include
4 using namespace std; 5 6 7 int com(char * str) 8 { 9 int res = 0 ;10 int i , j , k , l ;11 l = 0 ;12 unsigned int tmp[30];13 for(i = strlen(str); i > 0 ; i -= 5){14 j = i - 5;15 k = j > 0 ? j:0 ;16 const char * nump = (str+k);17 tmp[l++] = atoi(nump);18 str[k] = '\0';19 }20 unsigned int num[30];21 for(i = 0 ; i < l ; i++){22 num[i] = tmp[l-i-1] ;23 }24 25 for(i = 0 ; num[l-1] != 0 || i < l-1;){26 k = 0 ;27 for(j = i ; j < l ; j++){28 num[j] = (k*100000) + num[j] ;29 k = num[j]%2 ;30 num[j] /= 2 ;31 }32 if(k){33 res++;34 }35 while(num[i] == 0){36 i++ ;37 }38 }39 return res;40 }41 42 int main()43 {44 string wm ;45 string zyf ;46 while(cin >> wm >> zyf){47 int wm1 = com((char *)wm.c_str());48 int zyf1 = com((char *)zyf.c_str());49 if(wm1>zyf1){50 cout << "wm" << endl;51 }else if(wm1

 

转载于:https://www.cnblogs.com/liucheng/p/3683655.html

你可能感兴趣的文章
全新jmeter视频已经上架
查看>>
Windows 8下如何删除无线配置文件
查看>>
oracle系列(五)高级DBA必知的Oracle的备份与恢复(全录收集)
查看>>
hp 服务器通过串口重定向功能的使用
查看>>
国外10大IT网站和博客网站
查看>>
android第十一期 - SmoothSwitchLibrary仿IOS切换Activity动画效果
查看>>
zabbix 批量web url监控
查看>>
MongoDB CookBook读书笔记之导入导出
查看>>
shell如何快速锁定所有账号
查看>>
HTML 5实现的手机摇一摇
查看>>
此博客不再发表对自己私事的看法
查看>>
导致Asp.Net站点重启的10个原因
查看>>
【PMP】Head First PMP 学习笔记 第一章 引言
查看>>
抓住云机遇编排工作 搞定复杂IT工作流
查看>>
MYSQL的longtext字段能放多少数据?
查看>>
MTK 平台上如何给 camera 添加一种 preview size
查看>>
云计算最大难处
查看>>
关于数据分析思路的4点心得
查看>>
Memcached安装与配置
查看>>
美团数据仓库的演进
查看>>