练习题

来源:互联网 发布:vb自动处理网页弹框 编辑:程序博客网 时间:2024/06/11 18:41

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=str2return "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;}elsecarry = 0;str = char(r + '0') + str;}while (i != 0){r = str1[i - 1] - carry;if (r < 0){r += 10;carry = 1;}elsecarry = 0;str = char(r + '0') + str;}//被减数大于减数,最后肯定没有借位,不用判断//去掉先导0str.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;}elsecarry = 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');elsetemp = 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;elsecout << "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  8abc  123456789输出:abc0000012345678,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;}elsepos = (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);}elsei++;}*/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;}



0 0
原创粉丝点击