pat 乙级 1021~1030

文章目录

1021
1022
1023
1024
1025
1026
1027
1028
1029
1030


1021

解题思路:

用string存储整数,for遍历循环,定义9个长度的数组,对应的值++,最后按顺序输出数组元素不为0的

参考代码:

#include<iostream>
using namespace std;
/*
    解题思路:
    1.
*/
int main()
{
    string s;
    int a[10]={0};
    cin >> s;
    for(int i=0; i<s.length(); i++)
        a[s[i]-'0']++;
    for(int i=0; i<10; i++)
    {
        if(a[i]!=0)
            cout << i << ':' << a[i] << endl;
    }
    return 0;
}

注意事项:

有时候,用vector发生错误,就直接用普通数组定义法


1022

解题思路:

1.将余数存入数组,while的判断条件sum!=0

2.将数组倒叙输出,j=i-1,

3.不要忘记sum的0,输出0,return 0
4.不要用VEctor压栈

参考代码:

#include<iostream>
using namespace std;
/*
    解题思路:
    1.将余数存入数组,while的判断条件sum!=0
    2.将数组倒叙输出,j=i-1,
    3.不要忘记sum的0,输出0,return 0
    4.不要用VEctor压栈
*/

int main()
{
    int sum,A,B,D,i=0;
    cin >> A >> B >> D;
    int a[100];
    sum=A+B;
    if(sum==0)
    {
        cout << 0;
        return 0;
    }
    while(sum!=0)
    {
        a[i++]=sum%D;
        sum/=D;
    }
    for(int j=i-1; j>=0; j--)
        cout << a[j];
    return 0;
}


1023

解题思路:

1.没理解题意,切记数组是存放数字的个数
2.先找出第一个不为0的数,并输出
3.将所有0输出
4.再输出所有第一个不为0的数
5.双层for循环输出剩下的所有数,第一层for表示要输出的数字,第二层for表示要输出的个数

参考代码:

#include<iostream>
using namespace std;
int main()
{
    int a[10];
    int t;
    for(int i=0; i<10; i++)
        cin >> a[i];
    for(int i=1; i<10; i++)
    {
        if(a[i]!=0)
        {
            cout << i;
            t=i;           //t存放第一个不为0的数
            break;
        }
    }

    for(int i=0; i<a[0]; i++)   //输出所有的0
        cout << 0;
    for(int i=0; i<a[t]-1; i++)   //输出所有第一个不为0的数,因为之前输出了一个,所以这里就少输出1个
        cout << t;
    for(int i=t+1; i<10; i++)
        for(int j=0; j<a[i]; j++)
            cout << i;
    return 0;

}

知识总结:

用vector定义数组+to_string
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
/*
    解题思路:
    1.将余数压栈,sum>D
*/

int main()
{
    vector<int> a(5);      //用vector定义数组长度就是后面加(n)n表示数组长度
    for(int i=0; i<a.size(); i++)    //遍历数组时,i<a.size()而不是a.end()
        cout << a[i];
    int k=333;
    string s=to_string(k);      //将数字转化为字符串时用to_string切记是小写的to_string
    cout << s;
    return 0;
}

1024

解题思路:

1.从E将字符串一分为2,但第一个字符串不包括符号位
2.将后面的字符串转化为整数放到n
3.根据n 的正负,选择输出不同的情况
4.切记,当n为正数时,还要知道.和E之间的数字个数与n之间的关系,它们也是不同的输出

参考代码:

#include<iostream>
using namespace std;
int main()
{
    /*
        解题思路:
        1.从E将字符串一分为2,但第一个字符串不包括符号位
        2.将后面的字符串转化为整数放到n
        3.根据n 的正负,选择输出不同的情况
        4.切记,当n为正数时,还要知道.和E之间的数字个数与n之间的关系,它们也是不同的输出
    */
    string s;
    cin >> s;
    int i=0;

    while(s[i]!='E')     //此时i表示E所在的位
        i++;

    string t=s.substr(1,i-1);     //t保存E之前的字符串,不包括符号位

    int n=stoi(s.substr(i+1));     //将E之后下一位开始到字符串结束的转化为数字

    if(s[0]=='-')
        cout << "-";

    cout << n << endl;
    if(n<0)
    {
        cout << "0.";

        for(int j=0; j<abs(n)-1; j++)  //输出0
            cout << '0';

        for(int j=0; j<t.length(); j++)   //遇到.就不输出
            if(t[j] != '.')
                cout << t[j];
    }
    else
    {
        cout << t[0];
        int cnt,j;

        for(j=2, cnt=0; j<t.length() && cnt<n; j++,cnt++)  //若.和E之间的数字个数大于n,则只输出n个数字来
            cout << t[j];

        /*
            根据上面for结束的情况,一种是j==t.length()表示.和E之间的数字个数小于n,后面直接输出(n-cnt)个0;
            另一种是cnt==n,表示.和E之间的数字个数大于或等于n,就得先输出. 然后从i=j开始一直到字符完输出
        */
        if(j==t.length())
        {
            for(int k=0; k<n-cnt; k++)
                cout << '0';
        }
        else
        {
            cout << '.';
            for(int k=j; k<t.length(); k++)
                cout << t[k];
        }
    }
    return 0;
}


知识总结:

1.s.substr()截取字符串的字符
    s.substr(4)  //表示从4开始到下标结束
    s.substr(5,3)   //表示从5开始3个字符*/

我的代码:

#include<iostream>
#include<string>
using namespace std;
/*
    解题思路:
    1.用string存放输入,判断E之后是+还是-
    2.若为-,
        先输出0. + (后面的值-符号和.之间有几位)*输出0  + 输出s[1]  + 输出s[3]-->s[E所在的前一位]
      若为+,
        先输出s[1] + (输出第3位开始到E之前的所有数字) + (后面的值-小数点和E之间的数字个数)*输出0
    3.若第一个字符为-,必须先输出-

*/

int main()
{
    string s,s1;
    cin >> s;
    int t,m,k;
    int sum=0;
    for(int i=0; i<s.length(); i++)
    {
        if(s[i]=='E')
        {
            t=i;
            break;
        }
    }
    //计算E之后符号后的数值
    for(int i=t+2; i<s.length(); i++)
    {
        sum+=s[i]-'0';
        sum*=10;
    }
    sum/=10;
    if(s[0]=='-')
        cout << '-';
    if(s[t+1]=='-')
    {
        cout << 0 << '.';
        for(int i=1; i<=sum-1; i++)
            cout << 0;
        cout << s[1];
        for(int i=3; i<t; i++)
            cout << s[i];
    }
    else
    {
        cout << s[1];
        for(int i=3; i<t; i++)
            cout << s[i];
        for(int i=1; i<=sum-(t-3); i++)
            cout << 0;
    }
    return 0;
}

1025

参考代码:

#include <iostream>
#include <algorithm>
using namespace std;
int main() {
 int first, k, n, temp;
 cin >> first >> n >> k;
 int data[100005], next[100005], list[100005];
 for (int i = 0; i < n; i++) {
 cin >> temp;
 cin >> data[temp] >> next[temp];
 }
 int sum = 0;//不⼀定所有的输⼊的结点都是有⽤的,加个计数器
 while (first != -1) {
 list[sum++] = first;
 first = next[first];
 }
 for (int i = 0; i < (sum - sum % k); i += k)
 reverse(begin(list) + i, begin(list) + i + k);
 for (int i = 0; i < sum - 1; i++)
 printf("%05d %d %05d\n", list[i], data[list[i]], list[i + 1]);
 printf("%05d %d -1", list[sum - 1], data[list[sum - 1]]);
 return 0; }


1026

参考代码:

#include <iostream>
using namespace std;
int main() {
 int a, b;
 cin >> a >> b;
 int n = ((b - a) + 50) / 100;
 int hour = n / 3600;
 n = n % 3600;
 int minute = n / 60, second = n % 60;
 printf("%02d:%02d:%02d", hour, minute, second);
 return 0; }
}


1027

解题思路:

每个沙漏都是从最中间⼀⾏⾏向上下分别扩展⼀⾏,每次扩展⾏都要⽐之前⼀层多2个符号,最
中间⼀⾏只有 1 个符号,假设扩展的层数为 i,则扩展出去的上边需要的所有符号个数为3 + 5 + 7 + …+ (2i+1) = (3 + 2i + 1) * i / 2 = i * (i + 2),扩展出去的下边与上边同样多所以乘以2,加上最重要那⼀⾏1个
符号,所以 总共需要2 * i * (i + 2) + 1个符号,所以i从0到N,找满⾜(2 * i * (i + 2) + 1) > N的最⼩的 i,因
为符号不能超过N,所以只能扩展出去 i-1 ⾏,⽤变量row表示从最中间⼀⾏需要扩展出去的⾏数,row
= i – 1,接下来开始输出,上⾯的每⼀⾏,对于扩展出去的第 i 层需要输出row – i个空格,接着输出i *
2 + 1个符号c和换⾏符;对于最中间⼀⾏,需要输出row – 1个空格、符号c和换⾏符;对于下⾯的每⼀
⾏,对于扩展出去的第i层,需要输出row-i个空格,接着输出i * 2 + 1个符号c和换⾏符,因为⽤掉的符
号数为2 * row * (row + 2) + 1,所以最后输出剩下没⽤掉的符号数为N – (2 * row * (row + 2) + 1)

参考代码:

#include <iostream>
using namespace std;
int main() {
 int N, row = 0;
 char c;
 cin >> N >> c;
 for (int i = 0; i < N; i++) {
 if ((2 * i * (i + 2) + 1) > N) {
 row = i - 1;
 break;
 }
 }
 for (int i = row; i >= 1; i--) {
 for (int k = row - i; k >= 1; k--) cout << " ";
 for (int j = i * 2 + 1; j >= 1; j--) cout << c;
 cout << endl;
 }
 for (int i = 0; i < row; i++) cout << " ";
 cout << c << endl;
 for (int i = 1; i <= row; i++) {
 for (int k = row - i; k >= 1; k--) cout << " ";
 for (int j = i * 2 + 1; j >= 1; j--) cout << c;
 cout << endl;
 }
 cout << (N - (2 * row * (row + 2) + 1));
 return 0; }

1028

解题思路:

⽤字符串接收name和birth,如果当前birth >= “1814/09/06″且<= “2014/09/06″,则是有效⽣⽇,
有效个数cnt++,如果birth >= maxbirth,则更新maxname和maxbirth的值;如果birth <= minbirth,则
更新minname和minbirth的值,这⾥的max和min是指数值上的⼤⼩~最后输出cnt,minname和
maxname,minname表示最年⻓的(⽣⽇的数值⼤⼩最⼩的),maxname表示最年轻的(⽣⽇的数值
⼤⼩最⼤的)

参考代码:

#include <iostream>
using namespace std;
int main() {
 int n, cnt = 0;
 cin >> n;
 string name, birth, maxname, minname, maxbirth = "1814/09/06", minbirth =
"2014/09/06";
 for (int i = 0; i < n; i++) {
 cin >> name >> birth;
 if (birth >= "1814/09/06" && birth <= "2014/09/06") {
 cnt++;
 if (birth >= maxbirth) {
 maxbirth = birth;
 maxname = name;
 }
 if (birth <= minbirth) {
 minbirth = birth;
 minname = name;
 }
 }
 }
 cout << cnt;
 if (cnt != 0) cout << " " << minname << " " << maxname;
 return 0; }


1029

解题思路:

1.以第一个字符串为准使用for循环,然后用a.find(b)来判断a中是否含有b,如果没有find返回string::npos;
并且用ans来表示第一个字符串和第二个字符串中不相同的且不相同的字符转化为大写也是不同的

2.最后输出ans

参考代码:

#include<iostream>
#include<string>
using namespace std;
/*
    解题思路:
    1.以第一个字符串为准使用for循环,然后用a.find(b)来判断a中是否含有b,如果没有find返回string::npos;
    并且用ans来表示第一个字符串和第二个字符串中不相同的且不相同的字符转化为大写也是不同的
    2.最后输出ans
    3.ans表示s1与s2中不相同的字符的字符串
*/
int main()
{
    string s1,s2,ans;
    cin >> s1 >> s2;
    for(int i=0; i<s1.length(); i++)
    {
        if(s2.find(s1[i]) == string::npos && ans.find(toupper(s1[i])) == string::npos)
            ans+=toupper(s1[i]);
    }
    cout << ans;
    return 0;
}


知识总结:

1.toupper()将小写字母转化成大写字母
#include<iostream>
#include<string>
using namespace std;
int main()
{
    /*
        1.toupper函数返回值为整数,在前面加个强制转化即可
    */
    char a='d';
    cout << (char)toupper(a);
}

2.a.find(b)查找a字符串中是否含有b
/*
        1.a.find(b)如果字符串a中包含字符串b则值不等于string::npos,否则相同。a,b可以是字符串也可以是字符
        2.npos是一个常数,用来表示不存在的位置
        3.a字符串中如果包含b,则返回0;否则返回4294967295也就是npos
*/
#include<iostream>
#include<string>
using namespace std;
int main()
{
    string a,b;
    cin >> a >> b;
    cout << a.find(b) << endl;
    cout << string::npos;
    return 0;
}

1030

解题思路:

1.先对数组进行排序,从小到大

2.通过两个for+if-else来找到满足题意的个数,外层for控制遍历整个数列,每次把v[i]当成最小的数,里面的for
就是判断当前v[i]是最小值时,所对应的满足题意的最多的个数。这里j=i+result与if(v[j]<=v[i]*p)用来表示:比如
上次循环后result=3,此时一开始就判断从当前i开始往后第3个数是否满足条件,满足就修改result的值,不满足result
值不变

参考代码:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
    int n,temp,result=0;
    long long p;
    cin >> n >> p;
    vector<int>a(n);     //用vector定义有长度的数组时,数组名后用圆括号()中写数组长度
    for(int i=0; i<n; i++)
        cin >> a[i];
    sort(a.begin(),a.end());
    for(int i=0; i<n; i++)
    {
        for(int j=i+result; j<n; j++)
        {
            if(a[j]<=a[i]*p)
            {
                temp=j-i+1;
                if(temp>result)
                    result=temp;
            }
            else
                break;
        }
    }
    cout << result;
    return 0;
}

知识总结:

1.int位数,long long位数
int3202^32-1 long long6402^64-1

2.用vector定义有长度的数组时,数组名后用圆括号()中写数组长度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值