3.25 复试练习
OJ改错填空strcpy--strcpy(dest, src); // 将src复制到deststrcmp--strcmp(s1, s2);返回值含义0两个字符串相等 0s1 大于 s2 0s1 小于 s2矩阵质因数问题描述将一个正整数N(1N32768)分解质因数。例如输入90打印出902*3*3*5。输入说明输入一个正整数输出说明按照范例输出。其中的质因数的输出顺序按照从小到大的顺序。如果输入的整数本身是质数则输出形式为33输入范例66输出范例662*3*11代码#includebits/stdc.h using namespace std; int main() { int n; cinn; coutn; bool firsttrue; for(int i2;in;i) { while(n%i0) { if(first) { couti; firstfalse; } else cout*i; n/i; } } return 0; }谁是老二问题描述一维数组中存储不超过100个整型数据请找出其中第二大的元素输出这些元素的值以及它们的下标。注意由于元素值可能相同因此具有最大值的元素个数可能不只一个第二大的元素是比它们小的那些元素。输入说明用户可输入多组数据每组数据由两行组成第一行数组元素的个数n第二行n个数组元素由空格分隔输出说明对于每组输入输出一行包含第二大的元素的值以及它们的下标都是整数整数之间以空格分隔。如果有多个下标则下标按从小到大的顺序输出。每行的开头与结尾无多余空格。每组输出占一行。如果不存在第二大的元素则输出none不包含引号输入范例32 5 4101 3 5 2 4 3 7 5 7 752 2 2 2 2输出范例4 25 2 7none代码#includebits/stdc.h using namespace std; int main() { int n; while(cinn) { vectorint arr(n); for(int i0;in;i) cinarr[i]; int max1arr[0];//找到最大值 for(int i1;in;i) { if(max1arr[i]) { max1arr[i]; } } int max2INT_MIN; bool foundfalse; for(int i0;in;i) { if(max1arr[i]arr[i]max2) { max2arr[i]; foundtrue; } } if(!found) coutnoneendl; else { coutmax2; for(int i0;in;i) { if(max2arr[i]) cout i; } coutendl; } } return 0; }骑士斗恶龙--贪心问题描述你的王国里有一条n个头的恶龙你希望雇佣一些骑士把它杀死也就是砍掉所有的头。村里有m个骑士可以雇佣一个能力值为 x 的骑士可以砍掉恶龙一个直径不超过 x 的头且需要报酬 x 个金币。如何雇佣骑士才能砍掉恶龙所有的头并且支付最小的金币注意一个骑士只能砍一个头并且仅能被雇佣1次。输入说明输入包含多组测试数据。每组测试数据的第一行输入两个整数n和mm和n都在1到20000 之间, n表示龙拥有的头的数目 , m表示王国中的骑士数。接下来的 n 个整数为龙头的直径再接下来m个整数为骑士的能力值。输出说明对于每组测试数据, 输出一行包含国王杀死龙需要支付的最低数量的金币。如果骑士不可能杀死龙, 输出一行“Lose!”输出不包含引号输入范例2 3547842 15510输出范例11Lose!个人总结排序将龙头直径和骑士能力都从小到大排序贪心匹配用能力最小的骑士去砍能砍的最小龙头双指针一个指向龙头一个指向骑士累加金币每匹配成功累加该骑士的能力值代码#includebits/stdc.h using namespace std; int main() { int n,m; while(cinnm) { int num[n];//dragon int power[m]; for(int i0;in;i) cinnum[i]; for(int i0;im;i) cinpower[i]; sort(num,numn); sort(power,powerm); if(nm) { coutLose!endl; continue; } int money0; int i0,j0; while(injm) { if(power[j]num[i]) { moneypower[j]; i; j; } else { j; } } if(in) coutmoneyendl; else coutLose!endl; } return 0; }蛇形方阵问题描述输出一个如下的n阶方阵。例如若读入11则输出输入说明输入一个正整数nn20)表示需要输出n阶方阵。输出说明共输出n行n列每个整数占4位不足4位则左边补空格。每行的最后无空格。无多余空行。输入范例11输出范例1 2 3 4 5 6 7 8 9 10 1122 21 20 19 18 17 16 15 14 13 1223 24 25 26 27 28 29 30 31 32 3344 43 42 41 40 39 38 37 36 35 3445 46 47 48 49 50 51 52 53 54 5566 65 64 63 62 61 60 59 58 57 5667 68 69 70 71 72 73 74 75 76 7788 87 86 85 84 83 82 81 80 79 7889 90 91 92 93 94 95 96 97 98 99110 109 108 107 106 105 104 103 102 101 100111 112 113 114 115 116 117 118 119 120 121代码#includebits/stdc.h using namespace std; int main() { int n; cinn; int arr[n][n]; int num1; for(int row0;rown;row) { if(row%20) { for(int j0;jn;j) { arr[row][j]num; } } else { for(int jn-1;j0;j--) arr[row][j]num; } } for(int i0;in;i) { for(int j0;jn;j) { coutsetw(4)arr[i][j];//setw默认右对齐左边补0如果要左对齐添加leftsetw(4) } coutendl; } return 0; }单词统计问题描述从键盘上输入一个整数N并输入N行字符串。每行字符串都包含多个单词单词之间以空格分开。请输出每行字符串中单词的个数。说明以空格分隔开的任何字符串都认为是单词。比如“Im”认为是一个单词输入说明首先输入一行包含一个整数N表示共测试N组数据。后面接着输入N行每行为一个字符串字符串长度小于等于50。每个字符串中包含多个单词单词之间以空格分隔。输出说明对每组测试数据你的程序需要向标准输出文件通常为启动该程序的终端依次输出字符串中单词的个数。每个输出占一行在行首和行尾不要输出多余的空格。在所有数据前后以及两组数据之间不要输出多余的空行。输入范例3i am a boy.byebyetoyouhaha , meet you again!输出范例415总结stringstream--创建 stringstream 对象 // 方式1空对象 stringstream ss1; // 方式2用字符串初始化 stringstream ss2(hello world); // 方式3先创建后赋值 stringstream ss3; ss3 hello world; --向 stringstream 写入数据 stringstream ss; ss 123; ss ; ss 45.67; ss hello; cout ss.str() endl; // 输出: 123 45.67 hello --从 stringstream 读取数据 stringstream ss(123 45.67 hello); int a; double b; string c; ss a b c; cout a endl; // 123 cout b endl; // 45.67 cout c endl; // hello -- 方法 作用 示例 str() 获取字符串内容 string s ss.str(); str(string) 设置字符串内容 ss.str(hello); 从流中读取 ss num; 向流中写入 ss hello; clear() 清除错误状态 ss.clear();代码#includebits/stdc.h using namespace std; int main() { int n; cinn; cin.ignore(); string s; while(n--) { getline(cin,s); stringstream ss(s); string word; int count0; while(ssword) { count; } coutcountendl; } return 0; }转换成十进制问题描述编写一个程序将一个2~20以内任意进制数转换成十进制。这些数据由数字0-9大写字母A-J组成其中A10B11……J19。例如16进制数5A转换为十进制数90905*1610*1。输入说明程序需要输入多组数据每组数据一行每行有两个数用空格隔开分别表示当前进制数和被转换的数据。输入数据十进制数大小不会超过10000例如16 5A 表示将16进制数5A转换成10进制数。输出说明对于每行输入数据需输出一个结果。每个结果为一个十进制的数。例如16 5A需输出结果90。输入范例16 5A2 1111111输出范例90127代码#includebits/stdc.h using namespace std; int todecimal(string s,int n) { int res0; for(int is.length()-1;i0;i--) { if(s[i]9s[i]0) res(s[i]-0)*pow(n,s.length()-1-i); else res(s[i]-A10)*pow(n,s.length()-1-i); } return res; } int main() { int n; string s; while(cinns) { couttodecimal(s,n)endl; } return 0; }十进制转其他进制问题描述编写一个程序将一个十进制数转换成任意的2~20以内的其他进制数。这些数据由数字0-9字母A-J组成其中A10B11……J19。例如90转换为16进制数为5A905*1610*1。输入说明程序需要输入多组数据每组数据一行每行有两个数用空格隔开分别表示十进制数和转换成的进制数。输入数据不会超过10000例如90 16 表示将90转换成16进制数。输出说明对于每行输入数据需输出一个结果。每个结果包含为一个20以内的进制的数。输出的字母都为大写字母。例如90 16需输出结果5A。输入范例127 290 16输出范例11111115A代码#includebits/stdc.h using namespace std; string decimaltoelse(int decimal, int n) { if(decimal 0) return 0; string res ; int temp decimal; while(temp 0) { int remainder temp % n; if(remainder 10) { res char(0 remainder); } else { res char(A (remainder - 10)); } temp / n; } reverse(res.begin(), res.end()); return res; } int main() { int decimal, n; while(cin decimal n) { cout decimaltoelse(decimal, n) endl; } return 0; }最大相同子串问题描述输入两个字符串,获取两个字符串中最长相同子串并输出。如果有多个相同子串则输出按ASCII排序最小的那个“最长相同子串”。如果无相同子串则输出空字符串即空行。输入说明输入多组测试数据每组测试数据包含两行。每行包含一个字符串字符串中无空格也无空字符串。输出说明对于每组测试数据输出最长子串。如果最长子串为空则输出一个空行。每组输出占一行行首与行尾无多余空格也无多余空行。输入范例abcded123456aabbccabcdaa1234abcdabcdabcdabcda输出范例1234abcda代码#includebits/stdc.h using namespace std; string longeststring(string s1, string s2) { string result ; int maxLen 0; // 枚举所有可能的子串 for(int i 0; i s1.length(); i) { for(int j i; j s1.length(); j) { string sub s1.substr(i, j - i 1); // 检查子串是否在 s2 中 if(s2.find(sub) ! string::npos) { if(sub.length() maxLen) { maxLen sub.length(); result sub; } else if(sub.length() maxLen sub result) { result sub; // ASCII 较小的 } } } } return result; } int main() { string s1, s2; while(cins1s2) { cout longeststring(s1, s2) endl; } return 0; }冰雹数问题描述任意给定一个大于1的正整数N如果是偶数执行 N / 2如果是大于1的奇数执行 N * 3 1生成的新的数字再执行同样的动作循环往复。通过观察发现这个数字会一会儿上升到很高一会儿又降落下来。就这样起起落落的但最终必会落到“1”这有点像小冰雹粒子在冰雹云中翻滚增长的样子。比如N99,28,14,7,22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1可以看到N9的时候这个“小冰雹”最高冲到了52这个高度。输入一个整数M请输出一个正整数表示所有不大于M的数字N中经过冰雹数变换过程中最高冲到了多少。注意从2到M这M-1个数字中每一个数字N都能得到一系列冰雹数需要求得所有冰雹数的最大值。输入说明从标准输入设备输入一个正整数M1M10000输出说明输出一个正整数表示结果。输入范例10输出范例52代码#includebits/stdc.h using namespace std; int maxbingbao(int n) { vectorint arr; int tempn; arr.push_back(temp); while(temp!1) { if(temp%20) { temptemp/2; arr.push_back(temp); } else { temptemp*31; arr.push_back(temp); } } int maxarr[0]; for(int i1;iarr.size();i) { if(maxarr[i]) maxarr[i]; } return max; } int main() { int M; cinM; vectorint res(M-1); for(int N2;NM;N) { res[N-2]maxbingbao(N); } int maxres[0]; for(int i1;ires.size();i) { if(maxres[i]) maxres[i]; } coutmax; return 0; }小数第n位问题描述我们知道整数做除法时有时得到有限小数有时得到无限循环小数。如果我们把有限小数的末尾加上无限多个0它们就有了统一的形式。本题的任务是在上面的约定下求整数除法小数点后的第n位开始的3位数。输入说明一行三个整数a b n用空格分开。a是被除数b是除数n是所求的小数后位置0a,b,n1000000000输出说明一行3位数字表示a除以b小数后第n位开始的3位数字。比如输入1 8 3则输出500输入范例282866 999000 6输出范例914代码#include iostream using namespace std; int main() { int a, b, n; cin a b n; int remainder a % b;//去掉整数部分留下余数 // 移动到第 n 位 for (int i 0; i n - 1; i) { remainder (remainder * 10) % b; } // 获取第 n 位开始的三位数字 for (int i 0; i 3; i) { remainder (remainder * 10); int digit remainder / b; cout digit; remainder remainder % b; } cout endl; return 0; }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2455472.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!