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!

个人总结
  1. 排序:将龙头直径和骑士能力都从小到大排序

  2. 贪心匹配:用能力最小的骑士去砍能砍的最小龙头

  3. 双指针:一个指向龙头,一个指向骑士

  4. 累加金币:每匹配成功,累加该骑士的能力值

代码
#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,则输出:

无标题.png


 

输入说明

输入一个正整数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;
}

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐