华为机试题——求车速

描述:
一辆以固定速度行驶的汽车,司机在上午10点看到里程表(里程表有6位)上的读数

是一个对称数(即这个数从左向右读和从右向左读是完全一样的,例如95859公里)。

两小时后里程表上出现了一个新的对称数。问该车的速度(公里/小时)是多少?

接口说明

原型:

int CalcSpeedOfCar(int iCurrentMileage, int * piCarSpeed);

输入参数:

int pcCurrentMileage:当前里程数(为对称数) (pcCurrentMileage ≤ 999999)

输出参数:

int * piCarSpeed:汽车速度

返回值:

0:汽车速度计算成功

1:汽车速度计算失败,在里程表的范围内找不到下一个对称数

知识点:
工程环境请使用VS2005

题目来源: 软件训练营
练习阶段: 初级

题目很简单,注意几个关键点,奇数位还是偶数位;整数是否为全9,中间对称位置是否为9;还有这个对称数要求是个小于七位数的整数,要进行边界检测~

#include<iostream>
using namespace std;

 /*
功能: 根据里程计算车速
原型:
    int CalcSpeedOfCar(int iCurrentMileage, int * piCarSpeed);

输入参数:
    int pcCurrentMileage:当前里程数(为对称数)(pcCurrentMileage ≤ 999999)

返回值:
    汽车速度(公里/小时)
*/

int CalcSpeedOfCar(int iCurrentMileage, int * piCarSpeed)
{
    /*在这里实现功能*/
	char tmp[7],tmp2[8];
	itoa(iCurrentMileage,tmp,10);
	int i,slen=strlen(tmp);
	if(slen>6) return 1;
	if(slen%2)//奇数
	{
		if(tmp[slen/2]<'9')
		{
			tmp[slen/2]++;
			*piCarSpeed=(atoi(tmp)-iCurrentMileage)/2;
			return 0;
		}
		else//tmp[slen/2]=='9'
		{
			itoa(iCurrentMileage+1,tmp2,10);
			if(strlen(tmp2)>slen)
			{
				if(slen>5) return 1;
				*piCarSpeed=1;
				return 0;
			}

			i=slen/2;
			while(tmp[i]=='9')
			{
				tmp[i]='0';
				i--;
			}
			tmp[i]++;

			for(i=0;i<slen/2;i++)
				tmp[slen-i-1]=tmp[i];
			*piCarSpeed=(atoi(tmp)-iCurrentMileage)/2;

			return 0;
		}
	}
	else//偶数
	{
		itoa(iCurrentMileage+1,tmp2,10);
		if(strlen(tmp2)>slen)
		{
			if(slen>5) return 1;
			*piCarSpeed=1;
			return 0;
		}
		i=slen/2-1;
		while(tmp[i]=='9')
		{
			tmp[i]='0';
			i--;
		}
		tmp[i]++;
		for(i=0;i<slen/2;i++)
			tmp[slen-1-i]=tmp[i];
		*piCarSpeed=(atoi(tmp)-iCurrentMileage)/2;
		return 0;
	}

    return 0;
}
int main()
{
	int speed;
	CalcSpeedOfCar(1991,&speed);
	cout<<speed<<endl;
	return 0;
}
时间: 2024-03-28 14:19:46

华为机试题——求车速的相关文章

华为机试 --- 求最大三位数

题目:输入10位0-9数字,取其中三位不同数字组合,求组合出来的最大三位数. 如输入 1 2 3 4 5 6 7 8 9 0,组合出来987最大. 测试代码如下: #include <stdio.h> #include <stdlib.h> int IsSame(int *a, int num); int main() { int i=0; int j=0; int a[10]={0}; int input =0; int length =0; int temp=0; for (i

[华为机试]求出数组中所有奇数之和以及所有偶数之和

代码: #include <iostream> #include <sstream> #include <fstream> #include <string> int main() { int num[100]; int odd = 0, even = 0; std::string str; getline(std::cin, str); std::stringstream s(str); int j = 0; while(getline(s, str, '

华为机试题【10】-求数字基root

题目描述: 求整数的Root:给定正整数,求每位数字之和;如果和不是一位数,则重复; 输入:输入任意一个或多个整数 输出:输出各位数字之和,直到和为个位数为止(输入异常,则返回-1),多行,每行对应一个输入数据的结果. 样例输入: 25 865 样例输出: 7 1 思路分析: 首先求个位数相加,经典方法,求余相除 要求各个位数的和是小于10,可以采用递归或者循环 代码: import java.util.Scanner; public class Main { static int[] num

求一个int型整数的两种递减数之和(java)--2015华为机试题

题目描述: 给出一个整数(负数使用其绝对值),输出这个整数中的两种递减数(1.最大递减数:2.递减数中各位数之和最大的数)之和. 递减数:一个数字的递减数是指相邻的数位从大到小排列的数字,不包含相邻的数位大小相同的情况. 最大递减数:所输入整数的所有递减数中值最大的一个. 如: 75345323,递减数有:75,753,53,53,532,32.那么最大的递减数为753. 各位数字之和最大的递减数: 如75345323中的各递减数:75各位数之和=12(7+5=12),753各位数之和=15(7

2017华为机试题--水仙花数

等了一个月终于等到华为给安排的实习生在线机试,把自己做的三道题记录了一下,也方便日后复习.这篇是第一题,没有什么特别的难度,经典的水仙花数题. 题目描述:水仙花数是指一个n位数(n≥3),它的每个位上的数字的n次幂之和等于它本身.(例如:13+53+33=153),要求:输出1000范围内所有水仙花数及水仙花数之和. 输入描述:无 输出描述:1000以内所有水仙花数及总和. 输出例子: 第1个水仙花数:xxx 第2个水仙花数:xxx 第3个水仙花数:xxx ... 水仙花数总和为:xxx 1 p

华为机试题【12】-关灯泡

题目描述: 描述: 一条长廊里依次装有n(1 ≤ n ≤ 65535)盏电灯,从头到尾编号1.2.3.-n-1.n.每盏电灯由一个拉线开关控制.开始,电灯全部关着. 有n个学生从长廊穿过.第一个学生把号码凡是1的倍数的电灯的开关拉一下:接着第二个学生把号码凡是2的倍数的电灯的开关拉一下:接着第三个学生把号码凡是3的倍数的电灯的开关拉一下:如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下.n个学生按此规定走完后,长廊里电灯有几盏亮着. 注:电灯数和学生数一致. 运行时间限制: 无限

华为机试题3

[编程题] 明明的随机数 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数 字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号.然后再把这些数从小到大排序,按照排好的顺序去找同学做调查.请你协助明明完成 “去重”与“排序”的工作. Input Param n               输入随机数的个数 inputArray      n个随机整数组成的数组 Return Value

华为机试题 报数1,2,3 报到3 的出列,最后剩下的是谁

描述:有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出,问最后留下的那位是原来第几号. 输出:多行,每行对应求的结果思路:就是使用数组简单的模拟报数过程,报到3的标记为true import java.util.Scanner; public class baoshu4282 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n; while (s

阿里 2014-08-29 校招机试题 求一个存放整数的二叉树相差最大的两节点差值绝对值

题目:写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这颗二叉树中相差最大的两个节点间的差值绝对值.请注意程序效率. 如果是数值之差,感觉怎么着也得遍历一遍,直接修改下二叉树的基本遍历代码就可以. #include<stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node * left; struct Node * right; } BitNode, *BiTree; /* 求