《算法笔记》第3章 入门篇(1)——入门模拟

简单模拟

问题 A 剩下的树

#include<stdio.h>
#include<algorithm>
using namespace std;
int main(){
         int L, M, sum, left, right, i;
         while(scanf("%d%d", &L, &M), L!=0){
                   int road[10001] = {};
                   sum = 0;
                   while(M--){
                            scanf("%d%d", &left, &right);
                            //fill函数的赋值范围(区间)first和last(上面代码中的left, right)是左闭右开,也就是[First,Last)
                            fill(road + left, road + right + 1, 1);
                   }
                   for(int i = 0; i <= L; i++){
                            if(road[i] == 0) sum++;
                   }
                   printf("%d\n", sum);
         }
         return 0;
}
 

【PAT B1032】 挖掘机技术哪家强

#include<stdio.h>
const int maxn = 100010;
int school[maxn] = {0};
int main(){
         int n, schId, score;
         scanf("%d", &n);
         for(int i = 0; i < n; i++){
                   scanf("%d %d", &schId, &score);
                   school[schId] += score;
         }
         int k = 1, MAX = -1;
         for(int i = 0; i < n; i++){
                   if(school[i] > MAX){
                            MAX = school[i];
                            k = i;
                   }
         }
         printf("%d %d", k, MAX);
         return 0;
}
 

【PAT B1001】 害死人不偿命的3n+1猜想

#include<stdio.h>

int main(){
         int n, step = 0;
         scanf("%d", &n);
         while(n != 1){
                   if(n % 2 == 0) n = n / 2;
                   else n = (3 * n + 1) / 2;
                   step++;
         }
         printf("%d", step);
         return 0;
}
 

本节习题

http://codeup.cn/contest.php?cid=100000575

问题 A 剩下的树-2

#include<stdio.h>
#include<algorithm>
using namespace std;
int main(){
         int L, M, sum, left, right;
         while(scanf("%d%d", &L, &M), L!=0){
                   sum = L + 1;
                   int min, max;
                   scanf("%d%d", &left, &right);
                   min = left;
                   max = right;
                   M--;
                   while(M--){
                            scanf("%d%d", &left, &right);
                            if(left <= max){ //区间与前面的连续(有重叠)
                                     if(left < min) min = left;
                                     if(right > max) max = right;
                            } else { //区间与前面的不连续(有间隔)
                                     sum += (left - max + 1) - 2; //先加上间隔中的树
                                     if(left < min) min = left;
                                     if(right > max) max = right;                                    
                            }              
                   }
                   sum -= (max - min + 1);
                   printf("%d\n", sum);
         }
         return 0;
}
 

问题 B  A+B

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main(){
         int long A, B;
         char a[20], b[20];
         while(scanf("%s %s", &a, &b) != EOF){
                   //将字符串a中的","去掉
                   int len_a = strlen(a);
                   int k = 0; //记录","的个数
                   for(int i = 0; i < len_a; i++){
                            if(a[i] != ',') continue;
                            else{
                                     k++;
                                     for(int j = i; j < len_a - 1; j++){
                                               a[j] = a[j + 1];
                                     }
                            }
                   }
                   a[len_a-k] = '\0';
                   A = atoi(a); // atoi函数将字符串转为int型,需导入stdlib.h头文件
                   //将字符串b中的","去掉
                   int len_b = strlen(b);
                   k = 0; //记录","的个数
                   for(int i = 0; i < len_b; i++){
                            if(b[i] != ',') continue;
                            else{
                                     k++;
                                     for(int j = i; j < len_b - 1; j++){
                                               b[j] = b[j + 1];
                                     }
                            }
                   }
                   b[len_b-k] = '\0';
                   B = atoi(b);
                   printf("%d\n", A + B);
         }
         return 0;
}
 

问题 C 特殊乘法

#include<stdio.h>

int main(){
         int a, b, p;
         while(scanf("%d%d", &a, &b) != EOF){
                   p = 0;
                   for(int i = a; i > 0; i /= 10){
                            for(int j = b; j > 0; j /= 10){
                                     p += (i % 10) * (j % 10);
                            }
                   }
                   printf("%d\n", p);
         }
         return 0;
}
 

问题 D 比较奇偶数个数

#include<stdio.h>

int main(){
         int n, temp, odd_count = 0, even_count = 0;
         while(scanf("%d", &n) != EOF){
                   for(int i = 0; i < n; i++){
                            scanf("%d", &temp);
                            if(temp % 2) odd_count++;
                            else even_count++;
                   }
                   if(even_count > odd_count) printf("NO\n");
                   else printf("YES\n");
         }
         return 0;
}
 

问题 E Shortest Distance (20)2

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e5 + 10;
int num[maxn], n, tot, ans;
int main()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
    {
        int x;
        scanf("%d", &x);
        num[i] = num[i - 1] + x;
        tot += x;
    }
    int k;
    scanf("%d", &k);
    while (k--)
    {
        int x, y;
        scanf("%d%d", &x, &y);
        if (x > y)swap(x, y);
        int dis = num[y - 1] - num[x - 1];
        ans = min(dis, tot - dis);
        printf("%d\n", ans);
    }
    return 0;
}
 

问题 E Shortest Distance (20)

#include<stdio.h>

int main(){
         int n, m, p1, p2, total = 0;
         scanf("%d", &n);
         int distance[n];
         for(int i = 0; i < n; i++){
                   scanf("%d", &distance[i]);
                   total += distance[i];
         }
         scanf("%d", &m);
         for(int i = 0; i < m; i++){
                   scanf("%d%d", &p1, &p2);
                   int d1 = 0, d2 = 0;
                   if(p1 > p2){
                            int temp = p1;
                            p1 = p2;
                            p2 = temp;
                   }
                   for(int i = p1; i < p2; i++){
                            d1 += distance[i - 1];
                   }
                   d2 = total - d1;
                   if(d1 > d2) printf("%d\n", d2);
                   else printf("%d\n", d1);
         }
         return 0;
}
 

问题 F A+B和C (15)-2

#include<iostream>
using namespace std;
#define N 10
int main(void){
         int T = 0;
         int long A[N], B[N], C[N];
         cin >> T;
         for (int i = 0; i < T; i++) {
                   cin >> A[i] >> B[i] >> C[i];//注意这种输入方式
         }
         for(int j = 0;j < T; j++){
                   (A[j] > C[j] - B[j]) ? cout<<"Case #"<<(j+1)<<": true"<<endl:cout<<"Case #"<<(j+1)<<": false"<<endl;
         }
 
         return 0;
}

 

问题 F A+B和C (15)

#include<stdio.h>

int main(){
         int n;
         long int a[11], b[11], c[11];
         scanf("%d", &n);
         for(int i = 0; i < n; i++){
                   scanf("%d%d%d", &a[i], &b[i], &c[i]);
         }
         for(int i = 0; i < n; i++){
                   if(a[i] > c[i] - b[i]) printf("Case #%d: ture\n", i + 1);
                   else printf("Case #%d: false\n", i + 1);
         }
         return 0;
}
 

问题 G 数字分类 (20)

#include<stdio.h>
int main(){
         int n;
         scanf("%d", &n);
         int num[1001], A[5] = {0}, a1 = 1, a3 = 0;
         for(int i = 0; i < n; i++){
                   scanf("%d", &num[i]);
                   if(num[i] % 5 == 0 && num[i] % 2 == 0){
                            A[0] += num[i];
                   }                                  
                   else if(num[i] % 5 == 1){
                            A[1] += a1 * num[i];
                            a1 *= -1;
                   }                         
                   else if(num[i] % 5 == 2)
                            A[2] += 1;
                   else if(num[i] % 5 == 3){
                            a3++;
                            A[3] += num[i];
                   }
                   else if(num[i] % 5 == 4 && num[i] > A[4])      
                            A[4] = num[i];
         }
         for(int i = 0; i < 5; i++){
                   if(i == 3 && a3 > 0) printf("%.1f", (double)A[3]/a3);
                   else if(A[i] != 0) printf("%d", A[i]);
                   else printf("N");
                   if(i < 4) printf(" ");
         }
         return 0;
}
 

问题 G 数字分类 (20)-2

#include<stdio.h>
int main()
{
    int i,n,a[1001],sum1,sum2,count1,count2;
    scanf("%d",&n);
    sum1=sum2=count1=count2=0;
    double avg,sum3=0;
    int flag=1,max=0,t=0;
  for(i=1;i<=n;i++)
  {

      scanf("%d",&a[i]);
      if(a[i]%5==0&&a[i]%2==0)
        sum1+=a[i];
      if(a[i]%5==1){
        sum2+=a[i]*flag;
        flag=flag*-1;
        t++;
      }
      if(a[i]%5==2)
        count1++;
      if(a[i]%5==3){
        sum3+=a[i];
        count2++;
        }
      if(a[i]%5==4)
      {
          if(a[i]>max)
            max=a[i];
      }
  }
  avg=sum3/count2;
  if(sum1==0)
    printf("N ");
  else
    printf("%d ",sum1);
  if(t==0)
    printf("N ");
  else
    printf("%d ",sum2);
  if(count1==0)
    printf("N ");
  else
    printf("%d ",count1);
  if(count2==0)
    printf("N ");
  else
    printf("%.1lf ",avg);
  if(max==0)
    printf("N");
  else
    printf("%d",max);

  return 0;
}

 

问题 H 部分A+B (15)

#include<stdio.h>

int main(){
         long int A, B, P_A, P_B;
         int D_A, D_B;
         while(scanf("%d%d%d%d", &A, &D_A, &B, &D_B) != EOF ){
                   P_A = 0;
                   P_B = 0;
                   while(A){
                            if(A % 10 == D_A) P_A = (P_A * 10 + A % 10);
                            A /= 10;
                   }
                   while(B){
                            if(B % 10 == D_B) P_B = (P_B * 10 + B % 10);
                            B /= 10;
                   }
                   printf("%d\n", P_A + P_B);
         }
         return 0;
}
 

问题 I 锤子剪刀布 (20)

#include<stdio.h>
#include<string.h>
int main(){
         int n, A[3] = {0}, B[3] = {0}, s1[3] = {0}, s2[3] = {0};
         char a, b;
         scanf("%d", &n);
         while(n--){
                   getchar();
                   scanf("%c %c", &a, &b);
                   if(a == 'C'){
                            if(b == 'C'){
                                     A[1]++;
                                     B[1]++;
                            } else if (b == 'J'){
                                     A[0]++;
                                     B[2]++;
                                     s1[0]++;
                            } else if (b == 'B'){
                                     A[2]++;
                                     B[0]++;
                                     s2[2]++;
                            }
                   } else if(a == 'J'){
                            if(b == 'C'){
                                     A[2]++;
                                     B[0]++;
                                     s2[0]++;
                            } else if (b == 'J'){
                                     A[1]++;
                                     B[1]++;
                            } else if (b == 'B'){
                                     A[0]++;
                                     B[2]++;
                                     s1[1]++;
                            }
                   } else if(a == 'B'){
                            if(b == 'C'){
                                     A[0]++;
                                     B[2]++;
                                     s1[2]++;
                            } else if (b == 'J'){
                                     A[2]++;
                                     B[0]++;
                                     s2[1]++;
                            } else if (b == 'B'){
                                     A[1]++;
                                     B[1]++;
                            }
                   }
         }
         printf("%d %d %d\n", A[0], A[1], A[2]);
         printf("%d %d %d\n", B[0], B[1], B[2]);
         int max_s1 = 0, max_s2 = 0, p, q;
         for(int i = 0; i < 3; i++){
                   if(s1[i] > max_s1){
                            max_s1 = s1[i];
                            p = i;
                   }
                   if(s2[i] > max_s2){
                            max_s2 = s2[i];
                            q = i;
                   }
         }
         char CJB[3];
         strcpy(CJB, "CJB");
         printf("%c %c", CJB[p], CJB[q]);
         return 0;
}
 

问题 I 锤子剪刀布 (20)2

#include <stdio.h>
int judge(char x,char y)   //判断输赢
{
    if(x=='C')
    {
        if(y=='C')
            return 0;
        else if(y=='J')
            return 1;
        else if(y=='B')
            return 2;
    }
    if(x=='J')
    {
        if(y=='C')
            return 2;
        else if(y=='J')
            return 0;
        else if(y=='B')
            return 1;
    }
    if(x=='B')
    {
        if(y=='C')
            return 1;
        else if(y=='J')
            return 2;
        else if(y=='B')
            return 0;
    }
}
int aa(int c,int j,int b)  //判断出哪个获胜最多并输出
{
    if(b>=c)
    {
        if(b>=j)
            printf("B");
        else
            printf("J");
    }
    else
    {
        if(c>=j)
            printf("C");
        else
            printf("J");
    }   
    return 0;
}

int main()
{
    int n;
    scanf("%d",&n);
    char a,b;
    int jw,jl,je,yw,yl,ye,jc,jj,jb,yc,yj,yb;
    jw=jl=je=yw=yl=ye=jc=jj=jb=yc=yj=yb=0;
    for(int i=0;i<n;i++)
    {
        getchar();
        scanf("%c %c",&a,&b);
        if(judge(a,b)==0)  //平局
        {   
            je++;
            ye++;
        }
        if(judge(a,b)==1)  //甲赢
        {   
            jw++;
            yl++;
            if(a=='C')
            jc++;
            else if(a=='J')
            jj++;
            else if(a=='B')
            jb++;
        }
        if(judge(a,b)==2)  //甲输
        {   
            jl++;
            yw++;
            if(b=='C')
            yc++;
            else if(b=='J')
            yj++;
            else if(b=='B')
            yb++;
        }
    }
    printf("%d %d %d\n",jw,je,jl);
    printf("%d %d %d\n",yw,ye,yl);
    aa(jc,jj,jb);
    printf(" ");
    aa(yc,yj,yb);
    printf("\n");
    return 0;
}

/*
写的超级长,改了超级久,写的很烂,又臭又长...
最后发现就一个错误,在第60行少加了一句getchar();
至于为什么要加这一句,请移步https://blog.csdn.net/weixin_44562957/article/details/104117402
*/

 

查找元素

【codeup 1934】找x

#include<cstdio>

const int maxn = 210;
int a[maxn];
int main(){
         int n, x;
         while(scanf("%d", &n) != EOF){
                   for(int i = 0; i < n; i++){
                            scanf("%d", &a[i]);
                   }
                   scanf("%d", &x);
                   int k;
                   for(k = 0; k < n; k++){
                            if(a[k] == x){
                                     printf("%d\n", k);
                                     break;
                            }
                   }
                   if(k == n){
                            printf("-1\n");
                   }
         }
         return 0;
}
 

本节习题

http://codeup.cn/contest.php?cid=100000576

【问题 A 统计同成绩学生人数

#include<cstdio>

const int maxn = 10010;
int a[maxn];
int main(){
         int n, x;
         while(scanf("%d", &n), n != 0){
                   for(int i = 0; i < n; i++){
                            scanf("%d", &a[i]);
                   }
                   scanf("%d", &x);
                   int k = 0;
                   for(int i = 0; i < n; i++){
                            if(a[i] == x) k++;
                   }
                   printf("%d\n", k);
         }
         return 0;
}
 

问题 B 找x-2

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
struct Student
{
    char no[100];//题目中,学号前有数字0,所以用char来存储
    char name[100];
    char sex[5];
    int age;
    bool operator < (const Student & A) const
    {
        return strcmp(no,A.no)<0;
    }
} buf[1001];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0; i<n; i++)
        {
            scanf("%s %s %s %d",buf[i].no,buf[i].name,buf[i].sex,&buf[i].age);
        }
        sort(buf,buf+n);//按照学号从小到大排序
        int t;
        scanf("%d",&t);
        while(t--)
        {
            int ans=-1;
            char x[30];
            scanf("%s",x);
            int top=n-1,base=0;
            while(top>=base)
            {
                int mid=(top+base)/2;
                int tmp=strcmp(buf[mid].no,x);
                if(tmp==0)
                {
                    ans=mid;
                    break;
                }
                else if(tmp>0)
                {
                    top=mid-1;
                }
                else
                {
                    base=mid+1;
                }
            }
            if(ans==-1)
            {
                printf("No Answer!\n");
            }
            else
            {
                printf("%s %s %s %d\n",buf[ans].no,buf[ans].name,buf[ans].sex,buf[ans].age);
            }
        }
    }
    return 0;
}
 

问题 D 查找

#include<stdio.h>

int main(){
         int n, m, x, a[101];
         while(scanf("%d", &n) != EOF){
                   for(int i = 0; i < n; i++){
                            scanf("%d", &a[i]);
                   }
                   scanf("%d", &m);
                   for(int i = 0; i < m; i++){
                            scanf("%d", &x);
                            int j;
                            for(j = 0; j < n; j++){
                                     if(a[j] == x){
                                               printf("YES\n");
                                               break;
                                     }
                            }
                            if(j == n) printf("NO\n");
                   }      
         }
         return 0;
}
 

问题 E 学生查询

#include<stdio.h>

struct student{
         int no;
         char name[20];
         char gender[20];
         int age;
}stu[20];

int main(){
         int m, n, x;
         while(scanf("%d", &m) != EOF){
                   while(m--){
                            getchar();
                            scanf("%d", &n);
                            for(int i = 0; i < n; i++){
                                     scanf("%d %s %s %d", &stu[i].no, &stu[i].name, &stu[i].gender, &stu[i].age);
                            }
                            scanf("%d", &x);
                            x -= 1;
                            if(x < n) printf("%d %s %s %d\n", stu[x].no, stu[x].name, stu[x].gender, stu[x].age);   
                   }
         }      
         return 0;
}
 

图形输出

【PAT B11036】跟奥巴马一起编程

#include<stdio.h>

int main(){
         int row, col;
         char c;
         scanf("%d %c", &col, &c); //列数 字符
         if(col % 2 == 1) row = col / 2 + 1; // col为奇数,向上取整
         else row = col / 2;
         //第一行
         for(int i = 0; i < col; i++){
                   printf("%c", c);
         }
         printf("\n");
         for(int i = 2; i < row; i++){
                   printf("%c", c); //每行的第一个字符
                   for(int j = 0; j < col -2; j++){
                            printf(" "); //col-2个空格
                   }
                   printf("%c\n", c); //每行最后一个字符
         }
         //第row行
         for(int i = 0; i < col; i++){
                   printf("%c", c);
         }
         return 0;
}
 

本节习题

http://codeup.cn/contest.php?cid=100000577

问题 A 输出梯形

#include<stdio.h>
//notice: 题目并没有说明有多组数据,然而……
int main(){
         int h;
         while(scanf("%d", &h) != EOF){
                   for(int i = 0; i < h; i++){
                            for(int j = 0; j < 2 * (h - i - 1); j++){
                                     printf(" ");
                            }
                            for(int k = 0; k < h + 2 * i; k++){
                                     printf("*");
                            }
                            printf("\n");
                   }
         }      
         return 0;
}
 

问题 B Hello World for U

#include<stdio.h>
#include<string.h>
int main(){
         char s[100];
         int len, side, mid;
         while(scanf("%s", s) != EOF){
                   len = strlen(s);
                   side = (len + 2) / 3;
                   mid = len - 2 * side;
                   for(int i = 0; i < len; i++){
                            if(i < side - 1){
                                     printf("%c", s[i]);
                                     for(int j = 0; j< mid; j++){
                                               printf(" ");
                                     }
                                     printf("%c\n", s[len - i -1]);
                            }
                            else if(i < len - side + 1) printf("%c", s[i]);
                   }
                   printf("\n");
         }
         return 0;
}
 

问题 C 等腰梯形

#include<stdio.h>
#include<string.h>
int main(){
         int n, h;
         scanf("%d", &n);
         while(n--){
                   scanf("%d", &h);
                   for(int i = 0; i < h; i++){
                            for(int j = 0; j < h - i - 1; j++) printf(" ");
                            for(int k = 0; k < h + 2 * i; k++) printf("*");
                            printf("\n");
                   }
         }
         return 0;
}
 

问题 D 沙漏图形 tri2str

#include<stdio.h>
#include<string.h>
int main(){
         int n;
         while(scanf("%d", &n) != EOF){
                   for(int i = 0; i < n; i++){
                            for(int k = i; k > 0; k--) printf(" ");
                            for(int j = 0; j < n - i; j++){
                                     printf("*");
                                     if(j < n - i - 1) printf(" ");
                            }
                            printf("\n");
                   }
                   for(int i = n - 2; i >= 0; i--){
                            for(int k = i; k > 0; k--) printf(" ");
                            for(int j = 0; j < n - i; j++){
                                     printf("*");
                                     if(j < n - i - 1) printf(" ");
                            }
                            printf("\n");
                   }
         }
         return 0;
}
 

日期差值

【codeup 1928】日期差值

#include<cstdio>

int month[13][2] = { //平年和闰年的每个月的天数,第二维为0时表示平年,为1表示闰年
         {0, 0}, {31, 31}, {28, 29}, {31, 31}, {30, 30}, {31, 31}, {30, 30},
         {31, 31}, {31, 31}, {30, 30}, {31, 31}, {30, 30}, {31, 31}
};

bool isLeap(int year){ //判断是否是闰年
         return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

int main(){
         int time1, y1, m1, d1;
         int time2, y2, m2, d2;
         while(scanf("%d%d", &time1, &time2) != EOF){
                   if(time1 > time2){ //第一个日期晚于第二个日期则交换
                            int temp = time1;
                            time1 = time2;
                            time2 = temp;
                   }
                   y1 = time1 / 10000, m1 = time1 % 10000 / 100, d1 = time1 % 100;
                   y2 = time2 / 10000, m2 = time2 % 10000 / 100, d2 = time2 % 100;
                   int ans = 1; //记录结果
                   while(y1 < y2 || m1 < m2 || d1 < d2){
                            d1++; //天数加1
                            if(d1 == month[m1][isLeap(y1)] + 1){ //满当月天数
                                     m1++; //日期变为下个月1号
                                     d1 = 1;
                            }
                            if(m1 == 13){ //月份满12个月
                                     y1++;
                                     m1 = 1;
                            }
                            ans++; //累计
                   }
                   printf("%d\n", ans); //输出结果
         }
         return 0;
}
 

本节习题

http://codeup.cn/contest.php?cid=100000578

问题 A 日期差值

#include<stdio.h>

bool isleap(int year)
{
    bool leap = false;
    if((year%4==0&&year%100!=0)||year%400==0)
        leap = true;
    return leap;
}
int main()
{  
    struct date{
        int y,m,d;
    }a,b;
    int date1,date2;
    int month[13][2]={
        {0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},
              {31,31},{31,31},{30,30},{31,31},{30,30},{31,31}
    };//2D数组,分别表示平年闰年的每个月的天数
    while(scanf("%d%d",&date1,&date2)!=EOF){
        if(date1>date2){
            int t=date1;date1=date2;date2=t;
        }
        int result=0;
        struct date a={date1/10000,date1/100%100,date1%100};
        struct date b={date2/10000,date2/100%100,date2%100};
            if(a.y!=b.y){//异年
                result += month[a.m][isleap(a.y)] - a.d+1;//a.d月到月底的天数
                result += b.d; //月初到 b.d的天数

            for(int i=a.y+1;i<b.y;i++){//计算中间年的天数
                if(isleap(i)){
                    result+=366;
                }
                else result+=365;
            }
            while(a.m+1<=12){//a.m的下一个月开始到本年的12月的天数
                result+=month[a.m+1][isleap(a.y)];
                a.m++;
            }
            for(int i = 1;i<b.m;i++){//1月开始到b.m-1月的天数
                result+=month[i][isleap(b.y)];
            }
            }
            else if(a.m!=b.m){//同年异月
                result += month[a.m][isleap(a.y)] - a.d+1;//a.d月到月底的天数
                result += b.d;//月初到 b.d的天数
                for(int i=a.m+1;i<b.m;i++){//中间月的天数
                    result+=month[i][isleap(a.y)];
                }
            }
            else{//同年同月
                result += b.d-a.d+1;
            }  
        printf("%d\n",result);
    }
    return 0;
 }
 

问题 B Day of Week

#include<cstdio>
#include<cstring>
int month[13][2] = { //平年和闰年的每个月的天数,第二维为0时表示平年,为1表示闰年
         {0, 0}, {31, 31}, {28, 29}, {31, 31}, {30, 30}, {31, 31}, {30, 30},
         {31, 31}, {31, 31}, {30, 30}, {31, 31}, {30, 30}, {31, 31}
};

char week[10][20] = { {},{"Monday"}, {"Tuesday"}, {"Wednesday"}, {"Thursday"}, {"Friday"},
         {"Saturday"}, {"Sunday"}
};

int enM2month(char s[]){
         if(strcmp(s, "January") == 0) return 1;
         else if(strcmp(s, "February") == 0) return 2;
         else if(strcmp(s, "March") == 0) return 3;
         else if(strcmp(s, "April") == 0) return 4;
         else if(strcmp(s, "May") == 0) return 5;
         else if(strcmp(s, "June") == 0) return 6;
         else if(strcmp(s, "July") == 0) return 7;
         else if(strcmp(s, "August") == 0) return 8;
         else if(strcmp(s, "Septempber") == 0) return 9;
         else if(strcmp(s, "October") == 0) return 10;
         else if(strcmp(s, "November") == 0) return 11;
         else if(strcmp(s, "December") == 0) return 12;
         else return false;
};

int main(){
         int y1, m1, d1;
         char enM1[15];
         while(scanf("%d %s %d", &d1, enM1, &y1) != EOF){
                   m1 = enM2month(enM1);
                   if (m1 == 1 || m1 == 2) {//对1、2月进行修正;
                            m1 += 12;
                            y1--;
                   }
                   int j = (d1 + 2 * m1 + 3 * (m1 + 1) / 5 + y1 + y1 / 4 - y1 / 100 + y1 / 400) % 7 + 1;
                   printf("%s\n", week[j]); //输出结果
         }
         return 0;
}
 

问题 B Day of Week-2

#include <cstdio>
#include <cstring>
// 使用基姆拉尔森计算公式来计算对应的星期;公式中1、2月份对应上一年的13、14月份,计算结果从0~6分别对应星期一~七;
char month[15][20] = { {}, {"January"}, {"February"}, {"March"}, {"April"}, {"May"},
                   {"June"}, {"July"}, {"August"}, {"September"}, {"October"}, {"November"}, {"December"}
};
char week[15][20] = { {"Monday"}, {"Tuesday"}, {"Wednesday"}, {"Thursday"}, {"Friday"},
                   {"Saturday"}, {"Sunday"}
};
 
int main()
{
         int d, y, k;
         char m[15];
         while (scanf ("%d %s %d", &d, m, &y) != EOF) {
                   for (int i = 0; i < 13; i++) {
                   if (strcmp (month[i], m) == 0)   k = i;
                   }      
                   if (k == 1 || k == 2) {                                                    //对1、2月进行修正;
                            k += 12;
                            y--;
                   }
                   int j = (d + 2 * k + 3 * (k + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7;
                   printf ("%s\n", week[j]);                                          //0~6分别对应星期一到天;
         }
        return 0;
}

 

问题 C 打印日期

#include<cstdio>

int month[13][2] = { //平年和闰年的每个月的天数,第二维为0时表示平年,为1表示闰年
         {0, 0}, {31, 31}, {28, 29}, {31, 31}, {30, 30}, {31, 31}, {30, 30},
         {31, 31}, {31, 31}, {30, 30}, {31, 31}, {30, 30}, {31, 31}
};

bool isLeap(int year){ //判断是否是闰年
         return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

int main(){
         int y1, m1, d1, n;
         while(scanf("%d%d", &y1, &n) != EOF){
                   m1 = 1, d1 = 0;
                   while(n--){
                            d1++; //天数加1
                            if(d1 == month[m1][isLeap(y1)] + 1){ //满当月天数
                                     m1++; //日期变为下个月1号
                                     d1 = 1;
                            }
                            if(m1 == 13){ //月份满12个月
                                     y1++;
                                     m1 = 1;
                            }
                   }
                   printf("%04d-%02d-%02d\n", y1, m1, d1); //输出结果
         }
         return 0;
}
 

问题 D 日期类

#include<cstdio>

int month[13][2] = { //平年和闰年的每个月的天数,第二维为0时表示平年,为1表示闰年
         {0, 0}, {31, 31}, {28, 29}, {31, 31}, {30, 30}, {31, 31}, {30, 30},
         {31, 31}, {31, 31}, {30, 30}, {31, 31}, {30, 30}, {31, 31}
};

bool isLeap(int year){ //判断是否是闰年
         return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

struct Date{
         int y, m, d;
};

int main(){
         Date day;
         int m;
         scanf("%d", &m);
         while(m--){
                   scanf("%d%d%d", &day.y, &day.m, &day.d);
                   int n = 1;
                   while(n--){
                            day.d++; //天数加1
                            if(day.d == month[day.m][isLeap(day.y)] + 1){ //满当月天数
                                     day.m++; //日期变为下个月1号
                                     day.d = 1;
                            }
                            if(day.m == 13){ //月份满12个月
                                     day.y++;
                                     day.m = 1;
                            }
                   }
                   printf("%04d-%02d-%02d\n", day.y, day.m, day.d); //输出结果
         }
         return 0;
}
 

问题 E 日期累加

#include<cstdio>

int month[13][2] = { //平年和闰年的每个月的天数,第二维为0时表示平年,为1表示闰年
         {0, 0}, {31, 31}, {28, 29}, {31, 31}, {30, 30}, {31, 31}, {30, 30},
         {31, 31}, {31, 31}, {30, 30}, {31, 31}, {30, 30}, {31, 31}
};

bool isLeap(int year){ //判断是否是闰年
         return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

struct Date{
         int y, m, d;
};

int main(){
         Date day;
         int m, n;
         scanf("%d", &m);
         while(m--){
                   scanf("%d%d%d%d", &day.y, &day.m, &day.d, &n);
                   while(n--){
                            day.d++; //天数加1
                            if(day.d == month[day.m][isLeap(day.y)] + 1){ //满当月天数
                                     day.m++; //日期变为下个月1号
                                     day.d = 1;
                            }
                            if(day.m == 13){ //月份满12个月
                                     day.y++;
                                     day.m = 1;
                            }
                   }
                   printf("%04d-%02d-%02d\n", day.y, day.m, day.d); //输出结果
         }
         return 0;
}
 

进制转换

【PAT B1022】D进制A+B

#include<cstdio>

int main(){
         int a, b, d;
         scanf("%d%d%d", &a, &b, &d);
         int sum = a + b;
         int ans[31], num = 0; //ans存放D进制的每一位
         do{
                   ans[num++] = sum % d;
                   sum /= d;
         } while(sum != 0);
         for(int i = num - 1; i >= 0; i--){ //从高位到低位进行输出
                   printf("%d", ans[i]);
         }
         return 0;
}
 

本节习题

http://codeup.cn/contest.php?cid=100000579

问题 A 又一版 A+B

#include<cstdio>

int main(){
         long long int a, b, sum;
         int m;
         while(scanf("%d", &m), m != 0){
                   scanf("%d%d", &a, &b);
                   int z[100], num = 0;
                   sum = a + b;
                   do{
                            z[num++] = sum % m;
                            sum /= m;
                   } while(sum != 0);
                   for(int i = num - 1; i >= 0; i--){
                            printf("%d", z[i]);
                   }
                   printf("\n");
         }
         return 0;
}
 
 

问题 B 找x

#include<cstdio>
#include<string.h>
#include<stdlib.h>
/*notice:
自己运行样例很正确,但是在codeup上测试就是答案错误,一直在找问题,最后花钱下载了测试数据和源码。
发现数据里的名字一列最长有70多位远远超出我设置的数组大小,用string应该不用考虑这个问题
*/
struct student{
         char no[100];
         char name[100];
         char sex[5];
         int age;
};

const int maxn = 1010;
student stu[maxn];

int main(){
         int n, m;
         while(scanf("%d", &n) != EOF){
                   for(int i = 0; i < n; i++){
                            scanf("%s %s %s %d", &stu[i].no, &stu[i].name, &stu[i].sex, &stu[i].age);
                   }
                   scanf("%d", &m);
                   int x = 0;
                   char str[4];
                   for(int i = 0; i < m; i++){
                            scanf("%s", str);
                            x = atoi(str) - 1;
                            if(x < n) printf("%s %s %s %d\n", stu[x].no, stu[x].name, stu[x].sex, stu[x].age);
                            else printf("No Answer!\n");
                   }
         }
         return 0;
}
 

问题 B 数制转换

#include<stdio.h>
#include<string.h>
int main()
{
         int a,b;
         char num[40];
         while(scanf("%d%s%d",&a,num,&b)!=EOF)
         {
                   char res[50];
                   long c=0;
                   int len=strlen(num);
                   //printf("num=%s\n",num);
                   for(int i=0;i<len;i++)
                   {
                            if(num[i]<='9'&&num[i]>='0')
                            {
                                     c=num[i]-'0'+c*a;
                                     //printf("c=%d;\n",c);
                            }
                            else if(num[i]>='A'&&num[i]<='F')
                            {
                                     c=num[i]-'A'+10+c*a;
                            }
                            else if(num[i]>='a'&&num[i]<='f')
                            {
                                     c=num[i]-'a'+10+c*a;
                            }
                   }
                   //printf("c=%ld\n",c);
                   int p,j=0;
                   do
                   {
                            p=c%b;
                            res[j++]=(p<10)?(p+'0'):((p-10)+'A');
                            c/=b;
                   }while(c>0);
                   //printf("j-1=%d\n",j-1);
                   //printf("strlen(res)-1=%d\n",strlen(res)-1);
                   for(int i=j-1;i>=0;i--)
                   {
                            printf("%c",res[i]);
                   }
                   printf("\n");
         }
         return 0;
}

 

问题 C 进制转换

#include<stdio.h>

int main(){
         char n[40], buf[200]; //n分别将大数、二进制数以字符串形式存储
         int num[40], len, i, len_str, c, tmp, j; //int型数组sum存储大数的每一位数字
         while (scanf("%s", n) != EOF){
                   for (len = 0; n[len]; len++){ //到字符串n的结束位(-1)时退出循环
                            num[len] = n[len] - '0';
                   }
                   i = 0, len_str = 0;
                   while (i < len){
                            buf[len_str++] = num[len - 1] % 2 + '0'; // 大数的最后一位是奇数存"1",偶数存"0"
                            c = 0; //高位借位
                            for (j = i; j < len; j++){ //将int数组n处理成大数除2后的结果(笔算除法)
                                     tmp = num[j]; // 暂存最高位
                                     num[j] = (num[j] + c) / 2; // 最高位与借位相加除2
                                     if (tmp & 1){//二进制位与运算,判断tmp是否为奇数
                                               c = 10; //为奇数则向后余10
                                     }
                                     else
                                               c = 0;
                            }
                            if (num[i] == 0) //最高为为0则后移
                                     i++;
                   }
                   for (int j = len_str - 1; j >= 0; j--){
                            printf("%c", buf[j]);
                   }
                   printf("\n");
         }
         return 0;
}

 

问题 D 八进制

#include<stdio.h>

int main(){
         int n;
         while(scanf("%d", &n) != EOF){
                   int ans[10], k = 0;
                   do{
                            ans[k++] = n % 8;
                            n /= 8;
                   } while(n != 0);
                   for(int i = k - 1; i >= 0; i--) printf("%d", ans[i]);
                   printf("\n");
         }
         return 0;
}
 

字符串处理

【codeup 5901】回文串

#include<cstdio>
#include<cstring>
const int maxn = 256;

// 判断字符串str是否是“回文串”
bool judge(char str[]){
         int len = strlen(str);
         for(int i = 0; i < len / 2; i++){
                   if(str[i] != str[len - i - 1]){
                            return false;
                   }
         }
         return true;
}

int main(){
         char str[maxn];
         while(gets(str)){
                   bool flag = judge(str);
                   if(flag) printf("YES\n");
                   else printf("NO\n");
         }
         return 0;
}

 

【PAT B1009】说反话

#include<cstdio>
#include<cstring>

int main(){
         char str[90];
         gets(str);
         int len = strlen(str), r = 0, h = 0; //r为行,h为列
         char ans[90][90]; //ans[0]~ans[r]存放单词
         for(int i = 0; i < len; i++){
                   if(str[i] != ' '){ //如果不是空格,则存放至ans[r][h],并令h++
                            ans[r][h++] = str[i];
                   } else {
                            ans[r][h] = '\0'; //文末结束符\0
                            r++;
                            h = 0;
                   }
         }
         for(int i = r; i >= 0; i--){ //倒着输出单词
                   printf("%s", ans[i]);
                   if(i > 0) printf(" ");
         }
         return 0;
}
 

本节习题

http://codeup.cn/contest.php?cid=100000580

问题 A 字符串连接

#include<stdio.h>

int main(){
         char a[110], b[110];
         while(scanf("%s %s", a, b) != EOF){
                   char c[210];
                   int i = 0;
                   for(; a[i] != '\0'; i++) c[i] = a[i];
                   int j = 0;
                   for(; b[j] != '\0'; j++) c[i + j] = b[j];
                   c[i + j] = '\0';
                   printf("%s\n", c);
         }
         return 0;
}
 

问题 B 首字母大写-2

#include <cstring>
#include <cstdio>
using namespace std;
 
int main()
{
    char str[200] = " ";//初始化为含有一个空格的字符串,而不是空字符串
    while(gets(str + 1) != NULL){
        for(int i = 1; i < strlen(str); i++)
            if((str[i-1] == ' ' || str[i-1] == '\t') && str[i] >= 'a' && str[i] <= 'z')
                str[i] -= 32;
        
        for(int i = 1; i < strlen(str); i++)
            printf("%c", str[i]);
        printf("\n");
    }
    return 0;
}

 

问题 C 字符串的查找删除-2

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MATCH 100
#define MAX 1000
 
int fail[MATCH];
 
void compute_prefix(char *p)
{
    int i, m, k;
 
    m = strlen(p);
    k = 0;
 
    for (i = 2; i <= m; i ++) {
        while (k > 0 && p[k] != p[i - 1]) {
            k = fail[k - 1];
        }
 
        if (p[k] == p[i - 1]) {
            k = k + 1;
        }
 
        fail[i - 1] = k;
    }
}
 
 
int kmp_match(char *p, char *s, char *flag)
{
    int i, m, n, k, j;
 
    // 初始化匹配数组
    memset(flag, -1, sizeof(flag));
 
    // 初始化fail数组
    compute_prefix(p);
 
    m = strlen(p);
    n = strlen(s);
    k = j = 0;
 
    for (i = 0; i < n; i ++) {
        while (k > 0 && p[k] != s[i]) {
            k = fail[k - 1];
        }
 
        if (p[k] == s[i]) {
            k = k + 1;
        }
 
        if (k == m) {
            flag[j] = i - m + 1;
            j ++;
            k = fail[k - 1];
        }
    }
 
    return j;
}
 
 
int main()
{
    char p[MATCH], t[MAX][MAX], s[MAX][MAX], flag[MAX];
    int i, m, num, index, j, k, sign;
 
    // 处理模式串
    scanf("%s", p);
    getchar();
    m = strlen(p);
    for (i = 0; i < m; i ++) {
        if (p[i] >= 'A' && p[i] <= 'Z') {
            p[i] = tolower(p[i]);
        }
    }
 
    // 接收文本串
    for (index = 0; gets(t[index]); index ++) {
        if (strcmp(t[index], "}") == 0) {
            break;
        }
    }
 
    // 复制文本串转小写
    for (i = 0; i <= index; i ++) {
        for (j = 0; j < strlen(t[i]); j ++) {
            if (t[i][j] >= 'A' && t[i][j] <= 'Z') {
                s[i][j] = tolower(t[i][j]);
            }else {
                s[i][j] = t[i][j];
            }
        }
    }
 
    // 按行kmp匹配
    for (i = 0; i <= index; i ++) { 
        // 判断是否是匹配点
        num = kmp_match(p, s[i], flag);
        for (j = 0; j < strlen(t[i]);) {
            for (k = 0, sign = 1; k < num; k ++) {
                if (flag[k] == j) {
                    sign = 0;
                    break;
                }
            }
            if (sign) {
                if (t[i][j] != ' ') {
                    printf("%c", t[i][j]);
                }
                j ++;
            }else {
                j += m;
            }
        }
        printf("\n");
    }
    printf("\n");
 
    return 0;
}

 

问题 B 首字母大写

#include<stdio.h>

int main(){
         char a[110];
         while(gets(a) != NULL){
                   if('a' <= a[0] && a[0] <= 'z') a[0] = a[0] - 32;
                   for(int i = 1; a[i] != '\0'; i++){
                            if((a[i - 1] == ' ' || a[i - 1] == '\t' || a[i - 1] == '\r' || a[i - 1] == '\n') && ('a' <= a[i] && a[i] <= 'z')){
                                     a[i] = a[i] - 32;
                            }
                   }
                   printf("%s\n", a);
         }
         return 0;
}
 

问题 B 首字母大写-3

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    char c[105];
    while (gets(c) != NULL) {
        int len = strlen(c);
 
        //处理字符串的每行的第一个字母,大写字母 = 小写字母-32
        if (c[0] >= 97 && c[0] <= 122) {
            c[0] = c[0] - 32;
        }
        for (int i = 1; i < len - 1; i++) {
            //可能存在多个空格,所以使用while进行判断
            while (c[i] == ' ') {
                i++;
                if (c[i] >= 97 && c[i] <= 122) {
                    c[i] -= 32;
                }
            }
        }
        printf("%s\n", c);
    }
    return 0;
}
 

问题 C 字符串的查找删除

#include <cstdio>
#include <cstring>
 
char del[1000], str[1001][1001], ans[1001][1001];
        
int main()
{
         int index = 0;
         gets (del);
         int len1 = strlen (del);
        
         while (gets (str[index++]))                                             //读入数据;
  
     for(int i = 0; i < len1; i++){                                             //将del全部转化为小写字母;
           if(del[i] >= 'A' && del[i] <= 'Z') { 
                del[i] = del[i] - 'A' + 'a'; 
              } 
    } 
 
         for(int i = 0; i < index; i++) { 
                   int len2 = strlen (str[i]);
                   for (int j = 0; j < len2; j++) {
                                     ans[i][j] = str[i][j];                           //用另一数组存储原数据,然后将其转化为小写字母;
                                     if (str[i][j] >= 'A' && str[i][j] <= 'Z') {
                                               str[i][j] = str[i][j] - 'A' + 'a';
                            }
                   }
                  
                   for (int j = 0, k = 0; j < len2; ) {            
                            if (str[i][j + k] == del[k]) {                     //判断是否与短字符第一个字符相同;
                                     k++;                                                                
                                     if (k == len1)  {                                         //若完全相同则跳过;
                                               j = j + k;
                                               k = 0;
                                     }
                            }
                            else {
                                     if (str[i][j] != ' ')              printf ("%c", ans[i][j]);         //输出原字符;
                                     j++;
                                     k = 0;
                            }
                   }
                   printf ("\n");
         }
 
        return 0;
}     

 

问题 D 单词替换

#include <cstdio>
#include <cstring>
 
char del[1000], replace[1000], str[1001];
        
int main(){    
         while(gets(str) != NULL){
                   gets(del); //读入数据;
                   int len1 = strlen(del);
                   gets(replace);
                   int len2 = strlen (str);
                   for(int j = 0, k = 0; j < len2; ){              
                            if(str[j + k] == del[k]){ //判断是否与短字符第一个字符相同;
                                     k++;                                                                
                                     if (k == len1){ //若完全相同则跳过并输出替换字符串;
                                               j = j + k;
                                               k = 0;
                                               printf("%s", replace);
                                     }
                            }
                            else{
                                     printf ("%c", str[j]); //输出原字符;
                                     j++;
                                     k = 0;
                            }
                   }
                   printf("\n");
         }
        return 0;
}     

 

问题 E 字符串去特定字符

#include<stdio.h>
#include<string.h>

int main(){
         char s[100001], c;
         while(gets(s)){
                   scanf("%c", &c);
                   int len = strlen(s);
                   for(int i = 0; i < len; i++){
                            if(s[i] != c) {
                                     printf("%c", s[i]);
                            }
                   }
                   printf("\n");
                   getchar();
         }
         return 0;
}
 

问题 F 数组逆置

#include<stdio.h>
#include<string.h>

int main(){
         char s[100001];
         while(gets(s)){
                   int len = strlen(s);
                   for(int i = len - 1; i >= 0; i--){
                            printf("%c", s[i]);
                   }
                   printf("\n");
         }
         return 0;
}
 

问题 G 比较字符串

#include<stdio.h>
#include<string.h>

int main(){
         char a[51], b[51];
         int n;
         scanf("%d", &n);
         while(n--){
                   scanf("%s", a);
                   scanf("%s", b);
                   int len1 = strlen(a), len2 = strlen(b);
                   if(len1 == len2) printf("%s is equal long to %s\n", a, b);
                   else if(len1 > len2) printf("%s is longer than %s\n", a, b);
                   else printf("%s is shorter than %s\n", a, b);
         }
         return 0;
}
 

问题 H 编排字符串

#include<stdio.h>
#include<string.h>

int main(){
         char s[4][21];
         int m, i = 0, k; // i记录输入字符串个数 k为每次输入后要输出字符串的个数
         scanf("%d", &m);
         while(m--){
                   scanf("%s", s[(i++) % 4]);
                   if(i >= 4) k = 4;
                   else k = i;
                   for(int no = 1, j = i - 1; k > 0; k--, no++, j--){
                            printf("%d=%s", no, s[j % 4]);
                            if(k != 1) printf(" ");
                   }
                   printf("\n");
         }
         return 0;
}
 

问题 I 【字符串】回文串

#include<stdio.h>
#include<string.h>

int main(){
         char str[256];
         while(scanf("%s", str) != EOF){
                   int len = strlen(str);
                   int i = 0;
                   for( ; i < len / 2; i++){
                            if(str[i] != str[len - i - 1]){
                                     printf("NO\n");
                                     break;
                            }
                   }
                   if(i == len / 2) printf("YES\n");
         }
         return 0;
}
 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值