练习题

1、笨笨熊搬家交通篇

/*
森林里的苯苯熊要乔迁新喜,上次他已经将物品打包完成,并约了朋友来帮忙。接下来他要选定一个搬家的时间,想了很久,就决定在国庆节进行,因为国庆放假朋友们都有时间啦。
但是在森林里,从他现在房子到新豪宅,所经之地有山有水,路途曲折,甚至有些道路是不通的。
请你和他一起查看指定的地图,看看从笨笨熊现在的房子到新宅之间,道路是否是畅通的呢?
地图是R行、C列的矩阵,矩阵的每一个格子刚好是一天的行程。
矩阵由“B”、“-”、“#”、“H”四种字符成员组成,其中:
B: 代表苯苯熊现在的房子;
H: 代表笨笨熊新的豪宅;
-: 代表可以通行的道路;
#: 代表无法通过的障碍(高山、大河等);
此外,森林里也有交通规则地:在任务位置,只能向“上、下、左、右”四个方向中的其中一个方向行走.
运行时间限制:无限制

内存限制:无限制
输入:
4  // R的数值
4  // C的数值,下面是地图。
--##---
B-----H
#---#--
-------
输出:
Y //代表道路可达
或
N //代表道路不通

样例输入:

15-B-H#

样例输出:

Y
*/
#include <iostream>
using namespace std;
void search(char **map, int **num,int r, int c);
int R, C;
//struct m
//{
//	char path;
//	int visit;
//};
int main()
{
	cin >> R>>C;
	int row, col;
	char**map = new char*[R];
	int**num = new int*[R];
	for (int i = 0; i < R; i++)
	{
		map[i] = new char[C];
		num[i] = new int[C];
		for (int j = 0; j < C; j++)
		{
			cin >> map[i][j];
			num[i][j] = 0;
			if ('B' == map[i][j])
			{
				row = i; col = j;
			}
		}
	}
	search(map,num, row, col);
	return 0;
}
void search(char **map,int **num, int r, int c)                                    //这个程序的问题是找到H之后,外面的循环还在继续,所以应该增加一个flag,return,判断,如果flag=1,就跳出return
{
	int i = r, j = c;
	num[i][j] = 1;                                                        
	if ('H' != map[i][j])
	{
		if (i - 1 >= 0 && '#' != map[i - 1][j] && 0 == num[i - 1][j])
			search(map, num, i - 1, j);
		if (i + 1 < R&&'#' != map[i + 1][j] && 0 == num[i + 1][j])
			search(map, num, i + 1, j);
		if (j - 1 >= 0 && '#' != map[i][j - 1] && 0 == num[i][j - 1])
			search(map, num, i, j - 1);
		if (j + 1 < C && '#' != map[i][j + 1] && 0 == num[i][j + 1])
			search(map, num, i, j + 1);
	}
	else if ('H' == map[i][j])
	{
		cout << 'Y' << endl;
		return;
	}
	else
	{
		cout << 'N' << endl;
		return;
	}
}

3、大数四则运算

#include <iostream>
#include <string>
#include <stack>
using namespace std;
string BIGNumMin(string &str1, string &str2);
string BIGNumAdd(string &str1, string &str2);
//加法
string BIGNumAdd(string &str1, string &str2)
{
	int sign=1;               //符号位
	string str;
	/*先判断两个数的正负,转化成无符号数进行计算*/
	if ('-' == str1[0])
	{
		if ('-' == str2[0])                                                //如果两个都为负,符号位置为-,去掉负号进行无符号数加法运算
		{
			sign = -1;                                                     
			str=BIGNumAdd(str1.erase(0, 1), str2.erase(0, 1));
		}
		else                                                              //如果一正一负,进行无符号数减法运算
			str=BIGNumMin(str2, str1.erase(0, 1));
	}
	else if ('-' == str2[0])
	{
		str=BIGNumMin(str1, str2.erase(0, 1));
	}
	else                                                                   //两个都为正,进行无符号数加法
	{
		int r, carry = 0;                                                   //carry表示进位
		string::size_type i = str1.size(), j = str2.size();
		while (i != 0 && j != 0)
		{
			r = (str1[i - 1] - '0' + str2[j - 1] - '0' + carry) % 10;     
			carry = (str1[i - 1] - '0' + str2[j - 1] - '0'+carry) / 10;
			str = char(r + '0') + str;                                    //str+=(r+'0'),但是用str = char(r + '0') + str的话,char(r+'0')是拼接在str前面的
			i--; j--;
		}
		while (i != 0)
		{
			r = (str1[i - 1] - '0' + carry) % 10;
			carry = (str1[i - 1] - '0' + carry) / 10;
			str = char(r + '0') + str;
			i--;
		}
		while (j != 0)
		{
			r = (str2[j - 1] - '0' + carry) % 10;
			carry = (str2[j - 1] - '0' + carry) / 10;
			str = char(r + '0') + str;
			j--;
		}
		if (1 == carry)                                                //判断是否还有进位
			str = '1' + str;
	}
	//判断符号位
	if (-1 == sign&&str[0] != 0)                                       //str[0]!=0,结果不为0的时候添加负号
		str = '-' + str;
	return str;
}
//减法
string BIGNumMin(string &str1, string &str2)
{
	int sign = 1;
	string str;
	//判断str1、str2的符号,转化成无符号数的运算
	if ('-' == str1[0])
	{
		if ('-' == str2[0])
			str = BIGNumMin(str2.erase(0, 1), str1.erase(0, 1));
		else
		{
			sign = -1;
			str = BIGNumAdd(str1.erase(0, 1), str2.erase(0, 1));
		}
	}
	else if ('-' == str2[0])
		str = BIGNumAdd(str1, str2.erase(0, 1));
	else
	{
		int r, carry = 0;                                            //carry表示借位
		string::size_type i = str1.size(), j = str2.size();
		if (!str1.compare(str2))                                     //如果str1=str2
			return "0";                                              //返回值是string类型
		//确保被减数大于减数
		if (i < j)                                                   //str1长度小于str2,交换它们的值
		{
			sign = -1;
			string temp = str1;
			str1 = str2;
			str2 = temp;
		}
		if (i=j&&str1.compare(str2) < 0)                            //两个字符串长度相等,则用compare逐位比较,如果str1的值小于str2,交换它们的值
		{
			sign = -1;
			string temp = str1;
			str1 = str2;
			str2 = temp;
		}
		for (i = str1.size(), j = str2.size(); i != 0 && j != 0; i--, j--)
		{
			r = str1[i - 1] - str2[j - 1] - carry;
			if (r < 0)
			{
				r += 10;
				carry = 1;
			}
			else
				carry = 0;
			str = char(r + '0') + str;
		}
		while (i != 0)
		{
			r = str1[i - 1] - carry;
			if (r < 0)
			{
				r += 10;
				carry = 1;
			}
			else
				carry = 0;
			str = char(r + '0') + str;
		}
		//被减数大于减数,最后肯定没有借位,不用判断
		//去掉先导0
		str.erase(0, str.find_first_not_of('0'));
		if (str.empty()) 
			str = "0";
	}
	//判断符号位
	if ((sign == -1) && (str[0] != '0')) 
		str = "-" + str;
	return str;
}
/*void BIGNumMinus(string &str1, string &str2, string &result)
{
	int r,carry=0;
	string temp;
	int i = str1.size(), j = str2.size();
	if (i == j)
	{
		for (i, j; i != 1; i--, j--)
		{
			r = str1[i - 1] - str2[j - 1] - carry;
			if (r < 0)
			{
				carry = 1;
				r += 10;
			}
			else
				carry = 0;
			temp += (r + '0');
		}
		r = str1[i - 1] - str2[j - 1] - carry;
		if (r < 0)
		{
			r -= 2 * r;
			temp += (r + '0');
			temp += '-';
		}
		else if (r>0)
			temp += (r + '0');
		else
			temp = temp;
		int len = temp.size();
		while (len != 0)
		{
			len--;
			result += temp[len];
		}
	}
}
*/
int main()
{
	string str1, str2, result;
	cin >> str1 >> str2;
	result=BIGNumAdd(str1, str2);
	cout << result << endl;
	return 0;
}

4、大数相减

/*
输入两行字符串正整数,第一行是被减数,第二行是减数,输出第一行减去第二行的结果。
备注:1、两个整数都是正整数,2、被减数大于减数 
示例: 
输入:1000000000000001 
1  
输出:1000000000000000
*/
这部分代码目前不能提供了,防止华为机考有作弊嫌疑。

5、判断if语句括号是否合法

/*
编程的时候,if条件里面的“(”、“)”括号经常出现不匹配的情况导致编译不过,请编写程序检测输入一行if语句中的圆括号是否匹配正确。
同时输出语句中出现的左括号和右括号数量,如if((a==1)&&(b==1))是正确的,而if((a==1))&&(b==1))是错误的。注意if语句的最外面至少有一对括号。
输入:if((a==1)&&(b==1)) 输出:RIGTH 3 3  
输入:if((a==1))&&(b==1)) 输出:WRONG 3 4
*/
#include <iostream>
#include <string>
using namespace std;
int main()
{
	string str1;
	cin >> str1;
	int left=0, right=0,flag=0;
	int *str2 = new int[str1.size()];      //模拟栈
	int cnt=0;                             //记录栈顶
	if (str1[2] != '('&&str1[str1.size()] != ')')
		flag = 1;
	for (int i = 2; i < str1.size(); i++)
	{
		if ('(' == str1[i])                //遇到(,压栈
		{
			if (left != 0 && 0 == cnt)     //除第一个括号之外,栈不能为空,否则错
				flag = 1;
			str2[cnt] =str1[i];            //如果是字符串,不初始化不能使用下标
			cnt++;
			left++;
		}
		else if (')' == str1[i])          //遇到),出栈
		{
			if (0 == cnt)                 //如果此时栈为空或栈顶不是(,错
				flag = 1;
			else if (str2[cnt - 1] != '(')
				flag = 1;
			cnt--;
			right++;
		}
	}
	if (1 == flag)
		cout << "WRONG " << left << " " << right << endl;
	else
		cout << "RIGHT " << left << " " << right << endl;
	return 0;
}

6、删除重复数字,逆序输出

/*
题目:
输入一个整数,如12336544,或1750,然后从最后一位开始倒过来输出,最后如果是0,则不输出,
输出的数字是不带重复数字的,所以上面的输出是456321和571。如果是负数,输入-175,输出-571
*/
#include <iostream>
#include <string>
using namespace std;
int main()
{
	string num1;
	cin >> num1;
	int len = num1.size();
	int temp = 0;
	if ('-' == num1[0])
	{
		string num2;
		for (int i = len - 1; i > 0; i--)
		{
			if (num1[i] != '0')
			{
				temp = i;
				break;
			}
		}
		for (int i = temp; i > 0; i--)
			num2 += num1[i];
		for (int i = 0; i<num2.size() - 1; i++)
		{
			for (int j = i + 1; j < num2.size();)
			{
				if (num2[i] == num2[j])
					num2.erase(j,1);
				else j++;
			}
		}
		cout <<'-'<< num2<<endl;
	}
	else
	{
		string num2;
		for (int i = len - 1; i >= 0; i--)
		{
			if (num1[i] != '0')
			{
				temp = i;
				break;
			}
		}
		for (int i = temp; i>=0; i--)
			num2 += num1[i];
		for (int i = 0; i<num2.size()-1; i++)
		{
			for (int j = i + 1; j < num2.size();)
			{
				if (num2[i] == num2[j])
					num2.erase(j,1);
				else j++;
			}
		}
		cout << num2 << endl;
	}
	return 0;
}

7、工时检查

这部分也暂时不能提供了。

8、删除字符串中的指定字符串

/*
问题描述:

在给定字符串中查找所有特定子串并删除,如果没有找到相应子串,则不作任何操作。
要求实现函数:
int delete_sub_str(const char *str, const char *sub_str, char *result_str)
【输入】 str:输入的被操作字符串
sub_str:需要查找并删除的特定子字符串
【输出】 result_str:在str字符串中删除所有sub_str子字符串后的结果
【返回】 删除的子字符串的个数
注:
I、   子串匹配只考虑最左匹配情况,即只需要从左到右进行字串匹配的情况。比如:
在字符串"abababab"中,采用最左匹配子串"aba",可以匹配2个"aba"字串。如果
匹配出从左到右位置2开始的"aba",则不是最左匹配,且只能匹配出1个"aba"字串。
II、  输入字符串不会超过100 Bytes,请不用考虑超长字符串的情况。

示例
输入:str = "abcde123abcd123"
sub_str = "123"
输出:result_str = "abcdeabcd"
返回:2
*/
#include <iostream>
#include <string>
using namespace std;
int delete_sub_str(const char *str, const char *sub_str, char *result_str)
{
	int cnt = 0;
	int t = 0;
	int i = 0;
	for (i; i < strlen(str) - strlen(sub_str) + 1;)
	{
		//与子串首字母相同
		if (str[i] == sub_str[0])
		{
			int j = 0;
			//判断剩余是否相同
			for (j; j < strlen(sub_str) ; j++)                   //用strncmp
			{
				if (str[i + j] != sub_str[j])
					break;
			}
			//如果相同,i后移j个位置
			if (j == strlen(sub_str))
			{
				cnt++; i = i + j;
			}
			//不相同从i后一个位置重新检查
			else
			{
				result_str[t] = str[i];
				t++;
				i++;
			}
		}
		//与子串首字母不同,直接放到结果中
		else
		{
			result_str[t] = str[i];
			t++;
			i++;
		}
	}
	//补上最后的几个字符
	for (i; i < strlen(str); i++)
	{
		result_str[t] = str[i];
		t++;
	}
	result_str[t] = '\0';
	return cnt;
}
int main()
{
	char str[101], sub_str[101], result_str[101],a;
	scanf_s("%c", &a);
	int i = 0;
	while (a != '\n')
	{
		str[i] = a;
		i++;
		scanf_s("%c", &a);
	}
	str[i] = '\0';
	scanf_s("%c", &a);
	i = 0;
	while (a != '\n')
	{
		sub_str[i] = a;
		i++;
		scanf_s("%c", &a);
	}
	sub_str[i] = '\0';
	int cnt = delete_sub_str(str, sub_str, result_str);
	cout << result_str << endl;
	return 0;
}

9、小熊搬家

#include <iostream>
using namespace std;
void bubsort(int arr[],int n);
int main()
{
	int V, N, sum;
	sum = 0;
	int M[1000];
	cin >> V >> N;
	for (int i = 0; i < N; i++)
		cin >> M[i];
	bubsort(M, N);
	for (int i = 0, j = N-1; i < j;)
	{
		if (M[i] + M[j] <= V)
		{
			sum++;
			i++; j--;
		}
		else
		{
			sum++;
			j--;
		}
		if (i == j)
		{
			sum++;
			break;
		}
	}
	cout << sum << endl;
	return 0;
}
void bubsort(int arr[], int n)
{
	int i, j, temp;
	for (i = n - 1; i > 0; i--)
	{
		for (j = 0; j < i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}

10、字符串截取

/*
按要求分解字符串,输入两个数M,N,M代表输入的M个待处理的字符串,N代表输出的每串字符串要处理成的位数,不够补0。
例如:
输入:2  8
abc  123456789
输出:abc00000
12345678,90000000
*/
#include <iostream>
#include <string>
using namespace std;
int main()
{
	int M, N;
	cin >> M >> N;
	string str1;
	for (int i = 0; i < M; i++)
	{
		cin >> str1;
		int len = str1.size();
		/*if (0 == len%N)
		{
			for (int j = 0; j < len; j += N)
			{
				for (int l = 0; l < N; l++)
					cout << str1[j + l];
				if (j!=len-N)
				    cout << ',';
			}
		}
		else
		{
			for (int j = 0; j < N - (len%N); j++)             //先补零
				str1 += '0';
			for (int j = 0; j < len; j += N)
			{
				for (int l = 0; l < N; l++)
					cout << str1[j + l];
				if (j != len - N)
					cout << ',';
			}
		}*/
		/*
		for (int j = 0; j < len; j++)
		{
			cout << str1[j];
			int l = (j + 1) % N;
			if (0 == l&&(j+1)!=len)
				cout << ',';
		}
		for (int j = (len%N); j <= N && (len%N) != 0; j++)
			cout << '0';
		cout << endl;
		*/
		int j = 0;
		for (j; j<len; j += N)                //N个N个输出
		{
			int l = 0;
			for (l; l < N&&(j+l)<len; l++)    //(j+l)用来防止最后不够N个的时候溢出
				cout << str1[j + l];
			if (N==l&&(j+l)!=len)             //如果输出够了N个,且不是最后结尾,添加一个逗号
			    cout << ',';
		}
		for (int i = 0; (len%N) != 0&&i < N - (len%N); i++)  //补零
			cout << '0';
		cout << endl;
	}
	return 0;
}

11、字符串消消消

/*
输入两个字符串,将第一个字符串中与第二个字符串相同的部分消掉,直到第一个字符串中没有与第二个字符串相同的部分。
优先消除靠近第一个字符串串首的相同部分。假设两个字符串不会完全相同。
输入:两个字符串,以空格隔开,最大长度为256字符
输出:余下未消除的字符串
样例输入:abc121233 123 
样例输出:abc
*/
这部分同理,晚点再贴出来。

12、约瑟夫环变种(忘记问题了)

#include <iostream>
using namespace std;
void array_iterate(int len, int input_array[], int m, int output_array[])
{
	int pos=0, res, cnt=0, len1=len;
	while (cnt < len)
	{
		res = m%len1;
		if (0 == res)
			res = len1;
		for (int i = 0; i < res;)
		{
			if (input_array[pos] != 0)
			{
				i++; 
				m = input_array[pos];
				pos = (pos + 1) % len;
			}
			else
				pos = (pos + 1) % len;
		}
		output_array[cnt] = m;
		cnt++;
		input_array[pos-1] = 0;
		len1--;
	}
}
int main()
{
	int len, m;
	cin >> len >> m;
	int *input_array = new int[len];
	for (int i = 0; i < len; i++)
		cin >> input_array[i];
	int *output_array = new int[len];
	array_iterate(len, input_array, m, output_array);
	for (int i = 0; i < len; i++)
		cout << output_array[i] << " ";
	cout << endl;
	return 0;
}

13、去掉最大值最小值剩余个数

/*
输入一串数,以','分隔,输出所有数中去掉最大值、最小值之后剩下的个数。
(其中最大值与最小值可能有多个)  Smple input:3,3,5,3,6,9,7,9   
Sample outPut: 3
*/
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
	vector<int> a;
	string b;
	/*cin>>b;
	for(int i=0;i<b.size();)
	{
		if(b[i]!=',')
		{
			int temp=0;
			while(b[i]!=','&&i<b.size())         //所有在循环中嵌套循环,然后进行了自增自减的,都要防止溢出
		    {
			temp=10*temp+b[i]-'0';
			i++;
		    }
		    a.push_back(temp);
		}
		else
			i++;
	}*/
	char c;int d;
	while(cin>>d)
	{
		a.push_back(d);
		scanf("%c",&c);
		if('\n'==c)
			break;
	}
	sort(a.begin(),a.end());
	int cnt=a.size()-2;                          //不计最大值和最小值
	vector<int>::iterator i=a.begin();
	while(*i==*(i+1)&&i<a.end()-1)
	{
		cnt--;
		i++;
	}
	i=a.end()-1;
	while(*i==*(i-1)&&i>a.begin())
	{
		cnt--;
		i--;
	}
	cout<<cnt<<endl;
	return 0;
}

14、选礼仪

/*
要从5个人中选取2个人作为礼仪,其中每个人的身高范围为160-190,
要求2个人的身高差值最小(如果差值相同的话,选取其中最高的两人),以升序输出两个人的身高。  
Smple input:161 189 167 172 188 Sample outPut: 188 189
*/
#include <iostream>
using namespace std;
int main()
{
	int height[5];
	for(int i=0;i<5;i++)
		cin>>height[i];
	for(int i=0;i<4;i++)
	{
		for(int j=0;j<4-i;j++)
		{
			if(height[j]>height[j+1])
				swap(height[j],height[j+1]);
		}
	}
	int minus[4];                //记录身高差
	int min=40;                  //记录最小差值
	int pos=0;                   //记录差值最小位置
	for(int i=0;i<4;i++)
	{
		minus[i]=height[i+1]-height[i];
		if(minus[i]<=min)         //不能漏掉=号
		{
				min=minus[i];
				pos=i;
		}
	}
	cout<<height[pos]<<" "<<height[pos+1]<<endl;
	return 0;
}

15、亮着灯的盏数

/*
题目:亮着电灯的盏数
一条长廊里依次装有n(1≤n≤65535)盏电灯,从头到尾编号1、2、3、…n-1、n。每盏电灯由一个拉线开关控制。开始,电灯全部关着。
有n个学生从长廊穿过。第一个学生把号码凡是1的倍数的电灯的开关拉一下;接着第二个学生把号码凡是2的倍数的电灯的开关拉一下;
接着第三个学生把号码凡是3的倍数的电灯的开关拉一下;如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下。
n个学生按此规定走完后,长廊里电灯有几盏亮着。
*/
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
	double n;
	cin>>n;
	int cnt=0;
	for(int i=1;i<=sqrt(n);i++)
	{
			cnt++;
	}
	cout<<cnt<<endl;
	return 0;
}

16、划分及格线

/*
题目:从考试成绩中划出及格线
10个学生考完期末考试评卷完成后,A老师需要划出及格线,要求如下:
(1) 及格线是10的倍数;
(2) 保证至少有60%的学生及格;
(3) 如果所有的学生都高于60分,则及格线为60分
 
输入:输入10个整数,取值0~100
输出:输出及格线,10的倍数
*/
#include <iostream>
using namespace std;
int main()
{
	int line;
	int score[10];
	for(int i=0;i<10;i++)
	{
		cin>>score[i];
	}
	for(int i=0;i<9;i++)
	{
		for(int j=0;j<10-i-1;j++)
		{
			if(score[j]<score[j+1])
				swap(score[j],score[j+1]);
		}
	}
	if(score[0]>=60)
		line=60;
	else 
		line=score[4]/10*10;
	cout<<line<<endl;
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值