2014华为机试西安地区B组试题
2014-09-19 11:06
232 查看
2014华为机试西安地区B组试题
题目一、亮着点灯的盏数一条长廊里依次装有n(1≤n≤65535)盏电灯,从头到尾编号1、2、3、…n-1、n。每盏电灯由一个拉线开关控制。開始,电灯所有关着。
有n个学生从长廊穿过。第一个学生把号码凡是1的倍数的电灯的开关拉一下;接着第二个学生把号码凡是2的倍数的电灯的开关拉一下;接着第三个学生把号码凡是3的倍数的电灯的开关拉一下;如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下。n个学生按此规定走完后,长廊里电灯有几盏亮着。
注:电灯数和学生数一致。不能写双重循环,会执行超时。
输入 65535
输出 255
题目分析:
对于不论什么一盏灯,因为它原来不亮,那么当它的开关被按奇数次时,灯是开着的;当它的开关被按偶数次时,灯是关着的;一盏灯的开关被按的次数,恰等于这盏灯的编号的因数的个数;要求哪些灯还亮着,就是问哪些灯的编号的因数有奇数个.显然全然平方数有奇数个因数。每一个数除以一个数A等于还有一个数B,那么A和B都是它的因数,于是因数是成对出现的,可是要因数是奇数,就必须A=B所以这个数就必须是一个是的平方得到的。
综上所述这道题很easy,就是找1-65535中全然平方数的个数。我们利用枚举法
=========================================================================
參考代码:
//亮着点灯的盏数.cpp //2014.7.9 hepanhui #include <iostream> using namespace std; int main() { int n; int cnt = 0; cin >> n; for(int x = 1; ; x++) { int y = x*x; if(y > n) break; cnt ++; } cout << cnt << endl; }
调试过程中易错地方,我们要把cnt++放在跳出循环的后面,否则次数会比正确答案多一次。
题目二:同样字符
输入一个字符串,推断是否含有同样的子串(字串长度大于1),是,输出1,否,输出0。
比如12312含有两个12,所以输出1;23456则没有同样子序列,输出0.
输入:12312
输出:1
题目分析:我们首先採用双循环来处理,之后再用一个while语句,最后採用中间变量进行一个转换。
=======================================================================
參考代码:
//同样字符.cpp //2014.7.10 hepanhui #include <iostream> #include <string> const int maxn = 1000; using namespace std; int Equalchar(char *str) { //非法输入 if(str == NULL) return 0; int cnt = 0; int p,q; int len = strlen(str); for(int i = 0; i < len;i++) { for(int j=i+1; j < len;j++) { p = i; q = j; while(str[p] == str[q]) { p++; q++; cnt++; } if(cnt > 1) return 1; cnt = 0; } } return 0; } int main() { char s[1000]; gets(s); cout << Equalchar(s) << endl; return 0; }
调试过程易错的地方:
①输入字符串有可能有空格。所以不能用cin
②用gets(s)一定要注意加上头文件#include<string>
③记住要採用中间变量,由于推断的时候保证ij不发生变化,所以採用中间变量。
④记住cnt一直要每次while之后置0
题目三、整数相除
两个整数相除,将结果用字符串返回。假设是循环小数,将循环的位用括号括起来。
函数原型为 void div(const int a,const int b,char *str)
输入:1 3
输出:0.(3)
题目分析:
这道题比循环小数的题目多有一点点东西,那就是要推断ab的正负性,其它都一样。
难点在于循环循环小数的周期和循环长度,所以我们这里定义两个数组
int reminder_exist[max_INT];int reminder_pos[max_INT];
==============================================================================
參考代码:
//整数相除.cpp //2014.7.9 hepanhui #include<iostream> #include<string> using namespace std; const int maxn = 100; //设置字符串的最大位数 const int max_INT = 10000; int reminder_exist[max_INT]; int reminder_pos[max_INT]; void div(const int a, const int b, char *str) { int numerator,denominator,quotient, reminder, outcnt = 0; int flag = 0; //负数标志 int original_numerator = a; //求整数部分用到的分子 memset(reminder_exist, 0, sizeof(reminder_exist)); memset(reminder_pos, 0, sizeof(reminder_pos)); numerator = a; //因为定义const int所以我们要改变分子分母时候,所以我们通过中间变量转化 denominator = b; if(a*b < 0) flag = 1; //将分子和分母变成整数 numerator = numerator < 0 ? -numerator:numerator; denominator = denominator < 0 ? -denominator:denominator; quotient = numerator/denominator; reminder = numerator%denominator; int integer = quotient; //找出循环 //int found_cycle = 0; int cycle_pos = maxn; //循环的位置 int cycle_len = 0; //初始化循环长度 int i = 0; for(i = 0; i <= maxn; i++) { //找出余数相等的情况,求出循环周期 if(reminder_exist[reminder]) { cycle_pos = reminder_pos[reminder]; cycle_len = i - cycle_pos; break; } else { reminder_exist[reminder] = 1; reminder_pos[reminder] = i; } numerator = reminder *10; quotient = numerator/denominator; reminder = numerator%denominator; str[outcnt++] = quotient + '0'; //将更新的商存入字符串中 } str[outcnt++] = '\0'; if(!flag) { cout << integer << "." ; } else cout << "-" << integer << "."; for(int j = 0; j < cycle_pos; j++) cout << str[j]; cout << "("; for(int j = cycle_pos; j < i;j++) cout << str[j]; cout << ")" << endl; } int main() { int a,b,flag = 0; char s[maxn]; cin >> a >> b; if(!a && !b) return 0; div( a, b,s); return 0; }
调试过程易犯的错误:
①主函数和子函数变量的设置,和非法输入的安排自己比較混乱;
②讨论负数的情况,直接要将负数变成整数来循环,学会用 ? : 三目运算符
③定义输出是字符串型,我们不能直接str[outcnt++] = quotient;由于quotient是一个数,所以我们必需要加上+‘0’
④仍然须要提醒的是字符串数组存入的题目,要注意
1)outcnt要初始化为0
2)str[outcnt++]中++不能忘记
3)str[outcnt++] = '\0'
4)主函数定义的时候char str[maxn];
5)这道题目输出格式须要细致书写。
相关文章推荐
- 2014华为机试西安地区A组试题
- 2014华为机试西安地区B组试题
- 2013年9月华为软件类校招机试 西安地区(西工大、西电)部分组试题
- 华为2014机试试题 - 洞穴逃生
- 2014华为机试试题1——反转相加(2013.09.11)
- 9月5日,华为2014校园招聘的机试题目
- 华为2014机试样题及代码(四)
- 2014华为机试,迷宫矩阵寻找单词的存在与否
- 地铁换乘—华为2014校招机试样题 —Dijkstra 和 Floyd-Warshall 算法解决
- [置顶] 华为2014校招机试
- 【2014华为机试题】02.求出数组中所有奇数之和以及所有偶数之和
- 树的众多操作(2014华为校园招聘 机试 第三题 )
- 2014华为招聘机试第三题
- 2014华为上机试题
- 2014 华为校招机试题(c/c++开发类)
- 2014华为机试题
- Google Code Jam 2014 Qualification Round C.Minesweeper Master 和 Microsoft某实习机试试题(快速求组合)
- 2014华为校招机试题目总结
- 华为2014机试字符串压缩
- 华为机试题2014 字符串过滤程序 java实现