Skip to content

Latest commit

 

History

History
471 lines (415 loc) · 9.46 KB

阶段性测试一.md

File metadata and controls

471 lines (415 loc) · 9.46 KB

19阶段性测试

这次测试题题目中规中矩,不是很难也不是很简单。在这里给出一些题解,有的我也不一定会,毕竟实验室大佬很多。

熊文静的抖音密码

这题很简单,简单的模拟题直接给出代码

C代码

#include <stdio.h>
int main()
{
    char s[100];
    int n;
    scanf("%d", &n);
    getchar();
    gets(s);
    for (int i = 0; s[i] != '\0'; i++)
        s[i] = (s[i] - 'a' + n) % 26 + 'a';
    puts(s);
}

许钟乐的诛心算比赛

这题就是一个暴力搜,数据范围很小,我的做法是先把a数组所有的能加的情况加起来放到另一个数组b,然后a数组与b数组里的数一一比较。

下面给出代码

C代码

#include <iostream>
using namespace std;
int main()
{
    int n;
    scanf("%d", &n);
    int a[105], b[10005], cot = 0;
    for (int i = 0; i < n; i++)
        scanf("%d", &a[i]);
    for (int i = 0; i < n - 1; i++)
        for (int j = i + 1; j < n; j++)
            b[cot++] = a[i] + a[j];
    int ans = 0;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < cot; j++)
            if (a[i] == b[j])
            {
                ans++;
                break;
            }
    }
    printf("%d", ans);
    return 0;
}

C++代码

#include <iostream>
#include <vector>
using namespace std;
vector<int> v;
int main()
{
    int n, a[1000];
    cin >> n;
    int cot = 0;
    vector<int> v(n);
    for (int i = 0; i < n; i++)
        cin >> a[i];
    for (int i = 0; i < n - 1; i++)
        for (int j = i + 1; j < n; j++)
            v.push_back(a[i] + a[j]);
    for (int i = 0; i < n; i++)
        for (auto j : v)
            if (a[i] == j)
            {
                cot++;
                break;
            }
    cout << cot << endl;
}

函数方程

这题由于数据过小,直接暴力搜,当数据大了的话,可以用二分。

由于这题数据比较小。所以直接暴力搜。

C代码

#include <stdio.h>
#define INF 1E-6
int check(double x)
{
    if (x * x * x * x * x - 15 * x * x * x * x + 85 * x * x * x - 225 * x * x + 274 * x - 121 < INF)
        return 1;
    return 0;
}
int main()
{
    for (double i = 1.5; i <= 2.4; i += 0.00001)
        if (check(i))
        {
            printf("%.5lf", i);
            break;
        }
}

或者这题直接写答案就可以

#include <stdio.h>
int main(){
	printf("1.84902");
}

A+B

这题一看就不能用long long因为long long的范围就是$-2^{63}$ ~ $2^{63}-1$化简一下就是-9223372036854775808 ~ 9223372036854775807所以这个范围肯定超了long long,所以我们要用字符串模拟。

C代码

#include <stdio.h>
#include <string.h>
const int N = 10005;

void reverse(char s[])
{
    int len = strlen(s);
    for (int i = 0, j = len - 1; i < j; i++, j--)
    {
        char t = s[i];
        s[i] = s[j];
        s[j] = t;
    }
}

void add(char s1[], char s2[], char ans[])
{
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    reverse(s1);
    reverse(s2);
    int hex = 0, i;
    int len = len1 > len2 ? len1 : len2;
    for (i = 0; i < len; i++)
    {
        int a = 0;
        int b = 0;
        if (i < len1)
            a = s1[i] - '0';
        if (i < len2)
            b = s2[i] - '0';
        ans[i] = (a + b + hex) % 10 + '0';
        hex = (a + b + hex) / 10;
    }
    if (hex)
        ans[i++] = hex + '0';
    ans[i] = '\0';
    reverse(ans);
}

int main()
{
    char s1[N], s2[N], ans[N];
    scanf("%s%s", s1, s2);
    add(s1, s2, ans);
    printf("%s\n", ans);
}

C++ 代码

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string add(string a, string b)
{
    int hex = 0;
    reverse(a.begin(), a.end());
    reverse(b.begin(), b.end());
    int len1 = a.length();
    int len2 = b.length();
    string ans;
    for (int i = 0, j = 0; i < len1 || j < len2; i++, j++)
    {
        int num1 = 0, num2 = 0;
        if (i < len1)
            num1 = a[i] - '0';
        if (j < len2)
            num2 = b[i] - '0';
        ans = char((num1 + num2 + hex) % 10 + '0') + ans;
        hex = (num1 + num2 + hex) / 10;
    }
    if (hex)
        ans = char(hex + '0') + ans;
    return ans;
}
int main()
{
    string a, b;
    while (cin >> a >> b)
        cout << add(a, b) << endl;
}

这种高精度算法是很常见的算法,希望大家一定牢记在心。

解密数字

这题是一题找规律题,给了一个表格可以得出来很简单的规律,首先进行n的转换$n\rightarrow n+1$,然后将$n+1$转成二进制然后除去最高位进制。

下面直接给代码

C代码

#include <stdio.h>
#include <string.h>
const int N = 10005;
int ans[N];

int main()
{
    int n;
    while (~scanf("%d", &n))
    {
        int cot = 0;
        ++n;
        while (n)
        {
            ans[cot++] = (n % 2);
            n >>= 1;
        }
        for (int i = cot - 2; i >= 0; i--)
            printf("%d", ans[i]);
        printf("\n");
    }
}

C++ 代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int s;
    while (cin >> s)
    {
        ++s;
        string ans;
        while (s)
        {
            ans = (s & 1 ? '1' : '0') + ans;
            s >>= 1;
        }
        cout << ans.substr(1) << '\n';
    }
}

后缀表达式

这题是数据结构上的东西,要用到栈,想学的就去查一下。

我直接上C++代码

C++代码

#include <iostream>
#include <cctype>
#include <stack>
using namespace std;
using ll = long long;

string RPN(string s)
{
    stack<char> st;
    string ans;
    for (int j = 0; j < s.size(); j++)
    {
        char i = s[j];
        if (isdigit(i) || isalpha(i))
        {
            while (isdigit(s[j]))
            {
                ans += s[j];
                j++;
            }
            ans += '#';
            j--;
            continue;
        }
        if (i == '(')
            st.push('(');
        else if (i == ')')
        {
            while (!st.empty() && st.top() != '(')
            {
                ans += st.top();
                st.pop();
            }
            st.pop();
        }
        else if (i == '+' || i == '-')
        {
            while (!st.empty() && st.top() != '(')
            {
                ans += st.top();
                st.pop();
            }
            st.push(i);
        }
        else if (i == '*' || i == '/')
        {
            while (!st.empty())
            {
                if (st.top() == '*' || st.top() == '/')
                {
                    ans += st.top();
                    st.pop();
                }
                else
                    break;
            }
            st.push(i);
        }
    }
    while (!st.empty())
    {
        ans += st.top();
        st.pop();
    }
    return ans;
}
double slove(string s)
{
    ll a = 0;
    stack<double> st;
    for (auto i : s)
    {
        if (isdigit(i))
        {
            a = a * 10 + (i - '0');
        }
        else if (i == '#')
        {
            st.push(a);
            a = 0;
        }
        else
        {
            if (i == '+')
            {
                double a = st.top();
                st.pop();
                double b = st.top();
                st.pop();
                st.push(a + b);
            }
            if (i == '-')
            {
                double a = st.top();
                st.pop();
                double b = st.top();
                st.pop();
                st.push(b - a);
            }
            if (i == '*')
            {
                double a = st.top();
                st.pop();
                double b = st.top();
                st.pop();
                st.push(a * b);
            }
            if (i == '/')
            {
                double a = st.top();
                st.pop();
                double b = st.top();
                st.pop();
                st.push(b * 1.0 / a);
            }
        }
    }
    return st.top();
}

int main()
{
    string s;
    while (cin >> s)
    {
        printf("%.4lf\n", slove(RPN(s)));
    }
}

小文的烤鸡

这题是实验室的贾佬憨出的,虽然看了像在骂我,但是我不介意。这题直接暴力搜就好,没事么问题。

C语言

#include <stdio.h>
int main()
{
    int t[5005][10];
    int a, b, c, d, e, f, g, h, i, j, n,ans=0;
    scanf("%d", &n);
    for (a = 1; a <= 3; a++)
    for (b = 1; b <= 3; b++)
    for (c = 1; c <= 3; c++)
    for (d = 1; d <= 3; d++)
    for (e = 1; e <= 3; e++)
    for (f = 1; f <= 3; f++)
    for (g = 1; g <= 3; g++)
    for (h = 1; h <= 3; h++)
    for (i = 1; i <= 3; i++)
    for (j = 1; j <= 3; j++)
    if(a + b + c + d + e + f + g + h + i + j == n){
            t[ans][0]=a;
            t[ans][1]=b;
            t[ans][2]=c;
            t[ans][3]=d;
            t[ans][4]=e;
            t[ans][5]=f;
            t[ans][6]=g;
            t[ans][7]=h;
            t[ans][8]=i;
        	t[ans][9]=j;
            ans++;
    }
    printf("%d\n", ans);
    if(ans == 0)
    	printf("%d", 0);
	else
    	for(int i=0; i < ans; i++)
        	printf("%d %d %d %d %d %d %d %d %d %d\n", t[i][0], t[i][1], t[i][2], t[i][3], t[i][4], t[i][5], t[i][6], t[i][7], t[i][8], t[i][9]);
}

吐了,写了这么多循环。

探险日志

大佬的题真的强,我不会,我哭辽。明天找叶大佬交易一波,让他教我怎么写,我在把这题补全。