温馨提示:考虑到华为每年校招机试在牛客网进行,所以本文以及同系列其他八篇文章的所有代码均仅保证在牛客网华为机试页面100%accepted。其他编译器使用本代码可能会出现不通过的情况,请知晓。

41.将真分数分解为埃及分数

题目描述

分子为1的分数称为埃及分数。现输入一个真分数(分子比分母小的分数,叫做真分数),请将该分数分解为埃及分数。如:8/11 = 1/2+1/5+1/55+1/110。

接口说明

/*

功能: 将分数分解为埃及分数序列

输入参数:

String pcRealFraction:真分数(格式“8/11”)

返回值:

String pcEgpytFraction:分解后的埃及分数序列(格式“1/2+1/5+1/55+1/100”)

*/

public static String ConvertRealFractToEgpytFract(String pcRealFraction)

{

return null;

}

输入描述:

输入一个真分数,String型

输出描述:

输出分解后的string

示例1

输入

8/11

输出

1/2+1/5+1/55+1/110

********************************************************************************************【贪心算法】

设a、b为互质正整数,a

步骤一: 用b除以a,得商数q1及余数r1,即b=a*q1+r1

步骤二: a/b=1/(q1+1)+(a-r)/b(q1+1)

步骤三: 重复步骤2,直到分解完毕

3/7=1/3+2/21=1/3+1/11+1/231

13/23=1/2+3/46=1/2+1/16+1/368

以上其实是数学家斐波那契提出的一种求解埃及分数的贪心算法,准确的算法表述应该是这样的:

设某个真分数的分子为a,分母为b;

把c=(b/a+1)作为分解式中第一个埃及分数的分母;

将a-b%a作为新的a;

将b*c作为新的b;

如果a等于1,则最后一个埃及分数为1/b,算法结束;

如果a大于1但是a能整除b,则最后一个埃及分数为1/(b/a),算法结束;

否则重复上面的步骤。

有些真分数分解不唯一,所以由于每个测试用例只给出一个分解结果,可能出现程序对但不通过的情况。

eg:81/95=1/2+1/3+1/57+1/570=1/2+/1/3+1/52+1/14820

下面给的程序在贪心算法之前加了另一种情况的讨论,可以通过所有测试用例,想必测试用例也是基于这一程序得来。

********************************************************************************************

include

using namespace std;

int main()

{

char ch;

int a, b;

while (cin >> a >> ch >> b)

{

while (a!=1) /*最终要达到的目标是分解式中所有分数的分子都为1,若不是需要进行处理,故分子是否为1作为循环条件。不要改为b%a,否则虽然原理对但是分解式不是测试用例给出的那个分解结果*/

{

if (b % (a - 1) == 0)/*当一个真分数分子不为1时,首先不是进行贪心算法,而是先判断能否进行一个偷巧的分解,即若b%(a-1)==0,则a/b=1/[b/(a-1)]+1/b*/

{

cout << 1 << '/' << b / (a - 1) << '+';

a=1;

}

else

{

int c=b/a+1;

cout << 1 << "/" << c << "+";

a = a - b%a;

b = b*c;

if (a!=1 && b%a==0)

{

b = b / a;

a = 1;

}

}

}

cout << 1 << "/" << b << endl;//分解式中的最后一个分数分子为1时,输出最后一个埃及分数 }

return 0;

}

********************************************************************************************

********************************************************************************************

42.统计每个月兔子的总数

题目描述

有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少?

/**

* 统计出兔子总数。

*

* @param monthCount 第几个月

* @return 兔子总数

*/

public static int getTotalCount(int monthCount)

{

return 0;

}

输入描述:

输入int型表示month

输出描述:

输出兔子总数int型

示例1

输入

9

输出

34

*************************************************************************************

******************************************************************************************

#include

using namespace std;

int main()

{

int m;

while(cin>>m)

{

int birth[100]={0,1,0,1};

for(int i=4;i<=m;i++)

birth[i]=birth[i-1]+birth[i-2];

int sum=0;

for(int i=1;i<=m;i++)

sum+=birth[i];

cout<

}

return 0;

}

***************************************************************************************************************************************************************************************

43.带密钥的字符串加密

题目描述

有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙。下面是它的工作原理:首先,选择一个单词作为密匙,如TRAILBLAZERS。如果单词中包含有重复的字母,只保留第1个,其余几个丢弃。现在,修改过的那个单词属于字母表的下面,如下所示:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

T R A I L B Z E S C D F G H J K M N O P Q U V W X Y

上面其他用字母表中剩余的字母填充完整。在对信息进行加密时,信息中的每个字母被固定于顶上那行,并用下面那行的对应字母一一取代原文的字母(字母字符的大小写状态应该保留)。因此,使用这个密匙,Attack AT DAWN(黎明时攻击)就会被加密为Tpptad TP ITVH。

请实现下述接口,通过指定的密匙和明文得到密文。

详细描述:

接口说明

原型:

voidencrypt(char * key,char * data,char * encrypt);

输入参数:

char * key:密匙

char * data:明文

输出参数:

char * encrypt:密文

返回值:

void

输入描述:

先输入key和要加密的字符串

输出描述:

返回加密后的字符串

示例1

输入

nihao

ni

输出

le

********************************************************************************************将key中字母依序无重提取出来,转换为对应小写字母后放入字符串tmp中

在tmp后按小写字母表正序补充tmp中未出现的小写字母,得到小写字母表的加密表,大写字母表的加密表不用制作,大写字母由对应小写字母减32即可得到,故默认字母表和加密字母表均为小写的。

对需加密字符串进行一次遍历,将大小写英文字母按照“字母表—加密字母表”的对应关系进行转换,大小写英文字母以及其对应加密字母的确定都使用查表法

输出加密后的字符串

********************************************************************************************

#include

#include

using namespace std;

int main()

{

string table1="abcdefghijklmnopqrstuvwxyz";

string table2="ABCDEFGHIJKLMNOPQRSTUVWXYZ";

string key,str;

while(cin>>key>>str)

{

int a[26]={0};

string tmp;

for(int i=0;i

{

if(key[i]>='a'&&key[i]<='z')

{

if( a[key[i]-'a']==0 ) {tmp+=key[i]; a[key[i]-'a']=1;}

}

else

{

if( a[key[i]-'A']==0 ) {key[i]+=32;tmp+=key[i];a[key[i]-'A']=1;}

}

}

for(int i=0;i<26;i++)

{

if(a[i]==0)

tmp+=table1[i];

}

for(int i=0;i

{

if(str[i]>='a'&&str[i]<='z')

{

int index=table1.find(str[i]);

str[i]=tmp[index];

}

else if(str[i]>='A'&&str[i]<='Z')

{

int index=table2.find(str[i]);

str[i]=tmp[index]-32;

}

}

cout<

}

return 0;

}

********************************************************************************************

********************************************************************************************

4.求最大连续bit数(代码需记忆,底层基础类代码)

题目描述

功能: 求一个byte数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1

输入: 一个byte型的数字

输出: 无

返回: 对应的二进制数字中1的最大连续数

输入描述:

输入一个byte数字

输出描述:

输出转成二进制之后连续1的个数

示例1

输入

3

输出

2

********************************************************************************************

#include

using namespace std;

int main()

{

int byte;

while(cin>>byte)

{

int k=0;

for( k=0;byte!=0;k++)

{

byte=byte&(byte<<1); //byet<<1是将byte的二进制数左移1位末尾补0;左移两位就是byte<<2;&为求按位与

}

cout<

}

return 0;

}

********************************************************************************************

********************************************************************************************

45.(略看求小球落地5次后所经历的路程和第5次反弹的高度

题目描述

假设一个球从任意高度自由落下,每次落地后反跳回原高度的一半; 再落下, 求它在第5次落地时,共经历多少米?第5次反弹多高?

输入描述:

输入起始高度,int型

输出描述:

分别输出第5次落地时,共经过多少米第5次反弹多高

示例1

输入

1

输出

2.875

0.03125

********************************************************************************************

#include

using namespace std;

int main()

{

int h;

while(cin>>h)

{

cout << 23.0*h/8.0 << endl; //注意除h外的数都要带.0,这样才会进行小数运算

cout << h/32.0 << endl; //注意除h外的数都要带.0,这样才会进行小数运算

}

return 0;

}

********************************************************************************************

********************************************************************************************

46.(重点)四则运算

题目描述

请实现如下接口

/* 功能:四则运算

* 输入:strExpression:字符串格式的算术表达式,如: "3+2*{1+2*[-4/(8-6)+7]}"

* 返回:算术表达式的计算结果

*/

public static int calculate(String strExpression)

{

/* 请实现*/

return 0;

}

约束:pucExpression字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。

pucExpression算术表达式的有效性由调用者保证;

输入描述:

输入一个算术表达式

输出描述:

得到计算结果

示例1

输入

3+2*{1+2*[-4/(8-6)+7]}

输出

25

********************************************************************************************

/*用python,一行解决问题,c++太麻烦耽误事儿,注意首要目的是应试*/

print(intput())

*******************************************************************************************

********************************************************************************************

47.整数与IP地址间的转换

题目描述

原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成

一个长整数。

举例:一个ip地址为10.0.3.193

每段数字 相对应的二进制数

10 00001010

0 00000000

3 00000011

193 11000001

组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。

输入描述:

输入

1 输入IP地址

2 输入10进制型的IP地址

输出描述:

输出

1 输出转换成10进制的IP地址

2 输出转换后的IP地址

示例1

输入

10.0.3.193

167969729

输出

167773121

10.3.3.193

********************************************************************************************

#include

#include

using namespace std;

int main()

{

long ip2[4],ip10; /*因为最终ip10是32为二进制数转化来的十进制数,会很大,如果是int类型的话,会导致数据溢出,但是错误提示显示是某组case的输出为空,让检查有么有循环输入处理多个case,产生误导,其实并不是循环输入的问题,就是数据类型定义错误*/

char d;

while(cin>>ip2[0]>>d>>ip2[1]>>d>>ip2[2]>>d>>ip2[3]>>ip10)

{

cout<,二pow()输出的数据类型位double,还得做类型转换,麻烦*/

vector vi;

while(ip10)

{

vi.push_back( ip10%256 );

ip10/=256;

}

for(int i=vi.size()-1;i>=0;i--)

{

if(i) cout<

else cout<

}

}

return 0;

}

********************************************************************************************

********************************************************************************************

48.iNOC产品部-杨辉三角的变形

题目描述

1

1 1 1

1 2 3 2 1

1 3 6 7 6 3 1

1 4 10 16 19 16 10 4 1

以上三角形的数阵,第一行只有一个数1,以下每行的每个数,是恰好是它上面的数,左上角数到右上角的数,3个数之和(如果不存在某个数,认为该数就是0)。

求第n行第一个偶数出现的位置。如果没有偶数,则输出-1。例如输入3,则输出2,输入4则输出3。

输入n(n <= 1000000000)

输入描述:

输入一个int整数

输出描述:

输出返回的int值

示例1

输入

4

输出

3

********************************************************************************************

多列举几行会发现从第3行开始2324的规律

*********************************************************************************

#include

using namespace std;

int main()

{

int n;

while(cin>>n)

{

if(n==1||n==2) cout<

else if(n%4==3||n%4==1) cout<<2<

else if(n%4==0) cout<<3<

else cout<<4<

}

return 0

}

********************************************************************************************

********************************************************************************************

49.无线OSS-高精度整数加法

题目描述

在计算机中,由于处理器位宽限制,只能处理有限精度的十进制整数加减法,比如在32位宽处理器计算机中,

参与运算的操作数和结果必须在-231~231-1之间。如果需要进行更大范围的十进制整数加法,需要使用特殊

的方式实现,比如使用字符串保存操作数和结果,采取逐位运算的方式。如下:

9876543210 + 1234567890 = ?

让字符串 num1="9876543210",字符串 num2="1234567890",结果保存在字符串 result = "11111111100"。

-9876543210 + (-1234567890) = ?

让字符串 num1="-9876543210",字符串 num2="-1234567890",结果保存在字符串 result = "-11111111100"。

要求编程实现上述高精度的十进制加法。

要求实现方法:

public String add (String num1, String num2)

【输入】num1:字符串形式操作数1,如果操作数为负,则num1的前缀为符号位'-'

num2:字符串形式操作数2,如果操作数为负,则num2的前缀为符号位'-'

【返回】保存加法计算结果字符串,如果结果为负,则字符串的前缀为'-'

注:

(1)当输入为正数时,'+'不会出现在输入字符串中;当输入为负数时,'-'会出现在输入字符串中,且一定在输入字符串最左边位置;

(2)输入字符串所有位均代表有效数字,即不存在由'0'开始的输入字符串,比如"0012", "-0012"不会出现;

(3)要求输出字符串所有位均为有效数字,结果为正或0时'+'不出现在输出字符串,结果为负时输出字符串最左边位置为'-'。

输入描述:

输入两个字符串

输出描述:

输出给求和后的结果

示例1

输入

9876543210

1234567890

输出

11111111100

*******************************************************************************************

/*

分层次分类方法(人的习惯思维,复杂度大,费时易出错,应试时不建议采用)

1.先确定是同号相加、异号相加这两大种情况中的哪种

2.同号相加下又分为 “正+正” 和 “负+负” 两种情况,均为绝对值相加,考虑有无进位1(有进位的话进位只可能为1)

3.异号相加下又分为 “正+负” 和 “负+正” 两种情况,均为较大绝对值减较小绝对值,故需要判断谁的绝对值大(1.除去符号位后谁的长度大>>2.除去符号位后长度相等时谁的首位大>>...),然后需要考虑有无借位1(有借位的话借位只可能为1)

平级分类方法(思维复杂度小,不易出错,应试时建议采用)

1.正加正 2.负加负 3.正加负 4.负加正

*/

********************************************************************************************

#include

#include

using namespace std;

string add(string n1,string n2); //主函数引用的自编函数的定义若放在主函数后面,则需要在主函数前添加该自编函数的声明

string sub(string absb,string abss);

int main()

{

string n1,n2;

while(cin>>n1>>n2)

{

string sum;

if(n1[0]!='-'&&n2[0]!='-')

sum=add(n1,n2);

else if(n1[0]=='-'&&n2[0]=='-')

{

n1=n1.substr(1,n1.size());

n2=n2.substr(1,n2.size());

sum='-'+add(n1,n2);

}

else if(n1[0]!='-'&&n2[0]=='-')

{

n2=n2.substr(1,n2.size());

if(n1>n2) sum=sub(n1,n2);

else sum='-'+sub(n2,n1);

}

else

{

n1=n1.substr(1,n1.size());

if(n1>n2) sum='-'+sub(n1,n2);//两无符号数字字符串可直接比大小,即使长度不同

else sum=sub(n2,n1);

}

cout<

}

return 0;

}

string add(string n1,string n2){ //计算n1+n2,其中n1和n2均为无符号数字字符串,长度可能不同

if(n1.size()>=n2.size()) n2=string(n1.size()-n2.size(),'0')+n2;

else n1=string(n2.size()-n1.size(),'0')+n1;

int carry=0;

string tmp;

for(int i=n1.size()-1;i>=0;i--)

{

char c=(n1[i]-'0'+n2[i]-'0'+carry)%10+'0';

tmp=c+tmp;

carry=(n1[i]-'0'+n2[i]-'0'+carry)/10;

}

if(carry) tmp='1'+tmp; //最高位相加后若有进位,不要丢失

return tmp;

}

string sub(string absb,string abss){ //计算absb-abss,其中absb和abss均为无符号数字字符串,长度可能不同

string sum;

if(absb.size()!=abss.size())

abss=string(absb.size()-abss.size(),'0')+abss;

int borrow=0;

for(int i=absb.size()-1;i>=0;i--)

{

if(absb[i]-borrow>=abss[i])

{

char c=(absb[i]-borrow-abss[i])+'0';

sum=c+sum;

}

else

{

char c=(absb[i]-borrow+10-abss[i])+'0';

sum=c+sum;

borrow=1;

}

}

return sum;

}

********************************************************************************************

********************************************************************************************

超长正整数相加

题目描述

请设计一个算法完成两个超长正整数的加法。

输入描述:

输入两个字符串数字

输出描述:

输出相加后的结果,string型

示例1

输入

99999999999999999999999999999999999999999999999999

1

输出

100000000000000000000000000000000000000000000000000

********************************************************************************************

#include

#include

using namespace std;

int main()

{

string s1,s2;

while(cin>>s1>>s2)

{

if(s1.size()>s2.size()) s2=string(s1.size()-s2.size(),'0')+s2;

else s1=string(s2.size()-s1.size(),'0')+s1;

int carry=0;

string he;

for(int i=s1.size()-1;i>=0;i--)

{

char c=(carry+s1[i]-'0'+s2[i]-'0')%10+'0';

he=c+he;

carry=(carry+s1[i]-'0'+s2[i]-'0')/10;

}

if(carry) he='1'+he;

cout<

}

return 0;

}

********************************************************************************************

********************************************************************************************

华为机试python需要需要当时编译通过吗_华为校招软开算法岗历年机试编程题77道C++代码详解(五)...相关推荐

  1. python split函数 空格_最易懂的Python新手教程:从基础语法到代码详解

    导读:本文立足基础,讲解Python和PyCharm的安装,及Python最简单的语法基础和爬虫技术中所需的Python语法. 作者:罗攀 蒋仟 如需转载请联系华章科技 本文涉及的主要知识点如下: P ...

  2. python语法错误概述_Python 错误和异常代码详解

    程序中的错误一般被称为 Bug,无可否认,这几乎总是程序员的错... 程序员的一生,始终伴随着一件事 - 调试(错误检测.异常处理).反反复复,最可怕的是:不仅自己的要改,别人的也要改...一万头草泥 ...

  3. 【2023年第十一届泰迪杯数据挖掘挑战赛】B题:产品订单的数据分析与需求预测 建模及python代码详解 问题一

    相关链接 [2023年第十一届泰迪杯数据挖掘挑战赛]B题:产品订单的数据分析与需求预测 建模及python代码详解 问题一 [2023年第十一届泰迪杯数据挖掘挑战赛]B题:产品订单的数据分析与需求预测 ...

  4. 【2023年第十一届泰迪杯数据挖掘挑战赛】B题:产品订单的数据分析与需求预测 建模及python代码详解 问题二

    相关链接 [2023年第十一届泰迪杯数据挖掘挑战赛]B题:产品订单的数据分析与需求预测 建模及python代码详解 问题一 [2023年第十一届泰迪杯数据挖掘挑战赛]B题:产品订单的数据分析与需求预测 ...

  5. python怎么画条形图-python绘制条形图方法代码详解

    1.首先要绘制一个简单的条形图 import numpy as np import matplotlib.pyplot as plt from matplotlib import mlab from ...

  6. python代码大全表解释-python操作列表的函数使用代码详解

    python的列表很重要,学习到后面你会发现使用的地方真的太多了.最近在写一些小项目时经常用到列表,有时其中的方法还会忘哎! 所以为了复习写下了这篇博客,大家也可以来学习一下,应该比较全面和详细了 列 ...

  7. 基于python的随机森林回归实现_PYTHON | 随机森林实战(代码+详解)

    大家好,我是菜鸟君,之前跟大家聊过R语言的随机森林建模,指路 R语言 | 随机森林建模实战(代码+详解),作为刚过完1024节日的码农算法工程师来说,怎么可能只会用一种语言呢?今天就来说说Python ...

  8. python sqlsever 时间_Python sqlalchemy时间戳及密码管理实现代码详解

    一.时间戳 实际开发中,我们一般希望create_time和update_time这两个属性能自动设置,所以在建表的时候需要在model上特殊处理一下: from sqlalchemy.sql imp ...

  9. python的常量和变量_python中的常量和变量代码详解

    局部和全局变量: # name='lhf' # def change_name(): # # global name # name='帅了一比' # print('change_name',name) ...

最新文章

  1. 二进制、八进制、十六进制和十进制的相互转换,原码反码补码计算以及Java中数字的存储
  2. 三相逆变器双pi控制器参数如何调节_Boost 变换器 PI参数设计举例
  3. 2012年度IT博客大赛50强报道:贾小平
  4. Python 进阶 之 socket模块
  5. WOOTConf 2017:Lockpicking,Willie Nelson开发人员等等
  6. python2.7安装sqlite3模块
  7. vue-cli3安装遇到的问题,卸载不掉旧版本,导致更新不了
  8. 前端等值线分析DEMO(更新地址)
  9. 软工网络15团队作业8——Beta阶段敏捷冲刺(Day4)
  10. 解决Windows Update错误“80072EFD”
  11. autoit java_AutoIt3客户端和Java服务器端TCP通信
  12. Gateway/Zuul + OpenApi 集中管理 API 资源
  13. 三层网络渗透测试实验
  14. html5新建一个表格,全新改良的HTML5表单建立html5新闻
  15. mfc实验报告心得体会_mfc实验报告
  16. 计算机的鼻祖---差分机的由来
  17. GIF格式从10月1日起没有专利保护了!
  18. 计算机系统基础第二版考试题,计算机系统基础模拟试题.docx
  19. 知识图谱关键技术与应用案例
  20. LEAP模型的能源环境发展、碳排放建模预测及不确定性分析实践应用

热门文章

  1. mysql分组统计having_mysql group by和having实例详解
  2. 红米AC3000、小米cr8806、8808、8809开启telnet和SSH
  3. 【java】学生成绩分级ABCDE(起点闭关计划)
  4. 第一台全部采用超级计算机,北京时间2016年6月20日,(神威·太湖之光)是我国第一台全部采用国产处理的世界最快的超级计算机。...
  5. 实现监听器的四种方式
  6. 网站计数器 java_实现网站计数器
  7. C/C++内存问题检查利器——Purify
  8. purify memory leak
  9. html单选按钮不选中,js设置单选按钮的选中不选中
  10. c语言中%s的作用,C语言中%c与%s的区别与划分详解