4.10 华为笔试练习

5. 高精度整数加法问题描述: 在计算机中,由于处理器位宽限制,只能处理有限精度的十进制整数加减法,比如在32位宽处理器计算机中, 参与运算的操作数和结果必须在-231~231-1之间。如果需要进行更大范围的十进制整数加法,需要使用特殊的方式实现,比如使用字符串保存操作数和结果,采取逐位运算的方式。如下: 9876543210 + 1234567890 = ? 让字符串 num1="9876543210",字符串 num2="1234567890",结果保存在字符串 result = "11111111100"。-9876543210 + (-1234567890) = ? 让字符串 num1="-9876543210",字符串 num2="-1234567890",结果保存在字符串 result = "-11111111100"。要求编程实现上述高精度的十进制加法。 要求实现函数: void add (const char *num1, const char *num2, char *result) 【输入】num1:字符串形式操作数1,如果操作数为负,则num1[0]为符号位'-' num2:字符串形式操作数2,如果操作数为负,则num2[0]为符号位'-' 【输出】result:保存加法计算结果字符串,如果结果为负,则result[0]为符号位。注: I、 当输入为正数时,'+'不会出现在输入字符串中;当输入为负数时,'-'会出现在输入字符

串中,且一定在输入字符串最左边位置; II、输入字符串所有位均代表有效数字,即不存在由'0'开始的输入字符串,比如"0012", "-0012"不会出现; III、 要求输出字符串所有位均为有效数字,结果为正或0时'+'不出现在输出字符串,结果为负时输出字符串最左边位置为'-'。

#include<iostream>
using namespace std;

int count(int a, int b, int c, int op)
{
	int result;
	int carr=1;
	if (c >= 0)
		a += c;
	else if (a >= 1)
		a += c;
	else
	{
		a = 9;
		carr = -1;
	}

	switch (op)
	{
	case 0:
		result = a + b;
		break;
	case 1:
		if (a < b)
		{
			a += 10;
			carr = -1;
		}
		result = a - b;
		break;
	case 2:
		if (b < a)
		{
			b += 10;
			carr = -1;
		}
		result = b - a;
		break;
	case 3:
		result = b + a;
		break;
	default:
		break;
	}
	result *= carr;
	return result;
}

void add(const char* num1, const char* num2, char* result)
{
	int carry[100],result_[100];
	int num1_[100], num2_[100];
	int num1_ptr = 0, num2_ptr = 0, ptr=0;
	int num1_begin = 0, num2_begin = 0;
	int op;//op=0:a+b op=1:a-b op=2:b-a op=3:-b-a
	int carr = 0;
	carry[0] = 0;
	for (int i = 0; i < 100; i++)
		num1_[i] = num2_[i] = 0;
	if (num1[0] == '-'&&num2[0] == '-')
	{
		op = 3;
		carr = -1;
		num1_ptr++;
		num2_ptr++;
		num1_begin = num2_begin = 1;
	}
	else if (num1[0] == '-')
	{
		op = 2;
		num1_ptr++;
		num1_begin = 1;
	}
	else if (num2[0] == '-')
	{
		op = 1;
		num2_ptr++;
		num2_begin = 1;
	}
	else
		op = 0;
	while (num1[num1_ptr] != 0)
	{
		num1_[num1_ptr] = num1[num1_ptr] - '0';
		num1_ptr++;
	}
	while (num2[num2_ptr] != 0)
	{
		num2_[num2_ptr] = num2[num2_ptr] - '0';
		num2_ptr++;
	}
	num1_ptr--;
	num2_ptr--;
	while (num1_ptr >= num1_begin || num2_ptr >= num2_begin)
	{
		if (num1_ptr < num1_begin){
			int temp;
			temp = count(0, num2_[num2_ptr], carry[ptr], op);
			if (temp < 0)
			{
				carry[ptr+1] = -1;
				temp = -temp;
			}
			else
				carry[ptr+1] = temp / 10;
			result_[ptr++] = temp % 10;
			num2_ptr--;
		}
		else if (num2_ptr < num2_begin)
		{
			int temp;
			temp = count(num1_[num1_ptr], 0, carry[ptr], op);
			if (temp < 0)
			{
				carry[ptr + 1] = -1;
				temp = -temp;
			}
			else
				carry[ptr + 1] = temp / 10;
			result_[ptr++] = temp % 10;
			num1_ptr--;
		}
		else
		{
			int temp;
			temp = count(num1_[num1_ptr], num2_[num2_ptr], carry[ptr], op);
			if (temp < 0)
			{
				carry[ptr + 1] = -1;
				temp = -temp;
			}
			else
				carry[ptr + 1] = temp / 10;

			result_[ptr++] = temp % 10;
			num1_ptr--;
			num2_ptr--;
		}
	}
	int index = 0;
	if (carry[ptr] == 1)
		result_[ptr++] = 1;
	else if (carry[ptr] < 0)
	{
		result_[0] = 10 - result_[0];
		for (int i = 1; i < ptr; i++)
			result_[i] = 9 - result_[i];
		result[index++] = '-';
	}
	if (op == 3)
		result[index++] = '-';
	while (result_[ptr - 1] == 0)
		ptr--;
	for (int i = ptr - 1; i >= 0; i--)
	{
		result[index++] = result_[i] + '0';
	}
	result[index] = 0;
}

int main()
{
	char num1[100], num2[100];
	char result[101];
	result[0] = 0;
	cin >> num1;
	cin >> num2;
	add(num1, num2, result);
	cout << result;
	system("pause");
	return 0;
}
6.数组比较问题描述: 比较两个数组,要求从数组最后一个元素开始逐个元素向前比较,如果2个数组长度不等,则只比较较短长度数组个数元素。请编程实现上述比较,并返回比较中发现的不相等
元素的个数比如: 数组{1,3,5}和数组{77,21,1,3,5}按题述要求比较,不相等元素个数为0

数组{1,3,5}和数组{77,21,1,3,5,7}按题述要求比较,不相等元素个数为3 要求实现函数: int array_compare(int len1, int array1[], int len2, int array2[]) 【输入】 int len1:输入被比较数组1的元素个数; int array1[]:输入被比较数组1; int len2:输入被比较数组2的元素个数; int array2[]:输入被比较数组2; 【输出】 无 【返回】 不相等元素的个数,类型为int 示例 1) 输入:int array1[] = {1,3,5},int len1 = 3,int array2[] = {77,21,1,3,5},int len2 = 5 函数返回:0 2) 输入:int array1[] = {1,3,5},int len1 = 3,int array2[] = {77,21,1,3,5,7},int len2 = 6 函数返回:3

#include<iostream>
using namespace std;

int array_compare(int len1, int array1[], int len2, int array2[])
{
	int count = 0;
	len1--;
	len2--;
	while (len1 >= 0 && len2 >= 0)
	{
		if (array1[len1--] == array2[len2--])
			count++;
	}
	return count;
}

int main()
{
	int len1, len2;
	int array1[100], array2[100];
	cin >> len1;
	for (int i = 0; i < len1; i++)
		cin >> array1[i];
	cin >> len2;
	for (int i = 0; i < len2; i++)
		cin >> array2[i];
	cout << array_compare(len1, array1, len2, array2);
	system("pause");
	return 0;
}
7.约瑟夫问题问题描述: 输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m。从数列首位置开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列
该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止。如果计数到达数列尾段,则返回数列首位置继续计数。请编程实现上述计数过程,同时输出数
值出列的顺序 比如: 输入的随机数列为:3,1,2,4,初始计数值m=7,从数列首位置开始计数(数值3所在位置) 第一轮计数出列数字为2,计数值更新m=2,出列后数列为3,1,4,从数值4所在位置从新开始计数第二轮计数出列数字为3,计数值更新m=3,出列后数列为1,4,从数值1所在位置开始计数第三轮计数出列数字为1,计数值更新m=1,出列后数列为4,从数值4所在位置开始计数最后一轮计数出列数字为4,计数过程完成。输出数值出列顺序为:2,3,1,4。
要求实现函数: void array_iterate(int len, int input_array[], int m, int output_array[]) 【输入】 int len:输入数列的长度; int intput_array[]:输入的初始数列 int m:初始计数值【输出】 int output_array[]:输出的数值出列顺序
【返回】无 示例 输入:int input_array[] = {3,1,2,4},int len = 4, m=7 输出:output_array[] = {2,3,1,4}

#include<iostream>
using namespace std;

void array_iterate(int len, int input_array[], int m, int output_array[])
{
	int out_ptr = 0, ptr = 0;
	while (out_ptr < len)
	{
		int i = 1;
		while (i < m)
		{
			if (ptr == len)
				ptr = 0;
			if (input_array[ptr] == -1)
				ptr++;
			else
			{
				i++;
				ptr++;
			}
		}
		if (ptr == len)
			ptr = 0;
		while (input_array[ptr] == -1)
		{
			ptr++;
			if (ptr == len)
				ptr = 0;
		}
		m = input_array[ptr];
		output_array[out_ptr++] = m;
		input_array[ptr++] = -1;
	}
}

int main()
{
	int input_array[100], output_array[100];
	int m;
	int n;
	cin >> n >> m;
	for (int i = 0; i < n; i++)
		cin >> input_array[i];
	array_iterate(n, input_array, m, output_array);
	for (int i = 0; i < n; i++)
		cout << output_array[i] << " ";
	system("pause");
	return 0;
}

9. 一副牌中发五张扑克牌给你:让你判断数字的组成: 有以下几种情况: 1:四条:即四张一样数值的牌(牌均不论花色)2:三条带一对 3:三条带两张不相同数值的牌 4:两对 5:顺子包括 10,J,Q,K,A 6:什么都不是 7:只有一对

#include<iostream>
using namespace std;

void test(int a[], int len)
{
	int backet[12];
	int count4 = 0, count3 = 0, count2 = 0,count=0;
	int Is = 0;//顺子
	for (int i = 0; i < 12; i++)
		backet[i] = 0;
	for (int i = 0; i < len; i++)
		backet[a[i] - 3]++;
	for (int i = 0; i < 12; i++)
	{
		if (backet[i] == 4)
			count4++;
		else if (backet[i] == 3)
			count3++;
		else if (backet[i] == 2)
			count2++;
		else if (backet[i] == 1)
		{
			count++;
			if (count == 5)
				Is = 1;
		}
		else
			count = 0;
	}
	if (count4 == 1)
		cout << "四条";
	else if (count3 == 1 && count2 == 1)
		cout << "三条带一对";
	else if (count3 == 1)
		cout << "三条带不同数值";
	else if (count2 == 2)
		cout << "两对";
	else if (count2 == 1)
		cout << "一对";
	else if (Is == 1)
		cout << "顺子";
	else
		cout << "神麻都不是";
	    
}

int main()
{
	int a[6];
	for (int i = 0; i < 5; i++)
		cin >> a[i];
	test(a, 5);
	system("pause");
	return 0;
}
//3 4 5 6 7 8 9 10 J Q K  A
//0 1 2 3 4 5 6  7 8 9 10 11


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值