3.25 复试练习
OJ
改错+填空
strcpy--
strcpy(dest, src); // 将src复制到dest
strcmp--
strcmp(s1, s2);
| 返回值 | 含义 |
|---|---|
| 0 | 两个字符串相等 |
| > 0 | s1 大于 s2 |
| < 0 | s1 小于 s2 |
矩阵
质因数
问题描述
将一个正整数N(1<N<32768)分解质因数。例如,输入90,打印出90=2*3*3*5。
输入说明
输入一个正整数
输出说明
按照范例输出。
其中的质因数的输出顺序按照从小到大的顺序。
如果输入的整数本身是质数,则输出形式为:
3=3
输入范例
66
输出范例
66=2*3*11
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
cout<<n<<"=";
bool first=true;
for(int i=2;i<=n;i++)
{
while(n%i==0)
{
if(first)
{
cout<<i;
first=false;
}
else
cout<<"*"<<i;
n/=i;
}
}
return 0;
}
谁是老二?
问题描述
一维数组中存储不超过100个整型数据,请找出其中第二大的元素,输出这些元素的值以及它们的下标。
注意,由于元素值可能相同,因此具有最大值的元素个数可能不只一个,第二大的元素是比它们小的那些元素。
输入说明
用户可输入多组数据,每组数据由两行组成:
第一行:数组元素的个数n
第二行:n个数组元素,由空格分隔
输出说明
对于每组输入,输出一行,包含第二大的元素的值以及它们的下标(都是整数),整数之间以空格分隔。如果有多个下标,则下标按从小到大的顺序输出。每行的开头与结尾无多余空格。
每组输出占一行。
如果不存在第二大的元素,则输出"none"(不包含引号)
输入范例
3
2 5 4
10
1 3 5 2 4 3 7 5 7 7
5
2 2 2 2 2
输出范例
4 2
5 2 7
none
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
vector<int> arr(n);
for(int i=0;i<n;i++)
cin>>arr[i];
int max1=arr[0];//找到最大值
for(int i=1;i<n;i++)
{
if(max1<arr[i])
{
max1=arr[i];
}
}
int max2=INT_MIN;
bool found=false;
for(int i=0;i<n;i++)
{
if(max1>arr[i]&&arr[i]>max2)
{
max2=arr[i];
found=true;
}
}
if(!found)
cout<<"none"<<endl;
else
{
cout<<max2;
for(int i=0;i<n;i++)
{
if(max2==arr[i])
cout<<" "<<i;
}
cout<<endl;
}
}
return 0;
}
骑士斗恶龙--贪心
问题描述
你的王国里有一条n个头的恶龙,你希望雇佣一些骑士把它杀死(也就是砍掉所有的头)。
村里有m个骑士可以雇佣,一个能力值为 x 的骑士可以砍掉恶龙一个直径不超过 x 的头,且需要报酬 x 个金币。
如何雇佣骑士才能砍掉恶龙所有的头,并且支付最小的金币?
注意,一个骑士只能砍一个头并且仅能被雇佣1次。
输入说明
输入包含多组测试数据。
每组测试数据的第一行输入两个整数n和m(m和n都在1到20000 之间), n表示龙拥有的头的数目 , m表示王国中的骑士数。
接下来的 n 个整数为龙头的直径,再接下来m个整数为骑士的能力值。
输出说明
对于每组测试数据, 输出一行包含国王杀死龙需要支付的最低数量的金币。如果骑士不可能杀死龙, 输出一行:
“Lose!”(输出不包含引号)
输入范例
2 3
5
4
7
8
4
2 1
5
5
10
输出范例
11
Lose!
个人总结
-
排序:将龙头直径和骑士能力都从小到大排序
-
贪心匹配:用能力最小的骑士去砍能砍的最小龙头
-
双指针:一个指向龙头,一个指向骑士
-
累加金币:每匹配成功,累加该骑士的能力值
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
while(cin>>n>>m)
{
int num[n];//dragon
int power[m];
for(int i=0;i<n;i++)
cin>>num[i];
for(int i=0;i<m;i++)
cin>>power[i];
sort(num,num+n);
sort(power,power+m);
if(n>m)
{
cout<<"Lose!"<<endl;
continue;
}
int money=0;
int i=0,j=0;
while(i<n&&j<m)
{
if(power[j]>=num[i])
{
money+=power[j];
i++;
j++;
}
else
{
j++;
}
}
if(i==n)
cout<<money<<endl;
else
cout<<"Lose!"<<endl;
}
return 0;
}
蛇形方阵
问题描述
输出一个如下的n阶方阵。例如,若读入11,则输出:

输入说明
输入一个正整数n(n<20),表示需要输出n阶方阵。
输出说明
共输出n行n列,每个整数占4位,不足4位则左边补空格。
每行的最后无空格。
无多余空行。
输入范例
11
输出范例
1 2 3 4 5 6 7 8 9 10 11
22 21 20 19 18 17 16 15 14 13 12
23 24 25 26 27 28 29 30 31 32 33
44 43 42 41 40 39 38 37 36 35 34
45 46 47 48 49 50 51 52 53 54 55
66 65 64 63 62 61 60 59 58 57 56
67 68 69 70 71 72 73 74 75 76 77
88 87 86 85 84 83 82 81 80 79 78
89 90 91 92 93 94 95 96 97 98 99
110 109 108 107 106 105 104 103 102 101 100
111 112 113 114 115 116 117 118 119 120 121
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int arr[n][n];
int num=1;
for(int row=0;row<n;row++)
{
if(row%2==0)
{
for(int j=0;j<n;j++)
{
arr[row][j]=num++;
}
}
else
{
for(int j=n-1;j>=0;j--)
arr[row][j]=num++;
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cout<<setw(4)<<arr[i][j];//setw默认右对齐左边补0;如果要左对齐添加<<left<<setw(4)
}
cout<<endl;
}
return 0;
}
单词统计
问题描述
从键盘上输入一个整数N,并输入N行字符串。每行字符串都包含多个单词,单词之间以空格分开。请输出每行字符串中单词的个数。
说明:以空格分隔开的任何字符串都认为是单词。比如“I'm”认为是一个单词
输入说明
首先输入一行,包含一个整数N,表示共测试N组数据。
后面接着输入N行,每行为一个字符串,字符串长度小于等于50。每个字符串中包含多个单词,单词之间以空格分隔。
输出说明
对每组测试数据,你的程序需要向标准输出文件(通常为启动该程序的终端)依次输出字符串中单词的个数。每个输出占一行,在行首和行尾不要输出多余的空格。在所有数据前后,以及两组数据之间不要输出多余的空行。
输入范例
3
i am a boy.
byebyetoyou
haha , meet you again!
输出范例
4
1
5
总结
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();
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
cin.ignore();
string s;
while(n--)
{
getline(cin,s);
stringstream ss(s);
string word;
int count=0;
while(ss>>word)
{
count++;
}
cout<<count<<endl;
}
return 0;
}
转换成十进制
问题描述
编写一个程序,将一个2~20以内任意进制数转换成十进制。这些数据由数字0-9,大写字母A-J组成,其中A=10,B=11……J=19。例如16进制数5A转换为十进制数90(90=5*16+10*1)。
输入说明
程序需要输入多组数据,每组数据一行,每行有两个数,用空格隔开,分别表示当前进制数和被转换的数据。输入数据十进制数大小不会超过10000,例如:16 5A 表示将16进制数5A转换成10进制数。
输出说明
对于每行输入数据需输出一个结果。每个结果为一个十进制的数。例如:16 5A需输出结果90。
输入范例
16 5A
2 1111111
输出范例
90
127
代码
#include<bits/stdc++.h>
using namespace std;
int todecimal(string s,int n)
{
int res=0;
for(int i=s.length()-1;i>=0;i--)
{
if(s[i]<='9'&&s[i]>='0')
res+=(s[i]-'0')*pow(n,s.length()-1-i);
else
res+=(s[i]-'A'+10)*pow(n,s.length()-1-i);
}
return res;
}
int main()
{
int n;
string s;
while(cin>>n>>s)
{
cout<<todecimal(s,n)<<endl;
}
return 0;
}
十进制转其他进制
问题描述
编写一个程序,将一个十进制数转换成任意的2~20以内的其他进制数。这些数据由数字0-9,字母A-J组成,其中A=10,B=11……J=19。例如90转换为16进制数为5A(90=5*16+10*1)。
输入说明
程序需要输入多组数据,每组数据一行,每行有两个数,用空格隔开,分别表示十进制数和转换成的进制数。输入数据不会超过10000,例如:90 16 表示将90转换成16进制数。
输出说明
对于每行输入数据需输出一个结果。每个结果包含为一个20以内的进制的数。输出的字母都为大写字母。例如:90 16需输出结果5A。
输入范例
127 2
90 16
输出范例
1111111
5A
代码
#include<bits/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排序)最小的那个“最长相同子串”。
如果无相同子串,则输出空字符串(即空行)。
输入说明
输入多组测试数据,每组测试数据包含两行。
每行包含一个字符串,字符串中无空格,也无空字符串。
输出说明
对于每组测试数据,输出最长子串。如果最长子串为空,则输出一个空行。
每组输出占一行,行首与行尾无多余空格,也无多余空行。
输入范例
abcded123456aabbcc
abcdaa1234
abcdabcdabcd
abcda
输出范例
1234
abcda
代码
#include<bits/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(cin>>s1>>s2) {
cout << longeststring(s1, s2) << endl;
}
return 0;
}
冰雹数
问题描述
任意给定一个大于1的正整数N,
如果是偶数,执行: N / 2
如果是大于1的奇数,执行: N * 3 + 1
生成的新的数字再执行同样的动作,循环往复。
通过观察发现,这个数字会一会儿上升到很高,
一会儿又降落下来。
就这样起起落落的,但最终必会落到“1”
这有点像小冰雹粒子在冰雹云中翻滚增长的样子。
比如N=9
9,28,14,7,22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1
可以看到,N=9的时候,这个“小冰雹”最高冲到了52这个高度。
输入一个整数M,请输出一个正整数,表示所有不大于M的数字N中,经过冰雹数变换过程中,最高冲到了多少。
注意:从2到M这M-1个数字中,每一个数字N都能得到一系列冰雹数,需要求得所有冰雹数的最大值。
输入说明
从标准输入设备输入一个正整数M(1<M<10000)
输出说明
输出一个正整数,表示结果。
输入范例
10
输出范例
52
代码
#include<bits/stdc++.h>
using namespace std;
int maxbingbao(int n)
{
vector<int> arr;
int temp=n;
arr.push_back(temp);
while(temp!=1)
{
if(temp%2==0)
{
temp=temp/2;
arr.push_back(temp);
}
else
{
temp=temp*3+1;
arr.push_back(temp);
}
}
int max=arr[0];
for(int i=1;i<arr.size();i++)
{
if(max<arr[i])
max=arr[i];
}
return max;
}
int main()
{
int M;
cin>>M;
vector<int> res(M-1);
for(int N=2;N<=M;N++)
{
res[N-2]=maxbingbao(N);
}
int max=res[0];
for(int i=1;i<res.size();i++)
{
if(max<res[i])
max=res[i];
}
cout<<max;
return 0;
}
小数第n位
问题描述
我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数。
如果我们把有限小数的末尾加上无限多个0,它们就有了统一的形式。
本题的任务是:在上面的约定下,求整数除法小数点后的第n位开始的3位数。
输入说明
一行,三个整数:a b n,用空格分开。a是被除数,b是除数,n是所求的小数后位置(0<a,b,n<1000000000)
输出说明
一行,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;
}
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐




所有评论(0)