PAT乙级

1001 害死人不偿命的(3n+1)猜想

卡拉兹(Callatz)猜想:

对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……

我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?

输入格式:

每个测试输入包含 1 个测试用例,即给出正整数 n 的值。

输出格式:

输出从 n 计算到 1 需要的步数。

输入样例:

3

输出样例:

5

#include
#include
#include

using namespace std;

int main()
{
    int n,i=0;
    cin>>n;
    while(n!=1)
    {
        if(n%2==0)
        {
            n=n/2;
            ++i;
        }
        else
        {
            n=(3*n+1)/2;
            ++i;
        }
    }
    cout< }

1002 写出这个数

读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

输入格式:

每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10​100​​。

输出格式:

在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。

输入样例:

1234567890987654321123456789

输出样例:

yi san wu

#include
#include
#include
#include

using namespace std;

int main()
{
    string s;
    cin>>s;
    
    int sum=0,len;
    
    len=s.length();
    
    for(int i=0;s[i];i++)
    {
        sum=sum+(s[i]-'0');
    }
//    cout<     
    string s1[10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
    
    stringstream ss;
    
    ss<     string s2=ss.str(); 
    int len2=s2.length();
    int i=0;
    for(i=0;i     {
        cout<     }
    cout<     

//    cout<

}

        长度问题:length().size(),strlen()使用方法总结:https://blog.csdn.net/z_qifa/article/details/77744482。c/c++ strlen(str)和str.length()和str.size()都可以求字符串长度。其中str.length()和str.size()是用于求string类对象的成员函数
,其中str.size( )得到的字符串长度包含“\0”的长度。strlen(str)是用于求字符数组的长度,其参数是char*。

        #include 使用方法总结:对sstream的详解见https://blog.csdn.net/fengbingchun/article/details/69788873

        sstrram 标准类库的使用方法:https://blog.csdn.net/ns708865818/article/details/53557957。注意将string流的数据赋值给整形变量时候会自动跳过空格。sstream可以将string类型数字转变为int型;istringstram录入数据时候不是像sstram对象使用 <<  。而是使用的istringstream对象 .str( s );

1003 我要通过

答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。

得到“答案正确”的条件是:

  1. 字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;
  2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
  3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串。

现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。

输入格式:

每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过 100,且不包含空格。

输出格式:

每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出 YES,否则输出 NO

输入样例:

8
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA

输出样例:

YES
YES
YES
YES
NO
NO
NO
NO

#include
#include
using namespace std;
int main() {
    int n, p = 0, t = 0;
    string s;
    cin >> n;
    for(int i = 0; i < n; i++) {
        cin >> s;
        map m;
        for(int j = 0; j < s.size(); j++) {
            m[s[j]]++;
            if (s[j] == 'P') p = j;
            if (s[j] == 'T') t = j;
        }
        if(m['P'] == 1 && m['A'] != 0 && m['T'] == 1 && m.size() == 3 && p * (t-p-1) == s.length()-t-1)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

map标准库使用方法总结:https://blog.csdn.net/duan19920101/article/details/50617190

 

1004 成绩排名


#include
#include
using namespace std;
 
struct nood{
    string s1;
    string s2;
    int grade;
}stu[1000];              //结构体数组。容器中的元素是结构体时候,必须定义为全局的,否则容器会出错。
 
bool cmp(nood a,nood b)
{
    return a.grade>b.grade;     //自定义排序规则,从大到小降序排列;在前面的元素就表示前面的
}
int main()
{
    int n;
    cin>>n;
    for(int i=0;i     {
        cin>>stu[i].s1>>stu[i].s2>>stu[i].grade;
    }
    sort(stu,stu+n,cmp);                //sort排序的区间为前闭后开区间;
    cout<     cout<     return 0;
}

1005 继续(3n+1)猜想


#include
#include
#include
using namespace std;
int arr[10000];
bool cmp(int a, int b) {return a > b;}         //降序排列
int main() {
    int k, n, flag = 0;
    cin >> k;
    vector v(k);
    for (int i = 0; i < k; i++) {
        cin >> n;
        v[i] = n;
        while (n != 1) {
            if (n % 2 != 0) 
                n = 3 * n + 1;
                 
            n = n / 2;
            arr[n] = 1;             //那个数字出现过那个数字就在数组中标记为1; 
        }
    }
    sort(v.begin(), v.end(), cmp);    //从大到小排序 
    for (int i = 0; i < v.size(); i++) {
        if (arr[v[i]] == 0) {
            if (flag == 1) 
                cout << " ";
            cout << v[i];
            flag = 1;
        }
    }
    return 0;
}

 

1006  换个格式输出整数

#include
#include
#include
#include

using namespace std;

int main()
{
    int n;
    cin>>n;
    
    stringstream ss;
    ss<     string s=ss.str();    
//    cout<     int len=s.length();
//    cout<     int i=0;

    if(len==3)
    {
        for(int j=(s[0]-'0');j>0;--j)
            cout<<"B";
        for(int k=(s[1]-'0');k>0;--k)
            cout<<"S";
        for(int t=1;t<=(s[2]-'0');++t)
            cout<     }
        if(len==2)
    {
        for(int j=(s[0]-'0');j>0;--j)
            cout<<"S";
        
        for(int t=1;t<=(s[1]-'0');++t)
            cout<     }
        if(len==1)
    {
        
        for(int t=1;t<=(s[0]-'0');++t)
            cout<     }
    
    
    
    return 0;
}

其他代码:

#include
using namespace std;
int main() {
    int a, i = 0;
    cin >> a;
    int b[3] = {0};
    while (a != 0) {
        b[i++] = a % 10;
        a = a / 10;
    }
    for (int k = 0; k < b[2]; k++)
        cout << "B";
    for (int k = 0; k < b[1]; k++)
        cout << "S";
    for (int k = 0; k < b[0]; k++)
        cout << k + 1;
    return 0;
}

 

 

1007 素数对猜想

#include
#include  
using namespace std;
bool isprime(int a) {
    for (int i = 2; i<= sqrt(a); i++)
        if (a % i == 0) return false;
    return true;
}
int main() {
    int N, cnt = 0;
    cin >> N;
    for (int i = 5; i <= N; i++)
        if (isprime(i-2) && isprime(i)) cnt++;
    cout << cnt;
    return 0;
}

1008 数组元素循环右移


#include
#include
#define maxSize 101
int main(){
    int A[maxSize];
    int M, N;
    scanf("%d%d", &N, &M);
    //从控制台中读取N个数
    for (int i = 1; i <= N; i++){
        scanf("%d",&A[i]);
    }
    for (int k = 0; k < M; k++){
        //最后一位数据保存下来
        int temp = A[N];
        //逐一的向后移动,该循环执行完后,就是一次右移
        for (int j = N; j > 1; j--){
            A[j] = A[j - 1];
        }
        A[1] = temp;
    }
    //输出数据
    for (int i = 1; i <= N; i++){
        printf("%d",A[i]);
        if (i != N){
        printf(" ");
        }
    }
 
    printf("\n");
    system("pause");
    return 0;
}


1009 说反话

#include
int main(){
    int num = 0;    //单词的个数
    char ans[80][80];
    while(scanf("%s", ans[num]) != EOF){    //一直输入直到文件末尾
        num++;      //单词的个数加 1 
    }
    for(int i = num - 1; i >= 0; i--){      //倒着输出单词
        printf("%s", ans[i]);
        if(i > 0) printf(" "); 
    }
    return 0;

 

1010 一元多项式求导

#include
using namespace std;
int main() {
    int a, b, flag = 0;
    while (cin >> a >> b) {
        if (b != 0) {
            if (flag == 1) 
                cout << " ";
            cout << a * b << " " << b - 1;
            flag = 1;
        }
    }
    if (flag == 0) cout << "0 0";
    return 0;
}

 

 

1011

#include
#include
#include
#include

using namespace std;

int main()
{
    long long int a,b,c;
    int t;
    
    cin>>t;
    
    while(t--)
    {
        cin>>a>>b>>c;
        cout<<"Case #"<<(4-t)<<":"<<" ";
        if(a+b>c)
            cout<<"true";
        else
            cout<<"false";
        cout<     }
    
    
    return 0;
}

其他代码:

#include
using namespace std;
int main() {
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        long long int a, b, c;
        scanf("%lld%lld%lld", &a, &b, &c);
        printf("Case #%d: %s\n", i + 1, a + b > c ? "true" : "false");
    }
    return 0;
}

明明一模一样,不知道为啥有错

 

 

 

1013 数素数

#include
#include
#include
#include

using namespace std;
bool IsP(int p);
int main()
{
    int m,n,k=1,j=0,i=1;
    scanf("%d",&m);
    scanf("%d",&n);
    for(j=2;  ;j++)
    {
        if(IsP(j))
        {
            
            if((k>=m)&&(k<=n-1))
            {
                if((i)%10==0)
                {
                    printf("%d",j);
                    printf("\n");
                }
                
                else
                    printf("%d ",j);             //最主要就是注意最后的一位后面不能有空格
                    
                
                ++i;
            }
            if(k==n)
                printf("%d",j);    
            ++k;
        }
        
        if(k==n+1)
            break;
    }
    
    return 0;
    
}

bool IsP(int p)
{
    for(int i=2;i*i<=p;i++)
    {
        if(p%i==0)
            return false;                      
    }
    return true;
 } 

 

1014  福尔摩斯的约会

 

 

1015 德才论

容器里面同一个位置多次push_back不同的值,并不会覆盖之前的值,也不会自动相加或者重复赋值,而是自动组成了二维数组;

#include
#include
#include
using namespace std;
struct node {
    int num, de, cai;
};
int cmp(struct node a, struct node b) {
    if ((a.de + a.cai) != (b.de + b.cai))
        return (a.de + a.cai) > (b.de + b.cai);
    else if (a.de != b.de)
        return a.de > b.de;
    else
        return a.num < b.num;
}
int main() {
    int n, low, high;
    scanf("%d %d %d", &n, &low, &high);
    vector v[4];
    node temp;
    int total = n;
    for (int i = 0; i < n; i++) {
        scanf("%d %d %d", &temp.num, &temp.de, &temp.cai);
        if (temp.de < low || temp.cai < low)
            total--;
        else if (temp.de >= high && temp.cai >= high)
            v[0].push_back(temp);                //自动组成二维,而不是覆盖赋值
        else if (temp.de >= high && temp.cai < high)
            v[1].push_back(temp);
        else if (temp.de < high && temp.cai < high && temp.de >= temp.cai)
            v[2].push_back(temp);
        else
            v[3].push_back(temp);
    }
    printf("%d\n", total);
    for (int i = 0; i < 4; i++) {
        sort(v[i].begin(), v[i].end(), cmp);
        for (int j = 0; j < v[i].size(); j++)
            printf("%d %d %d\n", v[i][j].num, v[i][j].de, v[i][j].cai); //每一个类型的人存储在在v[i]中,自动组成二维,而不是覆盖赋值
    }
    return 0;
}

 

1016  部分A+B

找对应数字个数的最佳方法如下::本人倾力打造:

#include
#include
#include
#include

using namespace std;
int sum(int m,int n);
int main()
{
    int a,a1,b,b1,pa=0,pb=0;
    cin>>a>>a1>>b>>b1;
    for(int i=0;i     {
        pa=pa*10+a1;
    }
    
//    cout<     for(int j=0;j     {
        pb=pb*10+b1;
    }
//    cout< //    cout<     cout<<(pa+pb);

    return 0;
    
}

int sum(int m,int n)
{
    int t=0;
    stringstream ss;
    ss<     string s1=ss.str();
    int len=s1.length();
    for(int i=0;i     {
        if(s1[i]-'0'==n)
            ++t;         
    }
    
    return t;
}

 

 

对比错误的while循环做法:

int sum(int m,int n)
{
    int t=0;
    while(m%10>0)
    {
        if(m%10==n)
            ++t;
        m/=10;
    }
    return t;
}

1017 A除以B

数字太大只能使用字符串来进行输入;然后使用传统的算数除法方式进行输出
#include
using namespace std;
int main() {
    string s;
    int a, t = 0, temp = 0;
    cin >> s >> a;
    int len = s.length();
    t = (s[0] - '0') / a;
    if ((t != 0 && len > 1) || len == 1)
        cout << t;
    temp = (s[0] - '0') % a;
    for (int i = 1; i < len; i++) {
        t = (temp * 10 + s[i] - '0') / a;
        cout << t;
        temp = (temp * 10 + s[i] - '0') % a;
    }
    cout << " " << temp;
    return 0;
}

1018 锤子剪刀布  ???

这里需要注意的是凡是要一一对应的地方,优先考虑使用字符串,string来对应。


#include
using namespace std;
int main() {
    int n;
    cin >> n;
    int jiawin = 0, yiwin = 0;
    int jia[3] = {0}, yi[3] = {0};
    for (int i = 0; i < n; i++) {
        char s, t;
        cin >> s >> t;
        if (s == 'B' && t == 'C') {
            jiawin++;
            jia[0]++;
        } else if (s == 'B' && t == 'J') {
            yiwin++;
            yi[2]++;
        } else if (s == 'C' && t == 'B') {
            yiwin++;
            yi[0]++;
        } else if (s == 'C' && t == 'J') {
            jiawin++;
            jia[1]++;
        } else if (s == 'J' && t == 'B') {
            jiawin++;
            jia[2]++;
        } else if (s == 'J' && t == 'C') {
            yiwin++;
            yi[1]++;
        }
    }
    cout << jiawin << " " << n - jiawin - yiwin << " " << yiwin << endl << yiwin << " " << n - jiawin - yiwin << " " << jiawin << endl;
    int maxjia = jia[0] >= jia[1] ? 0 : 1;
    maxjia = jia[maxjia] >= jia[2] ? maxjia : 2;
    int maxyi = yi[0] >= yi[1] ? 0 : 1;
    maxyi = yi[maxyi] >= yi[2] ? maxyi : 2;
    char str[4] = {"BCJ"};                     //使用string来解决对应的问题;
    cout << str[maxjia] << " " << str[maxyi];
    return 0;
}

1019 数字黑洞   

这字符串转换为整形,整型转换为字符串是关键: https://www.cnblogs.com/wzxwhd/p/6030083.html

 

1020 月饼

#include                           //25分的题目考虑使用sort排序和容器解决
#include
#include
using namespace std;
struct mooncake{
    float mount, price, unit;
};
int cmp(mooncake a, mooncake b) {
    return a.unit > b.unit;
}
int main() {
    int n, need;
    cin >> n >> need;
    vector a(n);
    for (int i = 0; i < n; i++) scanf("%f", &a[i].mount);
    for (int i = 0; i < n; i++) scanf("%f", &a[i].price);
    for (int i = 0; i < n; i++) a[i].unit = a[i].price / a[i].mount;
    sort(a.begin(), a.end(), cmp);
    float result = 0.0;
    for (int i = 0; i < n; i++) {
        if (a[i].mount <= need) {
            result = result + a[i].price;
        } else {
            result = result + a[i].unit * need;
            break;
        }
        need = need - a[i].mount;
    }
    printf("%.2f",result);
    return 0;
}

1021 个位数统计

cin输入s和cin.get之类的区别:https://blog.csdn.net/qianhen123/article/details/19088839

 

#include

using namespace std;

int main()
{
    
        
    string s;
    cin>>s;
        
    int len=s.length();
    int a[10] = {0};
    
    for(int i=0;i     {
        a[s[i]-'0']++;
    }
    
    for(int j=0;j<10;j++)
    {
//        cout<         if(a[j]!=0)
            cout<     }
    
    return 0;
    
}

1022 D进制的A+B

只需要保持输出的数字与给定的实例的结果一样,而不必保证变量的值一定是多少

 

#include
#include

using namespace std;
// int rev(int m,int n);
int main()
{
    unsigned int a,b,d,sum;
    cin>>a>>b>>d;
    
    sum=a+b;
    if (sum == 0) {
        cout << 0;
        return 0;
    }
    vector p;
    
    while(sum>0)
    {
        p.push_back(sum%d);
        sum/=d;
    }
    
    int len=p.size();
//    cout<     
    for(int i=len-1;i>=0;i--)
    {
        cout<     }
    return 0;
    
}

 

1023 组个最小数  ???


#include
using namespace std;
int main() {
    int a[10], 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;
            break;
        }
    }
    for (int i = 0; i < a[0]; i++) 
        cout << 0;               //输出0 
    for (int i = 0; i < a[t] - 1; i++)
        cout << t;               //输出最高位对应数字没有提到前面的数 
    for (int i = t + 1; i < 10; i++)
        for (int k = 0; k < a[i]; k++)
            cout << i;            //依次输出其他位的数 
    return 0;
}

 

1024  科学计数法

很大的数字只能使用string来表示。string的常用函数。string字符串转换为整数de 问题
#include
using namespace std;
int main() {
    string s;
    cin >> s;
    int i = 0;
    while (s[i] != 'E') i++;
    string t = s.substr(1, i-1);
    int n = stoi(s.substr(i+1));
    if (s[0] == '-') cout << "-";
    if (n < 0) {
        cout << "0.";
        for (int j = 0; j < abs(n) - 1; j++) 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++) cout << t[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;
}

 

 

1027  打印沙漏

 

#include
#include

using namespace std;
int rev(int m,int n);
int main()
{
    int n;
    char b;
    cin>>n;
    cin>>b;
    int hang=0,sum=1,sum1;
    
    //找出行数 
    for(hang=1; ;hang++)
    {
        sum=sum+(2*hang+1)*2; 
        if(sum>n)
        {
            hang=hang-1;
            break;
        }
    }
//    cout<     
 //打印上半部分 
    for(int j=hang;j>0;j--)
    {
        for(int t=0;t         {
            if(t!=0)
                cout<<" ";
         } 
         
         for(int t=0;t<2*j+1;t++)
         {
             cout<          }
         cout<     }
    //打印中间 
    for(int j=hang;j>0;j--)
    {
        cout<<" ";
    }
    cout<     //打印下半部分 
    for(int j=1;j<=hang;j++)
    {
        for(int t=0;t<=hang-j;t++)
        {
            if(t!=0)
                cout<<" ";
         } 
         for(int t=0;t<2*j+1;t++)
         {
             cout<          }
         cout<     }
    sum=1; 
    for(int t=1;t<=hang;t++)
    {
        sum=sum+(2*t+1)*2; 
    }
    cout<<(n-sum);
    
//    cout< //    cout<     
//    cout<<(19-a[i+1]);
    
//    2 1
//    1 3
//    0 5
//    
    
    
//    0 1
//    1 7     2*(2*2+1)
//    2 17    2*(2*3+1)                       //不用去计算数学公式,使用基本的关系,程序方法来解决 
//    3 31    2*(2*4+1)
//    4 49
  
//    cout<

    return 0;
    
}

1028 人口普查

录入日期数据的时候不需要管那个斜杠杠,直接在scanf函数格式控制字符串里面斜杠就可以了;

#include
using namespace std;
int main() {
    int n;
    cin >> n;
    string name;
    int year, month, day, count = 0;
    int maxyear = 0, maxmonth = 0, maxday = 0, minyear = 9999, minmonth = 9999, minday = 9999;
    string maxname, minname;
    for (int i = 0; i < n; i++) {
        cin >> name;
        scanf("%d/%d/%d",&year, &month, &day);
        if((year < 2014 || (year == 2014 && month < 9) || (year == 2014 && month == 9 && day <= 6)) &&
           (year > 1814 || (year == 1814 && month > 9) || (year == 1814 && month == 9 && day >= 6))) {
            count++;
            if(year > maxyear || (year == maxyear && month > maxmonth) || (year == maxyear && month == maxmonth && day > maxday)) {
                maxyear = year;
                maxmonth = month;
                maxday = day;
                maxname = name;
            }
            if(year < minyear || (year == minyear && month < minmonth) || (year == minyear && month == minmonth && day < minday)) {
                minyear = year;
                minmonth = month;
                minday = day;
                minname = name;
            }
        }
    }
    cout << count;
    if (count != 0)
        cout << " " << minname << " " << maxname; //先输出一个数字,然后一个空格,一个数字的输出,这样避免判断是否要输                                                                                  //出空格。
    return 0;
}


1029 旧键盘  ???

set使用方法。string使用方法;https://blog.csdn.net/liuchuo/article/details/51994502

1036 跟奥巴马一起学编程

容器数组的定义实用方法;

#include
#include
#include
#include
using namespace std;

int main(){
    int n,t;
    char c;
    cin>>n;
    cin>>c;
    
    
    t=(int)((double)n/2+0.5);
    
     
    vector v[t];                    //容器数组的定义方法
    for(int i=0;i     {
        for(int j=0;j         {
            v[i].push_back(c);           //容器数组加入对应值得方法
        }
    }
    
    for(int i=1;i     {
        for(int j=1;j         {
            v[i][j]=' ';                    //容器数组有对应的值后赋值的方法;
        }
    }
    
    for(int i=0;i     {
        for(int j=0;j         {
            cout<         }
        cout<     }
     
    return 0;

 

1037  在霍格沃茨找零钱

在录入多个点分开的数字,或者多个斜杠的数字,直接在格式控制字符串中写入即可。不同进制数字之间的加减法;


#include
using namespace std;
int main() {
    int a, b ,c;
    int m, n, t;
    scanf("%d.%d.%d",&a, &b, &c);                       //录入带点 . 的数字
    scanf("%d.%d.%d",&m, &n, &t);
    int flag;
    if (a > m ||(a == m && b > n) ||(a == m && b == n && c > t))
        flag = 0;
    else
        flag = 1;

    int x, y, z;
    if (flag == 1) {
        if (t >= c) {
            z = t - c;
        } else {
            z = t + 29 - c;
            n = n - 1;
        }
        if (n >= b) {
            y = n - b;
        } else {
            y = n + 17 - b;
            m = m - 1;
        }
        x = m - a;
        cout << x << "." << y << "." << z;
    } else {
        if (c >= t) {
            z = c - t;
        } else {
            z = c + 29 - t;
            b = b - 1;
        }
        if (b >= n) {
            y = b - n;
        } else {
            y = b + 17 - n;
            a = a - 1;
        }
        x = a - m;
        cout << "-" << x << "." << y << "." << z;
    }
    return 0;
}

1038 统计同成绩学生

统计某个数字出现了几次:

#include
#include
#include
#include
using namespace std;

int main(){
    int n,k,a[100000],b[101]={0};
    cin>>n;
    for(int i=0;i     {
        cin>>a[i];
        b[a[i]]++;
    }
//    cout<

//    cout<     
    cin>>k;
    int t[k];
    for(int i=0;i     {
        cin>>t[i];
        
    }
    
    cout<     for(int i=1;i     {
        cout<<" "<     }
     
    return 0;

 

 

1046 划拳


#include
using namespace std;

int main() {
    int jiahan, jiahua, yihan, yihua;
    int n;
    int jia = 0;
    int yi = 0;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> jiahan >> jiahua >> yihan >> yihua;
        if (jiahan + yihan == jiahua && yihan + jiahan != yihua)             //注意排除这种情况即可
            yi++;
        if (jiahan + yihan != jiahua && yihan + jiahan == yihua)
            jia++;
    }
    cout << jia << " " << yi;
    return 0;
}

1047 编程团体赛


#include
using namespace std;
int main() {
    int n, t, num, score;
    cin >> n;
    int team[1001] = {0};
    for (int i = 1; i <= n; i++) {
        scanf("%d-%d %d", &t, &num, &score);          //核心,这里录入数据的时候注意直接在格式控制字符串中写入横杠 - 
        team[t] += score;
    }
    int max = 0;
    for (int i = 0; i < 1001; i++) {
        if (team[max] < team[i])
            max = i;
    }
    cout << max << " " << team[max];
    return 0;
}

 

1048 数字加密


#include
#include
using namespace std;
int main() {
    string a, b;
    cin>>a>>b;
    char str[13] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'J', 'Q', 'K'}; //涉及到字符对应数字,所以使用字符数组,直接初始化完成;
    int l1, l2, l, i, m, d;
    l1 = a.length();
    l2 = b.length();
    if (l2 < l1) {
        d = l1 - l2;
        for (i=0; i             b = '0' + b;                  //在字符串左右边加减字符‘0’的操作。左边加0就在左边。右边加0就在右边;
    }
    if (l1 < l2) {
        d = l2 - l1;
        for (i=0; i             a = '0' + a;
        l1 = l2;
    }
    for (i=0; i         m = (b[l1-1-i] - '0' + a[l1-1-i] - '0') % 13;     ////字符与数字的对应 
        b[l1-1-i] = str[m];
    }
    for (i=1; i         m = b[l1-1-i] - a[l1-1-i];
        b[l1-1-i] = str[(m + 10) % 10];
    }
    cout<     return 0;
}

1049 数列的片段求和


#include
using namespace std;
int main() {
    int n;
    cin >> n;
    double a[100001];
    double sum = 0.0;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        sum = sum + a[i] * i * (n - i + 1);        //牛掰了,这里的权重就是每一个数总的会被加的次数可以直接这样表示
    }
    printf("%.2f", sum);
    return 0;
}

1051 复数乘法

保留两位小数这里要注意和0的大小关系;因为这里涉及到最后数据的表示0;

#include
#include
using namespace std;
int main() {
    double r1, p1, r2, p2, A, B;
    cin >> r1 >> p1 >> r2 >> p2;
    A = r1 * r2 * cos(p1) * cos(p2) - r1 * r2 * sin(p1) * sin(p2);
    B = r1 * r2 * cos(p1) * sin(p2) + r1 * r2 * sin(p1) * cos(p2);
    if (A + 0.005 >= 0 && A < 0)
        printf("0.00");                                   //特别注意这里和0比大小的地方。考虑这里为什么使用的0.05
    else
        printf("%.2f", A);
    if(B >= 0)
        printf("+%.2fi", B);
    else if (B + 0.005 >= 0 && B < 0)
        printf("+0.00i");
    else
        printf("%.2fi", B);
    return 0;
}

1052 卖个萌    ????

string常用函数的使用方法以及string的录入方法;在VS2010中头文件有的版本不能使用cstring,只能使用string,否则出错。字符数组输出时候只需要数组名就可以输出这个字符串。

常用字符串函数:

strcmp(s1,s2)比较:比较ASCII码值,如果长度不同,会以空字符补足不足的部分作比较。

strcpy(s1,"abdc"):字符串拷贝函数是整体将前面字符串覆盖;

strupr() :字符串大写

strlwr():字符串小写

 

scanf()和cin读入字符数组字符串时候,不需要  &  符号,字符串读取到空格截止。输出字符数组对应字符串只需要数组名就可以。

 

 

#include
#include
using namespace std;
int main() {
    vector > v;
    for(int i = 0; i < 3; i++) {
        string s;
        getline(cin, s);
        vector row;
        int j = 0, k = 0;
        while(j < s.length()) {
            if(s[j] == '[') {
                while(k++ < s.length()) {
                    if(s[k] == ']') {
                        row.push_back(s.substr(j+1, k-j-1));
                        break;
                    }
                }
            }
            j++;
        }
        v.push_back(row);
    }
    int n;
    cin >> n;
    for(int i = 0; i < n; i++) {
        int a, b, c, d, e;
        cin >> a >> b >> c >> d >> e;
        if(a > v[0].size() || b > v[1].size() || c > v[2].size() || d > v[1].size() || e > v[0].size() || a < 1 || b < 1 || c < 1 || d < 1 || e < 1) {
            cout << "Are you kidding me? @\\/@" << endl;
            continue;
        }
        cout << v[0][a-1] << "(" << v[1][b-1] << v[2][c-1] << v[1][d-1] << ")" << v[0][e-1] << endl;
    }
    return 0;
}

1053 住房空置率

 

#include
using namespace std;
int main() {
    int n, d, k, maybe = 0, must = 0;
    double e, temp;
    cin >> n >> e >> d;
    for (int i = 0; i < n; i++) {
        cin >> k;
        int sum = 0;
        for (int j = 0; j < k; j++) {
            cin >> temp;
            if (temp < e) sum++;
        }
        if(sum > (k / 2)) {
            k > d ? must++ : maybe++;                 //三目表达式。? :
        }
    }
    double mayberesult = (double)maybe / n * 100;              //百分数表达方法
    double mustresult = (double)must / n * 100;
    printf("%.1f%% %.1f%%", mayberesult, mustresult);         //百分数表达方法
    return 0;
}

1054 求平均值

分析:使用sscanf和sprintf函数~
sscanf() – 从一个字符串中读进与指定格式相符的数据
sprintf() – 字符串格式化命令,主要功能是把格式化的数据写入某个字符串中

#include
#include
#include
using namespace std;
int main() {
    int n, cnt = 0;
    char a[50], b[50];
    double temp, sum = 0.0;
    cin >> n;
    for(int i = 0; i < n; i++) {
        scanf("%s", a);
        sscanf(a, "%lf", &temp);
        sprintf(b, "%.2lf",temp);
        int flag = 0;
        for(int j = 0; j < strlen(a); j++) {
            if(a[j] != b[j]) {
                flag = 1;
            }
        }
        if(flag || temp < -1000 || temp > 1000) {
            printf("ERROR: %s is not a legal number\n", a);
            continue;
        } else {
            sum += temp;
            cnt++;
        }
    }
    if(cnt == 1) {
        printf("The average of 1 number is %.2lf", sum);
    } else if(cnt > 1) {
        printf("The average of %d numbers is %.2lf", cnt, sum / cnt);
    } else {
        printf("The average of 0 numbers is Undefined");
    }
    return 0;
}

1056  组合数的和

#include
#include
using namespace std;
int main() {
    int n, ans = 0;
    scanf("%d", &n);
    vector v(n);                    //这里注意容器v(n)和容器数组v[n]的区别;
    for(int i = 0; i < n; i++) scanf("%d", &v[i]);
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            if(i != j) ans += v[i] * 10 + v[j];                     //简直给力,这样就避免了需要顺反来两次的循环,直接通过两个for解决
        }
    }
    printf("%d", ans);
    return 0;
}

 

1057 数零壹

数字对应字母很好用字符串来解决。本题目确实字母对应数字。该如何解决呢?使用string的 find函数找到下标吗?

这里使用的减去字符A再加1的做法;

 

#include
#include
#include
using namespace std;
int main() {
    string s;
    getline(cin, s);
    int n = 0;
    for(int i = 0; i < s.length(); i++) {
        if(isalpha(s[i])) {
            s[i] = toupper(s[i]);           //注意字符串的大小写转换
            n += (s[i] - 'A' + 1);
        }
    }
    int cnt0 = 0, cnt1 = 0;
    while(n != 0) {
        if(n % 2 == 0) {
            cnt0++;
        } else {
            cnt1++;
        }
        n = n / 2;
    }
    printf("%d %d", cnt0, cnt1);
    return 0;
}

1058 选择题      ???

 

 

1059 C语言竞赛

#include
#include
#include
using namespace std;
int ran[10000];
bool isprime(int a) {
    if(a <= 1) return false;
    int Sqrt = sqrt((double)a);
    for(int i = 2; i <= Sqrt; i++) {
        if(a % i == 0)
            return false;
    }
    return true;
}
int main() {
    int n, k;
    scanf("%d", &n);
    for(int i = 0; i < n; i++) {
        int id;
        scanf("%d", &id);
        ran[id] = i + 1;                //由于可以确定ID是不同的,所以这样设置数组最方便 
    }
    scanf("%d", &k);
    set ss;                        //set容器的使用方法;
    for(int i = 0; i < k; i++) {
        int id;
        scanf("%d", &id);
        printf("%04d: ", id);
        if(ran[id] == 0) {
            printf("Are you kidding?\n");
            continue;
        }
        if(ss.find(id) == ss.end()) {
            ss.insert(id);
        } else {
            printf("Checked\n");
            continue;
        }
        if(ran[id] == 1) {
            printf("Mystery Award\n");
        }else if(isprime(ran[id])) {
            printf("Minion\n");
        }else {
            printf("Chocolate\n");
        }
    }
    return 0;
}

1061 判断题

使用容器录入对应数组的方法:

#include
#include
#include
using namespace std;
int main() {
       int n,d,temp;
    cin>>n>>d;
    vector v[2],vv[3];  //这里定义的时候使用容器数组形式。则后面可以为二维数组形式输出。如果使用v(n)则只是表明容器                                           //大小。不可以像下面一样那样带数组[ ] 标志符号。
    for(int i=0;i<2;i++)
    {
        for(int j=0;j         {
            cin>>temp;
            v[i].push_back(temp); //容器数组形式则每一次向容器里面添加数据可以使用中括号的数组形式v[i]。
        }
     } 
     for(int i=0;i     {
        for(int j=0;j         {
            cin>>temp;
            vv[i].push_back(temp);
        }
     } 
//     for(int i=0;i<2;i++)
//    {
//        for(int j=0;j //        {
//            cout< //        }
//        cout< //     } 
//   
    return 0;
}

 

本题代码:

#include
#include
using namespace std;
int main() {
    int n, m;
    scanf("%d%d", &n, &m);
    vector score(m), ans(m);   //定义了两个容器。虽然在这里和定义数组没多大区别。因为后面代码没有利用容器特性
    for(int i = 0; i < m; i++)
        scanf("%d", &score[i]);
    for(int i = 0; i < m; i++)
        scanf("%d", &ans[i]);
    for(int i = 0; i < n; i++) {
        int total = 0;
        for(int j = 0; j < m; j++) {
            int temp;
            scanf("%d", &temp);
            if(temp == ans[j])
                total += score[j];
        }
        printf("%d\n", total);
    }
    return 0;
}

 

1062  最简分数   ???

 

借鉴这个大神的解答:https://blog.csdn.net/jyfbug/article/details/80244598

特别是辗转相除法。牛掰。


#include
#define N 1000
int judge(int a, int b);
int main()
{
    int a[1000] = { 0 };
    int i, j;
    double N1, M1, N2, M2,K;
    double temp;
    scanf("%lf/%lf %lf/%lf %lf", &N1, &M1, &N2, &M2,&K);            //分数录入的斜杠在格式控制字符串中。
    if (N1*M2 > N2*M1)             //b1     {
        temp = N1;
        N1 = N2;
        N2 = temp;
        temp = M1;
        M1 = M2;
        M2 = temp;
    }
    j = 0;
    for (i=0;; i++)
    {
        if (i *M1>K*N1&&i *M2         {
            if (judge(i, K) == 1)      //使用辗转相除法计算后,若果无公因子,则b就会等于1;
            {
                a[j] = i;                  //存 储 这样的a[i];
                j++;
            }
        }
        else if(i *M2>K*N2)//超出范围
        {
            break;
        }
    }
    for (i = 0; i < j - 1; i++)                //这里是为了避免 最后多输出空格。
    {
        printf("%d/%.0f ", a[i], K);
    }
    printf("%d/%.0f", a[i], K);
    return 0;
}
int judge(int a, int b)                        //辗转相除法。b就是最后的公约数。如果b等于1。则说明没有公约数。无法继续约分。
{
    int c;
    while (a != 0)
    {
        c = b%a;
        b = a;
        a = c;
    }
    return b;
}

 

1063 计算谱半径

#include
#include
using namespace std;
int main() {
    int n;
    scanf("%d", &n);
    float max = 0;
    for(int i = 0; i < n; i++) {
        float a, b, ans;
        scanf("%f%f", &a, &b);
        ans = sqrt(a * a + b * b);                             //数学函数头文件。cmath
        max = ans > max ? ans : max;                   //三目表达式。
    }
    printf("%.2f", max);
    return 0;
}

1064 朋友数

#include
#include
using namespace std;
int getFriendNum(int num) {
    int sum = 0;
    while(num != 0) {
        sum += num % 10;
        num /= 10;
    }
    return sum;
}
int main() {
    set s; //这里可以不使用这个set容器。直接使用数组r[10000]。将对应的朋友号处变为1.每增加一个朋友数,数值继续加1
    int n, num;
    scanf("%d", &n);
    for(int i = 0; i < n; i++) {
        scanf("%d", &num);
        s.insert(getFriendNum(num));
    }
    printf("%d\n", s.size());
    for(auto it = s.begin(); it != s.end(); it++) {
        if(it != s.begin()) printf(" ");
        printf("%d", *it);
    }
    return 0;
}

 

1066 图像过滤

这里我觉得问题是输出的方式????这里的输出方式是按下空格后才会。//每一行的输入直接对应每一行的输出,而不用全部输入完 成后一次全部输出

#include
using namespace std;
int main() {
    int m, n, a, b, num, temp;
    scanf("%d%d%d%d%d", &m, &n, &a, &b, &num);
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d", &temp);
            if (temp >= a && temp <= b)
                temp = num;
            if (j != 0) printf(" ");
            printf("%03d", temp);               //间隔输入空格的一个好方法。
        }
        printf("\n");
    }
    return 0;
}

 

1067  试密码   ???

#include
using namespace std;
int main() {
    string password, temp;
    int n, cnt = 0;
    cin >> password >> n;
    getchar();
    while(1) {
        getline(cin, temp);                      //字符串的输入。???
        if (temp == "#") break;
        cnt++;
        if (cnt <= n && temp == password) {
            cout << "Welcome in";
            break;
        } else if (cnt <= n && temp != password) {
            cout << "Wrong password: " << temp << endl;                       //每一行的输入直接对应每一行的输出,而不用全部输入完                                                                                                                //成后一次全部输出
            if (cnt == n) {
                cout << "Account locked";
                break;
            }
        }
    }
    return 0;
}

1068  万绿丛中一点红

这是我喜欢的方法:使用结构体来存颜色信息以及坐标。然后使用容器存储结构体。妙哉妙哉。参考大神:https://blog.csdn.net/qq_22194315/article/details/60470130

 


#include
#include
#include
using namespace std;
struct Node
{
    int x, y, color;
}node;
int M, N, TOL;
const int maxn = 1000+10;
int a[maxn][maxn];
int cnt[1 << 24] = { 0 };
int dx[] = { -1,-1,-1,0,0,1,1,1 };
int dy[] = { 1,0,-1,1,-1,1,0,-1 };
bool check(int x, int y)
{
    if (x < 0 || y < 0 || x >= N || y >= M)
        return false;
    return true;
}
int main()
{
    scanf("%d%d%d", &M, &N,&TOL);
    vectorv;
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
        {
            scanf("%d", &a[i][j]);
            cnt[a[i][j]]++;
        }
    }
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
        {
            if (cnt[a[i][j]]==1)//注意独一无二!!!!
            {
                bool flag = false;
                for (int k = 0; k < 8; k++)
                {
                    if (check(i + dx[k], j + dy[k])&&
                        abs(a[i + dx[k]][j + dy[k]] 
                            - a[i][j]) <= TOL)//注意不要只在内圈中扫描而是应该扫描所有像素
                    {
                        flag = true; break;
                    }
                }
                if (!flag)
                {
                    node.x = j + 1; node.y = i + 1;
                    node.color = a[i][j];
                    v.push_back(node);
                }
            }
        }
    }
    if (v.size() == 1)
    {
        printf("(%d, %d): %d", v[0].x, v[0].y, v[0].color);
    }
    else if (v.size() == 0)printf("Not Exist");
    else printf("Not Unique");
    return 0;
}

1069  微博转发抽奖????

 

使用map来保证字符串和对应的数字一一对应;map使用方法

#include
#include
using namespace std;
int main() {
    int m, n, s;
    scanf("%d%d%d", &m, &n, &s);
    string str;
    map mapp;             
    bool flag = false;
    for (int i = 1; i <= m; i++) {
        cin >> str;
        if (mapp[str] == 1) s = s + 1;                         //使用字符串来保证字符和对应的数字对应关系;
        if (i == s && mapp[str] == 0) {
            mapp[str] = 1;
            cout << str << endl;
            flag = true;
            s = s + n;
        }
    }
    if (flag == false) cout << "Keep going...";
    return 0;
}

 

1071 小赌怡情

我觉得这里可以使用数组替代四个参数比较简洁。

 

#include
using namespace std;
int main() {
    int T = 0, K = 0, n1 = 0, n2 = 0, b = 0, t = 0;
    scanf("%d %d", &T, &K);
    for (int i = 0; i < K; i++) {
        scanf("%d %d %d %d", &n1, &b, &t, &n2);
        if (T == 0) {
            printf("Game Over.\n");
            return 0;
        } else if (t > T) {
            printf("Not enough tokens.  Total = %d.\n", T);
        } else if (n2 > n1) {
            if (b == 1) {
                T += t;
                printf("Win %d!  Total = %d.\n", t, T);
            } else {
                T -= t;
                printf("Lose %d.  Total = %d.\n", t, T);
            }
        } else if (n2 < n1) {
            if (b == 1) {
                T -= t;
                printf("Lose %d.  Total = %d.\n", t, T);
            } else {
                T += t;
                printf("Win %d!  Total = %d.\n", t, T);
            }
        }
    }
    return 0;
}

1072  开学寄语

#include
#include
#include
 
using namespace std;
string stu[1005];
 
int main() 
{
    int N,M,K;
    int find[15],thing[15],ans[15];
    cin>>N>>M;
    for (int i=0;i         cin>>find[i];
    }
    int count1=0,count2=0;
    for (int i=0;i         cin>>stu[i];
        cin>>K;
        if (K==0) {
            continue;
        }
        int p=0,flag=0;
        for (int j=0;j             cin>>thing[j];
            for (int k=0;k                 if (thing[j]==find[k]) {
                    count2++;
                    flag=1;
                    ans[p++]=thing[j];
                }
            }
        }  
        if(flag) {
            count1++;
            cout<             for (int i=0;i                 printf(" %04d",ans[i] );  //   注意这里的输出格式 是%04d
            }
            cout<         }
    }
    cout<     return 0;
}
 

1073  多选题常见计分法

 

#include
#include
#include
using namespace std;
int main() {
    int n = 0, m = 0, opt_num = 0, true_opt_num = 0, temp = 0, max_error_cnt = 0;
    int hash[] = {1, 2, 4, 8, 16}, opt[1010][110] = {0};
    char c;
    scanf("%d %d", &n, &m);
    vector full_score(m), true_opt(m);
    vector > fre(m);
    for (int i = 0; i < m; i++) {
        scanf("%d %d %d", &full_score[i], &opt_num, &true_opt_num);
        for (int j = 0; j < true_opt_num; j++) {
            scanf(" %c", &c);
            true_opt[i] += hash[c-'a'];
        }
        fre[i].resize(5);                   //容器的resize()用法;
    }
    for (int i = 0; i < n; i++) {
        double grade = 0;
        for (int j = 0; j < m; j++) {
            getchar();
            getchar(); // '('
            scanf("%d", &temp);
            for (int k = 0; k < temp; k++) {
                scanf(" %c", &c);
                opt[i][j] += hash[c-'a'];
            }
            getchar(); // ')'
            int el = opt[i][j] ^ true_opt[j];
            if (el) {
                if ((opt[i][j] | true_opt[j]) == true_opt[j]) {
                    grade += full_score[j] * 1.0 / 2;
                }
                if (el) {
                    if (el & hash[0]) fre[j][0]++; // a
                    if (el & hash[1]) fre[j][1]++; // b
                    if (el & hash[2]) fre[j][2]++; // c
                    if (el & hash[3]) fre[j][3]++; // d
                    if (el & hash[4]) fre[j][4]++; // e
                }
            } else
                grade += full_score[j];
        }
        printf("%.1f\n", grade);
    }
    for (int i = 0; i < m; i++)
        for (int j = 0; j < 5; j++)
            max_error_cnt = max_error_cnt > fre[i][j] ? max_error_cnt : fre[i][j];
    
    if (max_error_cnt == 0) {
        printf("Too simple\n");
    } else {
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < fre[i].size(); j++) {
                if (max_error_cnt == fre[i][j]) {
                    printf("%d %d-%c\n", max_error_cnt, i+1, 'a'+j);
                }
            }
        }
    }
    return 0;
}

1074  宇宙无敌加法器

#include
using namespace std;
int main() {
    string s, s1, s2, ans;
    int carry = 0, flag = 0;
    cin >> s >> s1 >> s2;
    ans = s;
    string ss1(s.length() - s1.length(), '0');               //这里就是为了标准化相加的数据。小于金制表位数的补0在前面。和那个哈里                                                                                 //波特货币转换的一样
    s1 = ss1 + s1;
    string ss2(s.length() - s2.length(), '0');
    s2 = ss2 + s2;
    for(int i = s.length() - 1; i >= 0; i--) {
        int mod = s[i] == '0' ? 10 : (s[i] - '0');
        ans[i] = (s1[i] - '0' + s2[i] - '0' + carry) % mod + '0';
        carry = (s1[i] - '0' + s2[i] - '0' + carry) / mod;
    }
    if (carry != 0) ans = '1' + ans;
    for(int i = 0; i < ans.size(); i++) {
        if (ans[i] != '0' || flag == 1) {
            flag = 1;
            cout << ans[i];
        }
    }
    if (flag == 0) cout << 0;
    return 0;
}

 

1076  wifi密码

#include
#include
#include
using namespace std;
int main(){
    int n;
//    freopen("input.txt","r",stdin);
    char answer,ch;
    scanf("%d",&n);
    getchar();
    for(int i = 0;i < n;i++){
        for(int j = 0;j < 4;j++){
            scanf("%c-%c",&answer,&ch);              //输入数据直接在格式控制字符串中完成格式问题。
            getchar();
            if(ch=='T'){
                printf("%d",answer-'A'+1);                 //重点注意26个字母和对应的数字进行转换的方法;
            }
        }
    }
    printf("\n");
    return 0;

 

1077 互评成绩计算

 

#include
using namespace std;
int main() {
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < n; i++) {
        int g2, g1 = 0, cnt = -2, temp, maxn = -1, minn = m + 1;
        cin >> g2;
        for (int j = 0; j < n-1; j++) {
            cin >> temp;
            if (temp >= 0 && temp <= m) {
                if (temp > maxn) maxn = temp;          //找出最大值。
                if (temp < minn) minn = temp;            //找出最小值
                g1 += temp;                                      //找出总分
                cnt++;                                         //找出合法输入的个数
            }
        }
        cout << int((((g1 - minn - maxn) * 1.0 / cnt) + g2) / 2 + 0.5) << endl;                 //结果四舍五入
    }
    return 0;
}

 

1078 字符串压缩与解压

#include
#include
using namespace std;
int main(){
    char type;
    string str;
//    freopen("input.txt","r",stdin);
    scanf("%c",&type);
    getchar();
    getline(cin,str);
    if(type == 'C')
    {
        int len = str.size();
        int cnt = 1;
        for(int i = 0;i < len;i++)
        {
            if(str[i] == str[i+1])
            {
                cnt++;
            }
            else
            {
                if(cnt>1)
                {
                    printf("%d",cnt);                 //注意这里的输出方式。按照代码,虽然字符没有输入完毕就进行输出,会导致结果不是                                                                //一行一行输出。但是由于回车之后才算是输入结束。所以不会出现这种情况;
                }
                printf("%c",str[i]);
                cnt = 1;
            }
        }
    }
    else{
        int len = str.size();
        int cnt = 0;
        for(int i = 0;i < len;i++){
            if(str[i]<='9'&&str[i]>='0')
            {
                cnt*=10;
                cnt+=str[i]-'0';
            }
            else
            {
                if(cnt == 0){
                    printf("%c",str[i]);
                }else
                for(int j = 0;j < cnt;j++){
                    printf("%c",str[i]);
                }
                cnt = 0;
            }
        }
    }
    return 0;
}
 

1081 检查密码

 

#include
#include
using namespace std;
int main() {
    int n;
    cin >> n; getchar();
    for (int i = 0; i < n; i++)
    {
        string s;
        getline(cin, s);
        if (s.length() >= 6) 
        {
            int invalid = 0, hasAlpha = 0, hasNum = 0;
            for (int j = 0; j < s.length(); j++) 
            {
                if (s[j] != '.' && !isalnum(s[j]))              //重点注意这几个函数isalnum(),isalpha()和isdigit() 的使用。
                    invalid = 1;
                else if 
                    (isalpha(s[j])) hasAlpha = 1;
                else if 
                    (isdigit(s[j])) hasNum = 1;
            }
            if (invalid == 1) 
                cout << "Your password is tai luan le.\n";
            else if(hasNum == 0) 
                cout << "Your password needs shu zi.\n";
            else if(hasAlpha == 0) 
                cout << "Your password needs zi mu.\n";
            else 
                cout << "Your password is wan mei.\n";
        } 
        else
                   cout << "Your password is tai duan le.\n";
    }
    return 0;
}

 

1082 射击比赛

稳扎稳打就行。
#include
#include
using namespace std;
int main()
{
    int N,x,y,distance,max=-1,min=0;
    string id,maxID,minID;
    cin >> N;
 
    for(int i=1;i<=N;i++)
    {
        cin>>id>>x>>y;
        distance = x*x + y*y;//两点距离公式
        if(distance>max)
        {//找冠军
            max = distance;
            maxID = id;
        }
        if(distance         {//找菜鸟
            min = distance;
            minID = id;
        }
    }
 
    cout<  
    return 0;
}

 

1083 是否存在相等的差

 

#include
using namespace std;
int main() {
    int n, t, a[10000] = {0};
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> t;
        a[abs(t-i)]++;               /这个方法666,激不激动开不开心
    }
    for (int i = 9999; i >= 0; i--)
        if (a[i] >= 2) cout << i << " " << a[i] << endl;
    return 0;
}

1084 外观数列

参见这位大神的:https://blog.csdn.net/weixin_41162823/article/details/79677651

这题有俩个地方很关键,一是整数d属于[0,9],第二个地方就是N<40.这代表着我们并不需要多么复杂的算法优化空间与时间,简单的暴力求解就可以解决。这题和字符串压缩解压类似,从头开始遍历,遇到相同字符时cnt+1,否则就保存已经连续几个相同字符。要注意最后要判断cnt是否大于0,防止字符串从头到尾都相等。
#include
using namespace std;
int main()
{
    string a;
    int n;
    cin >> a >> n;
    while(--n)
    {
        string ans;
        char c = a[0];
        int cnt = 0;
        for(int i = 0;i < a.length();i++)
        {
            if(a[i] == c)    
                cnt++;           //记录有几个字符c; 
            else
            {
                ans+=c;
                ans+=cnt+'0';
                c = a[i];
                cnt = 1;
            }
        }
        if(cnt > 0)
        {
            ans+=c;             //首先把字符c加入空字符串 
            ans+=cnt+'0';        //将cut+'0'变为字符型常量加入字符串ans中。 
        }
        a = ans;
    }
    cout << a <     return 0;
}

 

 

你可能感兴趣的:(PAT乙级)