【算法笔记题解】《算法笔记知识点记录》第三章——入门模拟1——简单模拟

请添加图片描述
如果喜欢大家还希望给个收藏点赞呀0.0
相关知识点大家没基础的还是要看一下的,链接:
《算法笔记知识点记录》第三章——入门模拟

由于放原题的话文章实在太长,所以题多的话我只放思路和题解,大家请前往相应的网站查看题目呀0.0

🧑🏻作者简介:一个从工业设计改行学嵌入式的年轻人
✨联系方式:2201891280(QQ)
📔源码地址:https://gitee.com/xingleigao/algorithm-notes
全文大约阅读时间: 30min


全文目录


🍕3.1小节——入门模拟->简单模拟

地址合集:3.1小节——入门模拟->简单模拟

问题 A: 剩下的树

解题思路

读入L和M的值,只要L和M不全为0就进行循环计算,然后模拟就是

  1. 先把所有的端点都标记为有树**(利用memset直接标记,大家可以想想为啥为这里可以设置为1而int不可以)**
  2. 读入区间后把所有的区间内元素设置为没有树并统计少了几棵树。
#include<cstdio>
#include<cstring>
int main(){
    int L, M;
    while(scanf("%d %d",&L,&M) && (L !=0 || M != 0)){
        bool temp[L+1];
        memset(temp,1,sizeof(temp));
        int ans = L + 1;
        while(M--){
            int a, b;
            scanf("%d %d", &a, &b);
            while(a <= b){
                if(temp[a]) ans--,temp[a] = 0;
                a++;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

问题 B: A+B

解题思路

整个过程最重要的就是将字符串转化为整数。

  1. 读入两个字符串
  2. 将两个字符串转化为整数
    2.1 判断符号 如果有符号先跳过
    2.2 依次读入数字并跳过,
    2.3 根据第一位符号来反转(这题没出int的负数比正数多一个的问题,不然更恶心)
  3. 返回结果
#include<cstdio>
int string_to_num(char *s){
    int i = 0, ans = 0;
    if(s[i] == '-') i++;
    for(;s[i] != '\0';i++){
        if(s[i] == ',') continue;
        ans *= 10;
        ans += s[i] - '0';
    }
    if(s[0] == '-') ans = -ans;
    return ans;
}
int main(){
    char a[14],b[14];
    while(scanf("%s %s", a, b) != EOF){
        printf("%d\n",string_to_num(a) + string_to_num(b));
    }
    return 0;
}

问题 C: 特殊乘法

解题思路

整个过程最重要的就是将取出每一位的数据,这里经常采用的就是不断除以10取余数的方式。有点像转换成二进制的每一位的方式。除留余数法。

#include<cstdio>
int matix(int a, int b){
    int ans = 0;
    while(a){
        int tempa = a % 10;
        a /= 10;
        int temp = b;
        while(b){
            ans += tempa * (b % 10);
            b /= 10;
        }
        b = temp;
    }
    return ans;
}
int main(){
    int a, b;
    while(scanf("%d %d", &a, &b) != EOF){
        printf("%d\n",matix(a, b));
    }
    return 0;
}

问题 D: 比较奇偶数个数

解题思路

在输入过程中不断统计奇数的个数

  • 如果最终的奇数个数超过了总数的一半 就输出YES
  • 否则输出NO
#include<cstdio>
int main(){
    int n;
    while(scanf("%d",&n) != EOF){
        int tempn = n,ans = 0;
        while(n--){
            int temp;
            scanf("%d", &temp);
            if(temp & 1)    ans++;  //统计奇数个数
        }
        if(ans > tempn /2)  //奇数比较多
            printf("YES\n");
        else    printf("NO\n");
    }
    return 0;
}

问题 E: Shortest Distance (20)

解题思路

真的好花里胡哨啊。。。。就是需要计算走那边更近,需要借助前缀和,直接看吧。。思想不复杂。

#include<cstdio>
int main(){
    int n;
    while(scanf("%d",&n) != EOF){
        int temp[n+1];
        temp[0] = 0;
        for(int i = 0;i < n;i++){
            int tempa;
            scanf("%d",&tempa);
            temp[i+1] = temp[i] + tempa;//计算前缀和
        }

        int m;
        scanf("%d",&m);
        while(m--){
            int a, b;
            scanf("%d %d",&a,&b);
            int ans;
            if(a > b)   ans = temp[a - 1] - temp[b - 1];
            else        ans = temp[b - 1] - temp[a - 1];
            if(2 * ans > temp[n])   ans = temp[n] - ans;
            printf("%d\n",ans);
        }
    }
    return 0;
}

问题 F: A+B和C (15)

解题思路

注意数据范围所以直接开到long long的数据了,另外注意序号是从1开始的,而变量一般是从0开始循环!

#include<cstdio>
int main(){
    int n;
    while(scanf("%d",&n) != EOF){
        for(int i = 0;i < n; ++i){
            long long a, b, c;
            scanf("%lld %lld %lld", &a, &b, &c);
            if(a + b > c)
                printf("Case #%d: true\n",i+1);
            else 
                printf("Case #%d: false\n",i+1);
        }
    }
    return 0;
}

问题 G: 数字分类 (20)

解题思路

从一开始模拟整个过程就好了,没那么复杂。

#include<cstdio>
int main(){
    int n;
    while(scanf("%d",&n) != EOF){
        bool flag[5] = {0},flag1= 0;
        int a[5] = {0};
        double a3 = 0;
        while(n--){
            int temp;
            scanf("%d", &temp);
            switch(temp % 5){
                case 0:
                    if(temp % 2 == 0)   a[0] += temp,flag[0] = 1;
                    break;
                case 1:
                    flag[1] = 1;
                    if(flag1)   a[1] -= temp,flag1 = 0;
                    else        a[1] += temp,flag1 = 1;
                    break;
                case 2:
                    flag[2] = 1;
                    a[2]++;
                    break;
                case 3:
                    flag[3] = 1;
                    a3 += temp;
                    a[3] ++;
                    break;
                case 4:
                    flag[4] = 1;
                    if(a[4] < temp) a[4] = temp;
                    break;
                default:
                    break;
            }
        }
        if(a[3])    a3 /= a[3];
        for(int i = 0;i < 3;++i)
            if(flag[i]) printf("%d ",a[i]);
            else printf("N ");
        if(a[3])    printf("%.1f ",a3);
        else printf("N ");
        if(flag[4]) printf("%d\n",a[4]);
        else printf("N\n");
    }
    return 0;
}

问题 H: 部分A+B (15)

解题思路

就是看给定串内有多少个对应元素呗。
为了防止超过数据范围,结果直接用了long long 保存。int就算无符号也最多是8x108左右,不太行。

#include<cstdio>
int main(){
    char a[12],b[12];
    int da, db;
    while(scanf("%s %d %s %d", a, &da, b, &db) != EOF){
        long long ansa = 0, ansb = 0;
        for(int i = 0;a[i];++i)
            if(a[i] == '0' + da) ansa *= 10, ansa += da;
        for(int i = 0;b[i];++i)
            if(b[i] == '0' + db) ansb *= 10, ansb += db;
        printf("%lld\n", ansa + ansb);
    }
    return 0;
}

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

解题思路

这道题,有点复杂。。。。。大概分几步

  1. 读入数据的同时统计输赢和统计赢得那个人的手势
  2. 然后按照要求输出酒哈了

注意:输赢信息保存一份就好,输出的时候倒序输出就是另外一个人的信息0.0

#include<cstdio>
int main(){
    char ans[4] = "BCJ";
    int n, ansa[3], ansb[3], ans_sum[3];
    while(scanf("%d",&n) != EOF){
        //重置数组
        for(int i = 0;i < 3;i++)    
            ansa[i] = 0 ,ansb[i] = 0, ans_sum[i] = 0;
        while(n--){
            char tempa,tempb;
            scanf("\n%c %c",&tempa,&tempb);
            int i,j;
            for(i = 0;i < 3;i++)    
                if(ans[i] == tempa) break;
            for(j = 0;j < 3;j++)
                if(ans[j] == tempb) break;
            if(i + 1 == j || j + 2 == i)    ans_sum[0]++,ansa[i]++;
            else if(i == j) ans_sum[1] ++;
            else ans_sum[2]++,ansb[j]++;
            //printf("%c %c %d %d\n",tempa,tempb,i,j);
        }
        int max1 = 0, max2 = 0;
        for(int i = 1;i < 3;i++){
            if(ansa[max1] < ansa[i])    max1 = i;
            if(ansb[max2] < ansb[i])    max2 = i;
        }
        printf("%d %d %d\n%d %d %d\n%c %c\n",ans_sum[0],ans_sum[1],ans_sum[2],ans_sum[2],ans_sum[1],ans_sum[0],ans[max1],ans[max2]);
    }
    return 0;
}

B1001 害死人不偿命的(3n+1)猜想 (15 分)

地址:B1001 害死人不偿命的(3n+1)猜想 (15 分)

解题思路

按照要求进行操作并计数就好了。

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

1011 A+B 和 C (15 分)

地址:1011 A+B 和 C (15 分)

解题思路

因为溢出问题简单的作为long long作为输入来进行判定来解决。平时一定要注意输入输出的判定呀。。

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

1046 划拳 (15 分)

地址:1046 划拳 (15 分)

解题思路

根据喊和划的数字来判断是否猜中,然后再根据是否只有一个猜中来增加结果统计。

#include<cstdio>
int main(){
    int n,han_a,hua_a,sum_a=0,han_b,hua_b,sum_b=0;
    scanf("%d",&n);
    while(n--){
        scanf("%d %d %d %d",&han_a,&hua_a,&han_b,&hua_b);
        if(hua_a==(han_a+han_b)){
            if(hua_b!=(han_a+han_b)) sum_b++;
        }
        else if(hua_b==(han_a+han_b)) sum_a++;
    }
    printf("%d %d\n",sum_a,sum_b);
    return 0;
}

1008 数组元素循环右移问题 (20 分)

地址:1008 数组元素循环右移问题 (20 分)

解题思路

先将所有元素右移对应的位数,然后再将前m位写回就好了。

#include<cstdio>
int main(){
    int n, m;
    scanf("%d %d", &n, &m);
    m %= n;
    int num[n + m];

    for(int i = 0;i < n;i++)
        scanf("%d",&num[i]);

	//双指针移动
    for(int i = m + n - 1,j = n - 1;j >= 0;i--,j--)
        num[i] = num[j];
    
    for(int i = 0; i < m; i++)//写回
        num[i] = num[i + n];

    printf("%d",num[0]);
    for(int i = 1;i < n;i++)
        printf(" %d",num[i]);
    puts("");
    return 0;
}

B1012 数字分类 (20 分)

地址:B1012 数字分类 (20 分)

解题思路

按照题目要求依次进行数字的统计和最后的输出就好了。

#include<cstdio>
int main(){
    int num,A1=0,A2=0,A3=0,A5=0,n,A2_i=2;
    float A4=0,A4_num=0;
    scanf("%d",&n);
    for(int i=0;i<n;++i) {
        scanf("%d",&num);
        switch(num%5){
            case 0:if(num%2==0) A1+=num;break;
            case 1:A2_i%2==0?A2+=num:A2-=num;A2_i++;break;
            case 2:A3++;break;
            case 3:A4_num++;A4+=num;break;
            case 4:num>A5?A5=num:A5=A5;break;
        }
    }
    A4=A4/A4_num;
    A1>0?printf("%d ",A1):printf("N ");
    A2_i>2?printf("%d ",A2):printf("N ");
    A3>0?printf("%d ",A3):printf("N ");
    A4>0?printf("%.1f ",A4):printf("N ");
    A5>0?printf("%d\n",A5):printf("N\n");
    return 0;
}

B1018 锤子剪刀布 (20 分)

地址:B1018 锤子剪刀布 (20 分)

解题思路

这个题目比较复杂,可以利用字符串来转化所有的出拳为0、1、2然后+1就是对应的输赢位置。

#include<cstdio>
int main(){
    char ans[4] = "BCJ";
    int n, ansa[3], ansb[3], ans_sum[3];
    while(scanf("%d",&n) != EOF){
        //重置数组
        for(int i = 0;i < 3;i++)    
            ansa[i] = 0 ,ansb[i] = 0, ans_sum[i] = 0;
        while(n--){
            char tempa,tempb;
            scanf("\n%c %c",&tempa,&tempb);
            int i,j;
            for(i = 0;i < 3;i++)    
                if(ans[i] == tempa) break;
            for(j = 0;j < 3;j++)
                if(ans[j] == tempb) break;
            if(i + 1 == j || j + 2 == i)    ans_sum[0]++,ansa[i]++;
            else if(i == j) ans_sum[1] ++;
            else ans_sum[2]++,ansb[j]++;
            //printf("%c %c %d %d\n",tempa,tempb,i,j);
        }
        int max1 = 0, max2 = 0;
        for(int i = 1;i < 3;i++){
            if(ansa[max1] < ansa[i])    max1 = i;
            if(ansb[max2] < ansb[i])    max2 = i;
        }
        printf("%d %d %d\n%d %d %d\n%c %c\n",ans_sum[0],ans_sum[1],ans_sum[2],ans_sum[2],ans_sum[1],ans_sum[0],ans[max1],ans[max2]);
    }
    return 0;
}

A1042 Shuffling Machine (20 分)

地址:A1042 Shuffling Machine (20 分)

解题思路

直接做转换,为了将1-13号牌映射到0-12 对所有序号进行-1操作,这样可以利用取余得到花色,最终的序号输出的时候需要进行+1。

#include<cstdio>
const int N=54;
char mp[5]={'S','H','C','D','J'};
int start[N+1],end[N+1],next[N+1];
int main(){
    int k;
    scanf("%d",&k);
    for(int i=1;i<=N;i++) start[i]=i;
    for(int i=1;i<=N;i++) scanf("%d",&next[i]);
    while(k--) {
        for(int i=1;i<=N;++i) end[next[i]]=start[i];
        for(int i=1;i<=N;++i) start[i]=end[i];
    }
    for(int i=1;i<=N;i++){
        if(i!=1) printf(" ");
        end[i]--;
        printf("%c%d",mp[end[i]/13],end[i]%13+1);
    }
    printf("\n");
    return 0;
}

A1046 Shortest Distance (20 分)

地址:A1046 Shortest Distance (20 分)

解题思路

利用前缀和做简化,优化到O(1)的查询复杂度。

#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN=100005;
int dis[MAXN],A[MAXN];
int main(){
    int sum=0,query,n,left,right;
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        scanf("%d",&A[i]);
        sum+=A[i];
        dis[i]=sum;//前缀和
    }
    scanf("%d",&query);
    while(query--){
        scanf("%d %d",&left,&right);
        if(left>right) swap(left,right);
        int temp=dis[right-1]-dis[left-1];
        printf("%d\n",min(temp,sum-temp));//对比结果输出
    }
    return 0;
}

A1065 A+B and C (64bit) (20 分)

地址:A1065 A+B and C (64bit) (20 分)

解题思路

直接计算结果,根据结果和原始数据的情况来进行溢出判断,生成最终的结果。

#include<cstdio>
int main(){
    int T,tcase=1;
    scanf("%d",&T);
    while(T--){
        long long a,b,c;
        scanf("%lld %lld %lld",&a,&b,&c);
        long long res=a+b;
        bool flag;
        if(a>0&&b>0&&res<0) flag=true;//上溢  必然大于
        else if(a<0&&b<0&&res>=0) flag=false; //下溢必然小于
        else if(res>c) flag=true;//无溢出正常比较
        else flag=false;
        flag==true?printf("Case #%d: true\n",tcase++):printf("Case #%d: false\n",tcase++);
    }
    return 0;
}

B1010 一元多项式求导 (25 分)

地址:B1010 一元多项式求导 (25 分)

解题思路

其实就是很简单的公式,但是注意特殊情况,另外,这道题的判定方式应该是多次运行的。所以没加多余的!= EOF。

#include<cstdio>
int main(){
    int n=1,a,e;
    while(scanf("%d %d",&a,&e)!=EOF){
        if(e!=0){
            if(n!=1){
                printf(" ");
            }
            printf("%d %d",a*e,e-1);
            n++;
        }
    }
    if(n==1) printf("0 0");
    printf("\n");
    return 0;
}

1002 A+B for Polynomials (25 分)

地址:1002 A+B for Polynomials (25 分)

解题思路

直接用hash表来存储对应指数的系数就好了,不复杂。

#include<cstdio>
const int max_n=1111;
double p[max_n]={0};
int main(){
    int k,n,count=0;
    double a;
    scanf("%d",&k);
    count+=k;
    for(int i=0;i<k;i++){
        scanf("%d %lf",&n,&a);
        p[n]+=a;
    }
    scanf("%d",&k);
    count+=k;
    for(int i=0;i<k;i++){
        scanf("%d %lf",&n,&a);
        if(p[n]!=0) count--;
        p[n]+=a;
        if(p[n]==0) count--;
    }
    printf("%d",count);
    for(int i=max_n;i>=0;i--)
        if(p[i]!=0)
            printf(" %d %.1f",i,p[i]);
    printf("\n");
    return 0;
}

1009 Product of Polynomials (25 分)

地址:1009 Product of Polynomials (25 分)

解题思路

接收所有的第一个的指数和系数,第二个每次接收的时候都和之前的所有数相乘等到结果保存到ans就好了。

#include<cstdio>
struct Poly{
    int exp;//指数
    double cof;//系数
}Poly[1001];
double ans[2001]={0.0};
int main(){
    int n,m,number=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++) scanf("%d %lf",&Poly[i].exp,&Poly[i].cof);
    scanf("%d",&m);
    for(int i=0;i<m;i++){
        int exp;
        double cof;
        scanf("%d %lf",&exp,&cof);
        for(int j=0;j<n;j++) {
            if(ans[exp+Poly[j].exp]==0.0) number++;
            ans[exp+Poly[j].exp]+=(cof*Poly[j].cof);
            if(ans[exp+Poly[j].exp]==0.0) number--;
        }
    }
    printf("%d",number);
    for(int i=2000;i>=0;--i){
        if(ans[i]!=0.0) printf(" %d %.1f",i,ans[i]);
    }
    printf("\n");
}

🐱‍🚀3.2小节——入门模拟->查找元素

地址合集:3.2小节——入门模拟->查找元素

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

解题思路

每次读入对应的数组,从前往后进行查找统计就完事了呗。

#include<cstdio>
const int maxn=1000;
int a[maxn];
int main(){
    int n,x;
    while(scanf("%d",&n) != EOF && n != 0){
        for(int i=0;i<n;++i){
            scanf("%d",&a[i]);
        }
        scanf("%d",&x);
        int count=0;
        for(int i=0;i<n;i++)
            if(a[i]==x) 
                count++;
        printf("%d\n",count);
    }
    return 0;
}

问题 B: 找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;
}

问题 C: 查找学生信息

#include<cstdio>
#include<cstring>
using namespace std;
const int max=1010;
struct student{
    char id[100];
    char name[100];
    char sex[2];
    int age;
}stu[max];
int main(){
    int n,m,flag;
    char temp[4];
    while(scanf("%d",&n)!=EOF){
        for(int i=0;i<n;++i)  scanf("%s%s%s%d",&stu[i].id,&stu[i].name,&stu[i].sex,&stu[i].age);
        scanf("%d",&m);
        for(int i=0;i<m;i++){
            scanf("%s",temp);
            flag=-1;
            for(int j=0;j<n;j++){ if(strcmp(stu[j].id,temp)==0) flag=j;}
            flag==-1?printf("No Answer!\n"):printf("%s %s %s %d\n",stu[flag].id,stu[flag].name,stu[flag].sex,stu[flag].age);
        }
    }
    return 0;
}


问题 D: 查找

#include<cstdio>
int main(){
    int n,m,temp;
    
    while(scanf("%d",&n)!=EOF){
        int a[n];
        for(int i=0;i<n;++i) scanf("%d",&a[i]);
        scanf("%d",&m);
        for(int i=0;i<m;++i){
            scanf("%d",&temp);
            for(int j=0;j<n;++j){
                if(a[j]==temp){
                    printf("YES\n");
                    break;
                }
                else if(j==n-1) printf("NO\n");
            }
        }
    }
    return 0;
}

问题 E: 学生查询

#include<cstdio>
#include<cstring>
struct student{
    char id[20];
    char name[20];
    char sex[10];
    int age;
}stu[20];
int main(){
    int m,n;
    char temp[20];
    scanf("%d",&m);
    for(int i=0;i<m;++i){
        scanf("%d",&n);
        for(int j=0;j<n;++j){
            scanf("%s %s %s %d",&stu[j].id,&stu[j].name,&stu[j].sex,&stu[j].age);
        }
        scanf("%s",&temp);
        for(int j=0;j<n;++j){
             if(strcmp(temp,stu[j].id)==0){
                printf("%s %s %s %d\n",stu[j].id,stu[j].name,stu[j].sex,stu[j].age);
                break;
             }
        }
    }
    return 0;
}

1041 考试座位号 (15 分)

地址:1041 考试座位号 (15 分)

#include<cstdio>
typedef struct {
    char id[16];
    int jishi;
    int kaoshi;
}student;
int main(){
    int n,chan,cha;
    scanf("%d",&n);
    student stu[n];
    for(int i=0;i<n;++i) scanf("%s %d %d",&stu[i].id,&stu[i].jishi,&stu[i].kaoshi);
    scanf("%d",&chan);
    while(chan--){
        scanf("%d",&cha);
        for(int i=0;i<n;++i)
            if(stu[i].jishi==cha) printf("%16.16s %d\n",stu[i].id,stu[i].kaoshi);
    }
    return 0;
}

1004 成绩排名 (20 分)

地址: 1004 成绩排名 (20 分)

#include<cstdio>
#include<cstring>
int main(){
    int n,high=-1,low=101,score;
    char h_name[11],h_id[11],l_name[11],l_id[11],name[11],id[11];
    scanf("%d",&n);
    while(n--){
        scanf("%s%s%d",&name,&id,&score);
        if(score>high) {strcpy(h_name,name);strcpy(h_id,id);high=score;}
        if(score<low) {strcpy(l_name,name);strcpy(l_id,id);low=score;}
    }
    printf("%s %s\n%s %s\n",h_name,h_id,l_name,l_id);
    return 0;
}

1028 人口普查 (20 分)

地址:1028 人口普查 (20 分)

#include<cstdio>
#include<cstring>
int main(){
    int n,youxiao=0;
    scanf("%d",&n);
    char minStr[12]="9",minName[6]="",maxStr[12]="0",maxName[6]=" ",start[12]="1814/09/06",end[12]="2014/09/06",name[6],str[12];
    while(n--){
        scanf("%s %s",&name,&str);
        if(strcmp(str,start)>=0&&strcmp(str,end)<=0){//判断边界
            youxiao++;
            if(strcmp(minStr,str)>=0) {strcpy(minStr,str);strcpy(minName,name);}
            if(strcmp(maxStr,str)<=0) {strcpy(maxStr,str);strcpy(maxName,name);}
        }
    }
    youxiao>0?printf("%d %s %s\n",youxiao,minName,maxName):printf("0\n");
    return 0;
}

1032 挖掘机技术哪家强 (20 分)

地址:1032 挖掘机技术哪家强 (20 分)

#include<cstdio>
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 MAX = -1, k = 0;
	for(int i = 1;i <= n;i++){
		if(school[i] > MAX){
			MAX = school[i];
			k = i;
		}
	}
	printf("%d %d\n", k, MAX);
	return 0;
}

1006 Sign In and Sign Out (25 分)

地址:1006 Sign In and Sign Out (25 分)

#include<cstdio>
#include<cstring>
int main(){
    char id[16],signin[9],signout[9],firstId[16],firstSignin[9]="9",lastId[16],lastSignout[9]="00:00:00";
    int n;
    scanf("%d",&n);
    while(n--){
        scanf("%s %s %s",&id,&signin,&signout);
        if(strcmp(signin,firstSignin)<=0) {strcpy(firstId,id);strcpy(firstSignin,signin);}
        if(strcmp(signout,lastSignout)>=0){strcpy(lastId,id);strcpy(lastSignout,signout);}
    }
    printf("%s %s\n",firstId,lastId);
    return 0;
}

1011 World Cup Betting (20 分)

地址:1011 World Cup Betting (20 分)

#include<cstdio>
const char name[3]={'W','T','L'};
int compy(double a,double b,double c){
    if(a>b){
        if(a>c) return 0;
        else return 2;
    }
    else{
        if(b>c) return 1;
        else return 2;
    }
}
int main(){
    double game[3],fine=1.0;
    for(int i=0;i<3;i++){
        scanf("%lf%lf%lf",&game[0],&game[1],&game[2]);
        int win=compy(game[0],game[1],game[2]);
        printf("%c ",name[win]);
        fine*=game[win];
    }
    fine=(fine*0.65-1)*2;
    printf("%.2f\n",fine);
    return 0;
}

1036 Boys vs Girls (25 分)

地址:1036 Boys vs Girls (25 分)

#include<cstdio>
#include<cstring>
struct people{
    char name[11];
    char gender;
    char id[11];
    int grade;
}highf={" ",'F'," ",-1},lowm={" ",'M'," ",101},temp;
int main(){
    int n;
    scanf("%d",&n);
    while(n--){
        scanf("%s %c %s %d",&temp.name,&temp.gender,&temp.id,&temp.grade);
        if(temp.gender=='F'){
            if(temp.grade>=highf.grade) highf=temp;
        }
        else {
            if(temp.grade<=lowm.grade) lowm=temp;
        }
    }
    highf.grade>-1?printf("%s %s\n",highf.name,highf.id):printf("Absent\n");
    lowm.grade<101?printf("%s %s\n",lowm.name,lowm.id):printf("Absent\n");
    if(highf.grade>-1&&lowm.grade<101) printf("%d\n",highf.grade-lowm.grade);
    else printf("NA\n");
    return 0;
}

🐱‍🐉3.3小节——入门模拟->图形输出

地址合集:3.3小节——入门模拟->图形输出

问题 A: 输出梯形

#include<cstdio>
int main(){
    int h;
    while(scanf("%d",&h)!=EOF){
        for(int i=0;i<h;++i){
            for(int j=0;j<3*h-2;j++){
                if(j<2*(h-i)-2) printf(" ");
                else printf("*");
            }
            printf(" \n");
        }
    }

    return 0;
}

问题 B: Hello World for U

#include<cstdio>
#include<cstring>
int main(){
    char s[82];
    scanf("%s",s);
    int len=strlen(s),n1=(len+2)/3,n2=len-2*n1+2;
    for(int i=0;i<n1-1;++i){
        printf("%c",s[i]);
        for(int j=0;j<n2-2;++j) printf(" ");
        printf("%c\n",s[len-i-1]);

    }
    for(int i=0;i<n2;++i) printf("%c",s[n1-1+i]);
    printf("\n");
    return 0;
}

问题 C: 等腰梯形

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

问题 D: 沙漏图形

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

1036 跟奥巴马一起编程 (15 分)

地址:1036 跟奥巴马一起编程 (15 分)

#include<cstdio>
int main(){
    int n,n2;
    char s;
    scanf("%d %c",&n,&s);
    n2=(n+1)/2;
    //printf("%d",n2);
    for(int i=0;i<n2;i++){
        for(int j=0;j<n;j++){
            if(i==0||i==n2-1) printf("%c",s);
            else{
                if(j==0||j==n-1) printf("%c",s);
                else printf(" ");
            }
        }
        printf("\n");
    }
    return 0;
}

1027 打印沙漏 (20 分)

地址:1027 打印沙漏 (20 分)

#include<cstdio>
int how(int a){
    a=(a+1)/2;
    for(int i=0;i<a+2;i++) if((i*i)>a) return i-1;
    return 0;
}
int main(){
    int h;
    char s;
    scanf("%d %c",&h,&s);
        int n=how(h);
        //printf("%d",n);
        for(int i=0;i<n;i++){
            for(int j=0;j<i;j++) printf(" ");
            for(int j=0;j<2*(n-i)-1;j++) printf("%c",s);
            printf("\n");
        }
        for(int i=1;i<n;i++){
            for(int j=0;j<n-i-1;j++) printf(" ");
            for(int j=0;j<2*i+1;j++) printf("%c",s);
            printf("\n");
        }
        printf("%d\n",h-2*n*n+1);
    return 0;
}

1031 Hello World for U (20 分)

地址:1031 Hello World for U (20 分)

#include<cstdio>
char M[11] = {'1','0','X','9','8','7','6','5','4','3','2'};
int quan[17] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
int main(){
    int n;
    bool flag = true;
    while(scanf("%d",&n) != EOF){
        while(n--){
            bool flag1 = true;
            char num[19];
            int sum = 0,i;
            scanf("%s", num);
            for(i = 0; i < 17; ++i)
                if(num[i] <= '9' &&num[i] >= '0')
                    sum += quan[i]*(num[i] - '0');
                else
                    break;
            
            if(M[sum % 11] == num[17] && i == 17){
                continue;
                printf("N");
            }
            
            if(flag){
                printf("%s",num);
                flag1 = false;
            }
            else printf("\n%s",num);
            flag = false;
        }
        if(flag)
            printf("All passed");
    }
    return 0;
}

🐱‍👤3.4小节——入门模拟->日期处理

地址合集:3.4小节——入门模拟->日期处理

问题 A: 日期差值

#include<cstdio>
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}};
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++;
            if(d1==month[m1][isLeap(y1)]+1){
                m1++;
                d1=1;
            }
            if(m1==13){
                y1++;
                m1=1;
            }
            ans++;
        }
        printf("%d\n",ans);
    }
    return 0;
}

问题 B: Day of Week

#include<cstdio>
#include<cstring>
char week[7][20]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
int year[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}};
char month[12][20]={"January","February","March","April","May","June","July","August","September","October","November","December"};
bool isLeap(int year){
    return (year%4==0&&year%100!=0)||(year%400==0);
};
int toMonth(char m[20]){
    for(int i=0;i<13;i++) if(strcmp(m,month[i])==0) return i+1;
    return 0;
}
int main(){
    int time1,y1,m1,d1;
    char m[20];
    int time2,y2,m2,d2;
    while(scanf("%d %s %d",&d1,&m,&y1)!=EOF){
        m1=toMonth(m);
        int flag=0;
        time1=d1+m1*100+y1*10000;
        int ans=0;
        if(time1>20130107){
                time2=time1;
                time1=20130107;
                flag=1;
        }
        else time2=20130107;
        y1=time1/10000;m1=time1%10000/100;d1=time1%100;
        y2=time2/10000;m2=time2%10000/100;d2=time2%100;
        //printf("%d %d %d",y1,m1,d1);
        //printf("%d %d %d",y2,m2,d2);
        while(y1<y2||m1<m2||d1<d2){
            d1++;
            if(d1==year[m1][isLeap(y1)]+1){
                m1++;
                d1=1;
            }
            if(m1==13){
                y1++;
                m1=1;
            }
            ans++;
        }
        //printf("%d %d",ans,flag);
        flag==0?printf("%s\n",week[6-(ans-1)%7]):printf("%s\n",week[ans%7]);
    }
    return 0;
}

问题 C: 打印日期

#include<cstdio>
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}};
int isLeap(int year){
    return (year%4==0&&year%100!=0)||(year%400==0);
};
int main(){
    int y,m,d;
    while(scanf("%d %d",&y,&d)!=EOF){
        int le=isLeap(y);
        //printf("%d",le);
        int ans=1;
        m=1;
        while(d>month[m][le]){
            d-=month[m][le];
            m++;
        }
        printf("%04d-%02d-%02d\n",y,m,d);
    }
    return 0;
}

问题 D: 日期类

#include<cstdio>
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}};
int isLeap(int year){
    return (year%4==0&&year%100!=0)||(year%400==0);
};
int main(){
    int y,m,d,n;
    scanf("%d",&n);
    while(n--){
        scanf("%d %d %d",&y,&m,&d);
        int le=isLeap(y);
        d++;
        int ans=1;
        if(d>month[m][le]){
            d-=month[m][le];
            m++;
        }
        if(m>12){
            y++;
            m-=12;
        }
        printf("%04d-%02d-%02d\n",y,m,d);
    }
    return 0;
}

问题 E: 日期累加

#include<cstdio>
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}};
int isLeap(int year){
    return (year%4==0&&year%100!=0)||(year%400==0);
};
int main(){
    int y,m,d,n,sum;
    scanf("%d",&n);
    while(n--){
        scanf("%d %d %d %d",&y,&m,&d,&sum);
        while(sum--){
            int le=isLeap(y);
            d++;
            if(d>month[m][le]){
                d-=month[m][le];
                m++;
            }
            if(m>12){
                y++;
                m-=12;
            }
        }
        printf("%04d-%02d-%02d\n",y,m,d);
    }
    return 0;
}

🐱‍👤3.5小节——入门模拟->进制转换

地址合集:3.5小节——入门模拟->进制转换

问题 A: 又一版 A+B

#include <stdio.h>
void change(long long sum,int m){
	int stack[32],top = -1;
	if(sum == 0)
		printf("0");
	while(sum){
		stack[++top] = sum % m;
		sum /= m;
	}
	while(top >=0)
		printf("%d",stack[top--]);
	puts("");
}
int main(int argc, const char *argv[]){
	int m;
	while(scanf("%d" ,&m) != EOF && m!=0){
		int a, b;
		scanf("%d %d", &a, &b);
		change((long long)a+b, m);
	}	
	return 0;
}

问题 B: 数制转换

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

char zimu[17] = "0123456789ABCDEF";

long long atoi(char *a, int b){
	long long num = 0;
	for(int i = 0;a[i];++i){
		if(a[i] >= '0' && a[i] <= '9')
			num *= b, num += a[i] - '0';
		else if(a[i] >= 'a' && a[i] <= 'z')
			num *= b, num += a[i] - 'a' + 10;
		else
			num *= b, num += a[i] - 'A' + 10;
	}
	return num;
}
void itoa(long long num , char *a, int c){
	int anum = 0;
	if(num == 0){
		a[anum++] = '0',a[anum++] = '\0';
		return;
	}
	while(num){
		a[anum++] = zimu[num % c];
		num /= c;
	}
	a[anum++] = '\0';
	int len = strlen(a);
	for(int i = 0;i < len/2; ++i){
		char temp = a[i];
		a[i] = a[len - 1 - i];
		a[len - 1 - i] = temp;
	}
}
	
int main(){
	char a[100];
	int b, c;
	while(scanf("%d %s %d",&b, a, &c) != EOF){
		long long num = atoi(a, b);
		itoa(num, a, c);
		printf("%s\n",a);
	}	
	return 0;
}

问题 C: 进制转换

#include <cstdio>
#include <cstring>

int main(){
	char orgin[32], change[120];
	int orgin_len,change_len, k = 2;//k代表进制
	while(scanf("%s", orgin) != EOF){
		orgin_len = strlen(orgin);
		change_len = 0;
		if(orgin_len == 1 && orgin[0] == '0'){
			printf("0\n");
			break;
		}//0的特殊处理
		while(1){
			change[change_len++] = (orgin[orgin_len - 1] - '0' )% k + '0';//取出最低位
			int jinwei = 0;
			for(int i = 0;i < orgin_len;++i){
				int temp  = (jinwei * 10 + orgin[i] - '0') % k;
				orgin[i] = (jinwei * 10+ orgin[i] - '0') / k + '0';
				jinwei = temp;
			}
			int flag = 0;
			for(int i = 0;i < orgin_len;++i)
				if(orgin[i] != '0') flag = 1;
			if(!flag)
				break;
		}
		for(int i = change_len - 1;i >= 0;--i)
			printf("%c",change[i]);
		puts("");
	}
	return 0;
}


问题 D: 八进制

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

int main(){
    int orgin ,conversize;
    char change[20];
    while(scanf("%d",&orgin) != EOF){
        conversize = 0;
        if(orgin == 0) change[conversize++] = '0';
        while(orgin){
            change[conversize++] = orgin % 8 + '0';
            orgin /= 8;
        }
        for(int i = conversize - 1; i >= 0;i--){
            putchar(change[i]);
        }
        puts("");
    }
    return 0;
}


1022 D进制的A+B (20 分)

地址:1022 D进制的A+B (20 分)

#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]);
    puts("");
    return 0;
}

1037 在霍格沃茨找零钱 (20 分)

地址:1037 在霍格沃茨找零钱 (20 分)

#include<cstdio>
const int Galleon = 17 * 29;
const int Sickle = 29;

int main(){
    int a1, a2, a3, b1, b2, b3;
    scanf("%d.%d.%d %d.%d.%d",&a1, &a2, &a3, &b1, &b2, &b3);
    int price = a1 * Galleon + a2 * Sickle + a3;
    int money = b1 * Galleon + b2 * Sickle + b3;
    int change = money - price;
    if(change < 0){
        printf("-");
        change = - change;
    }
    printf("%d.%d.%d\n",change / Galleon, change % Galleon / Sickle, change % Sickle);

    return 0;
}

1019 General Palindromic Number (20 分)

地址:1019 General Palindromic Number (20 分)

#include<cstdio>

int change(int y, int q, int *z){
    int num = 0;
    do{
        z[num++] = y % q;
        y /= q;
    }while(y != 0);
    return num;    
}

bool Judge(int z[], int num){
    for(int i = 0; i < num / 2; ++i)
        if(z[i] != z[num - i - 1])
            return false;
    return true;
}

int main(){
    int K, b;
    while(scanf("%d", &K) != EOF){
        scanf("%d", &b);
        int z[40];
        int num = change(K, b, z);
        Judge(z, num)?puts("Yes"):puts("No");
        for(int i = num - 1; i > 0; --i) printf("%d ",z[i]);
        printf("%d\n",z[0]);
    }
    return 0;
}

1027 Colors in Mars (20 分)

地址:1027 Colors in Mars (20 分)

#include<cstdio>
int how(int a){
    a=(a+1)/2;
    for(int i=0;i<a+2;i++) if((i*i)>a) return i-1;
    return 0;
}
int main(){
    int h;
    char s;
    scanf("%d %c",&h,&s);
        int n=how(h);
        //printf("%d",n);
        for(int i=0;i<n;i++){
            for(int j=0;j<i;j++) printf(" ");
            for(int j=0;j<2*(n-i)-1;j++) printf("%c",s);
            printf("\n");
        }
        for(int i=1;i<n;i++){
            for(int j=0;j<n-i-1;j++) printf(" ");
            for(int j=0;j<2*i+1;j++) printf("%c",s);
            printf("\n");
        }
        printf("%d\n",h-2*n*n+1);
    return 0;
}

1058 A+B in Hogwarts (20 分)

地址:1058 A+B in Hogwarts (20 分)

#include<cstdio>
int main(){
    int Galleon, Sickle, Knut,Galleon1, Sickle1, Knut1;
    scanf("%d.%d.%d",&Galleon, &Sickle, &Knut);
    scanf("%d.%d.%d",&Galleon1, &Sickle1, &Knut1);

    int carry = 0;
    carry = (Knut + Knut1) / 29;
    Knut = (Knut + Knut1) % 29;
    int carry1 = 0;
    carry1 = (Sickle + Sickle1 + carry) / 17;
    Sickle = (Sickle + Sickle1 + carry) % 17;
    Galleon = Galleon + Galleon1 + carry1;

    printf("%d.%d.%d\n",Galleon, Sickle, Knut);

    return 0;

}

🐱‍👤3.6小节——入门模拟->字符串处理

地址合集:3.6小节——入门模拟->字符串处理

问题 A: 字符串连接

#include<cstdio>

int main(){
    char s[2][101];
    int n = 0;
    while(scanf("%s",s[n])!=EOF){
        n++;
        if(n == 2){
            printf("%s%s\n",s[0],s[1]);
            n = 0;
        }
    }
    return 0;
}

问题 B: 首字母大写

#include<cstdio>
int main(){
    int num = 0;
    char ans[90][90];
    while(scanf("%s",ans[num]) != EOF)
        num++;
    for(int i = num -1;i >= 0; --i)
        i == 0 ? printf("%s\n",ans[i]):printf("%s ",ans[i]);
}

问题 C: 字符串的查找删除

#include<cstdio>
#include<cstring>
#include<iostream>

using namespace std;

int main(){
    string a;
    string b;
    cin>>a;
    for(int i = 0; i < a.size(); ++i)
        a[i] = tolower(a[i]);
    getchar();
    while(getline(cin,b)){
        //cout<<a;
        //cout<<b<<endl;
        for(int i = 0; i< b.size();i++){
            if(b[i] == ' ') continue;
            if(b[i] == a[0]||b[i] == toupper(a[0])){
                int j =1;
                i++;
                for(j = 1 ;j< a.size()&&i<b.size();){
                    if(b[i] == a[j]||b[i] == toupper(a[j])){
                        i++;
                        j++;
                    }
                    else    break;
                }
                if(j != a.size()){
                    //cout<<'1'<<endl;
                    i-=j;
                }
                else{
                    i--;
                    continue;
                }
            }
            putchar(b[i]);
        }
        cout<<endl;
    }
    return 0;
}

问题 D: 单词替换

#include<cstdio>
#include<cstring>
#include<iostream>

using namespace std;

int main(){
    string s,a,b;
    while(getline(cin,s)){
        getline(cin,a);
        getline(cin,b);
        for(int i = 0; i < s.size(); ++i){
            //printf("%d %d\n",s.size(),a.size());
            int j =0;
            while(s[i]==a[j]&&j<a.size()&&i<s.size()){
                i++;
                j++;
            }
            if(j==a.size()){
                i--;
                printf("%s",b.c_str());
            }
            else{
                i -=j;
                putchar(s[i]);
            }
        }
        printf("\n");
    }
    
    return 0;
}

问题 E: 字符串去特定字符

#include<cstdio>
#include<cstring>
#include<iostream>

using namespace std;

int main(){
    string s;
    char c;
    while(getline(cin,s)){
        scanf("%c",&c);
        getchar();
        for(int i = 0; i < s.size();i++)
            if(s[i] != c)
                putchar(s[i]);
        printf("\n");
    }
    return 0;
}

问题 F: 数组逆置

#include<cstdio>
#include<iostream>
#include<cstring>

using namespace std;

int main(){
    string s;
    while(getline(cin,s)){
        for(int i =s.size()-1; i >= 0;--i){
            putchar(s[i]);
        }
        printf("\n");
    }
    return 0;
}

问题 G: 比较字符串

#include<cstdio>
#include<cstring>
using namespace std;

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

问题 H: 编排字符串

#include<cstdio>
#include<cstring>
using namespace std;

int main(){
    int m;
    char s[4][21];
    scanf("%d",&m);
    for(int i = 0; i< m ; ++i){
        scanf("%s",s[0]);

        if( i < 3)
            for(int j = 0 ; j <= i ;j++)
                printf("%d=%s ",j+1,s[j]);
        else
            for(int j = 0 ; j <= 3 ;j++)
                printf("%d=%s ",j+1,s[j]);
    
        for(int j = 3; j>= 1; j--)
            strcpy(s[j],s[j-1]);
        printf("\n");

    }
    return 0;
}

问题 I: 【字符串】回文串

#include <cstdio>
#include <cstring>

int main(){
    char s[257];
    while(fgets(s, 257, stdin)){
        int len = s[strlen(s) - 1] == '\n' ? strlen(s) - 1 : strlen(s);
        int flag = 0;
        for(int i = 0;i < len /2 ;++i){
            if(s[i] != s[len - 1 - i]){
                puts("NO");
                flag = 1;
                break;
            }
        }
        if(flag)    continue;
        puts("YES");
    }
    return 0;
}

1006 换个格式输出整数 (15 分)

地址:1006 换个格式输出整数 (15 分)

#include<cstdio>
int main(){
    int num, ans[5], wei = 0;
    scanf("%d",&num);
    //int b = num / 100, s = num % 100 / 10, g = num % 10;
    while(num > 0){
        ans[wei++] = num % 10;
        num /= 10;
    }

    for(int j= wei - 1; j >= 0; j--)
        if(j == 2)
            for(int i = 0; i < ans[j]; ++i) printf("B");
        else if(j == 1)
            for(int i = 0; i < ans[j]; ++i) printf("S");
        else if(j == 0)
            for(int i = 0; i < ans[j]; ++i) printf("%d", i + 1);

    puts("");

    return 0;
}

1021 个位数统计 (15 分)

地址:1021 个位数统计 (15 分)

#include<cstdio>
#include<cstring>
int sum[10] = {0};
int main(){
    char num[1005];
    scanf("%s", num);
    
    for(int i = 0; i < strlen(num); ++i)
        sum[num[i] - '0'] ++ ;

    for(int i = 0; i < 10; ++i)
        if(sum[i])
            printf("%d:%d\n",i,sum[i]);

    
    return 0;
}

1031 查验身份证 (15 分)

地址:1031 查验身份证 (15 分)

#include<cstdio>
char M[11] = {'1','0','X','9','8','7','6','5','4','3','2'};
int quan[17] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
int main(){
    int n;
    bool flag = true;
    while(scanf("%d",&n) != EOF){
        while(n--){
            bool flag1 = true;
            char num[19];
            int sum = 0,i;
            scanf("%s", num);
            for(i = 0; i < 17; ++i)
                if(num[i] <= '9' &&num[i] >= '0')
                    sum += quan[i]*(num[i] - '0');
                else
                    break;
            
            if(M[sum % 11] == num[17] && i == 17){
                continue;
                printf("N");
            }
            
            if(flag){
                printf("%s",num);
                flag1 = false;
            }
            else printf("\n%s",num);
            flag = false;
        }
        if(flag)
            printf("All passed");
    }
    return 0;
}

1002 写出这个数 (20 分)

地址:1002 写出这个数 (20 分)

#include<cstdio>
char shuzibiao[10][5] = {"ling","yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};

int main(){
    char n[101];
    scanf("%s",n);
    int i = 0,sum = 0,num[3];
    while(n[i] != '\0')
        sum += n[i++] - '0';
    //printf("%d",sum);
    
    if(sum == 0){
        printf("ling\n");
        return 0;
    }
    
    i = 0;
    while(sum > 0){
        num[i++] = sum % 10;
        sum /= 10; 
    }

    for(int j = i-1; j > 0; j--){
        printf("%s",shuzibiao[num[j]]);
        if(j)   printf(" ");
    }
    puts("");
    return 0;
}

1009 说反话 (20 分)

地址:1009 说反话 (20 分)

#include<cstdio>
struct Poly{
    int exp;//指数
    double cof;//系数
}Poly[1001];
double ans[2001]={0.0};
int main(){
    int n,m,number=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++) scanf("%d %lf",&Poly[i].exp,&Poly[i].cof);
    scanf("%d",&m);
    for(int i=0;i<m;i++){
        int exp;
        double cof;
        scanf("%d %lf",&exp,&cof);
        for(int j=0;j<n;j++) {
            if(ans[exp+Poly[j].exp]==0.0) number++;
            ans[exp+Poly[j].exp]+=(cof*Poly[j].cof);
            if(ans[exp+Poly[j].exp]==0.0) number--;
        }
    }
    printf("%d",number);
    for(int i=2000;i>=0;--i){
        if(ans[i]!=0.0) printf(" %d %.1f",i,ans[i]);
    }
    printf("\n");
}

1014 福尔摩斯的约会 (20 分)

地址:1014 福尔摩斯的约会 (20 分)

//题目本身不复杂,但是要想的情况数贼多,考察的绝对是读题审题能力!!!!
#include <stdio.h>
#include <string.h>

char Day[][5] = {"","MON","TUE","WED","THU","FRI","SAT","SUN"};

int main(){
    char a1[70], a2[70], b1[80], b2[80];
    while(scanf("%s %s %s %s", a1, a2, b1, b2) != EOF){
        int d = 0, hour = -1, min = -1;
        for(int i = 0;a1[i] && a2[i];++i){
            if(!d && a1[i] == a2[i] && a1[i] >= 'A' && a1[i] <= 'G'){
                d = a1[i] - 'A' + 1;
            }else if(d && a1[i] == a2[i]&& ((a1[i] >= 'A' && a1[i] <= 'N') || (a1[i] >= '0' && a1[i] <= '9'))){
                hour = a1[i] >= 'A' ? a1[i] - 'A' + 10 : a1[i] - '0';
                break;
            }
        }
       for(int i = 0;b1[i] && b2[i];++i)
            if(b1[i] == b2[i] && ((b1[i] >= 'A' && b1[i] <= 'Z') || (b1[i] >= 'a' && b1[i] <= 'z'))  ){
                min = i;
                break;
            }
        printf("%s %02d:%02d", Day[d], hour, min);
    }    
    return 0;
}

1024 科学计数法 (20 分)

地址:1024 科学计数法 (20 分)

#include<cstdio>
int main(){
    char num[10000];
    scanf("%s",num);
    if(num[0] == '-')   printf("-");
    int ewei = 0,e = 0;
    for(int i = 0;num[i] != '\0';++i)
        if(num[i] == 'E'){
            ewei = i;
            break;
        }

    for(int i = ewei + 2;num[i] != '\0';++i)
        e = e * 10 + num[i] - '0';
    if(e == 0){
        for(int i = 1; i < ewei; ++i)  printf("%c",num[i]);
    }
    else{
        if(num[ewei + 1] == '-'){
            printf("0.");
            for(int i = 0;i < e - 1; i++)   printf("0");
            putchar(num[1]);
            for(int i = 3; i < ewei; ++i)  printf("%c",num[i]);
        }
        else{
            for(int i = 1;i < ewei; ++i){
                if(num[i] == '.') continue;
                else    printf("%c",num[i]);
                if(i == e + 2 && ewei - 3 != e) printf(".");
            }
            for(int i = 0; i < e - ewei + 3; ++i)   printf("0");
            
        }
    }
    puts("");
    return 0;
}

1048 数字加密 (20 分)

地址:1048 数字加密 (20 分)

#include<cstdio>
#include<cstring>

char s[14] = {"0123456789JQK"};

void reverse(char A[]){
    int len = strlen(A);
    for(int i  = 0; i < len / 2; ++i){
        char temp = A[i];
        A[i] = A [len - 1 -i];
        A[len - 1 - i] = temp;
    }
}

int main(){
    char A[110],B[110],C[110]={0};
    scanf("%s %s", A, B);
    reverse(A);
    reverse(B);
    int lena = strlen(A), lenb = strlen(B), len = lena > lenb ? lena : lenb;
    //两串补充到同长度
    if(lena > lenb){
        for( int i = lenb; i < lena; ++i)
            B[i] = '0';
        B[lena] = 0;
    }
    else{
        for(int i = lena; i < lenb;++i)
            A[i] = '0';
        A[lenb] = 0;
    }

    for(int i = 0; i < len; i++){
        if(i % 2 == 0)
            C[i] = s[(A[i] + B[i] - '0' - '0')%13];
        else
            C[i] = B[i] >= A[i] ? (B[i] -  A[i] + '0'): (B[i] - A[i] +'9' + 1);
    }
    reverse(C);
    puts(C);
    
    return 0;
}

1001 A+B Format (20 分)

地址:1001 A+B Format (20 分)

#include<cstdio>
#include<cstring>
int num[10];

int main(){
	int a, b, sum;

	scanf("%d %d",&a, &b);
	sum = a + b;
	//printf("%d",sum);	
	if(sum < 0){
		putchar('-');
		sum = -sum;
	}	

	int len = 0;
	if(!sum) num[len ++] = 0;

	while(sum){
		num[len ++] = sum % 10;
		sum /= 10;
	}

	for(int i = len -1; i >= 0; --i){
		printf("%d",num[i]);
		if(i > 0 && i % 3  == 0) putchar(',');

	}
    puts("");

	return 0;
}

1005 Spell It Right (20 分)

地址:1005 Spell It Right (20 分)

#include<cstdio>
#include<cstring>
#include<iostream>
        
using namespace std;

char name[10][10] = {"zero","one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

int main(){
	int sum = 0;
	char num[102] = {0};
	int sumwei[3];
	scanf("%s", num);
	for(int i = 0; i < strlen(num); ++i)
		sum += num[i] - '0';
	//printf("%d",sum);
	if(!sum) puts(name[0]);
	else{
		int i;
		for(i = 0; i < 3 && sum ; i++){
			sumwei[i] = sum % 10;
			sum /= 10;
		}
		for(--i;i>0; --i)
			printf("%s ",name[sumwei[i]]);
		printf("%s\n", name[sumwei[0]]);

	}


	return 0;
}


1035 Password (20 分)

地址:1035 Password (20 分)

#include<cstdio>
#include<cstring>

using namespace std;

struct student{
	char name[12];
	char pswd[12];
};

int main(){
	int N;
	while(scanf("%d",&N) != EOF){
		struct student	stu[N];
		bool flag[N];
		int M = 0;
		for(int i = 0; i < N; ++i){
			flag[i] = true;
			scanf("%s %s", stu[i].name, stu[i].pswd);
			for(int j = 0; j < strlen(stu[i].pswd); ++j){
				if(stu[i].pswd[j] == '1'){
					stu[i].pswd[j] = '@';
					flag[i] = false;
				}
				else if(stu[i].pswd[j] == '0'){
					stu[i].pswd[j] = '%';
					flag[i] = false;
				}
				else if(stu[i].pswd[j] == 'l'){
					stu[i].pswd[j] = 'L';
					flag[i] = false;
				}
				else if(stu[i].pswd[j] == 'O'){
					stu[i].pswd[j] = 'o';
					flag[i] = false;
				}
			}
			if(flag[i])	M++;
		}
		if(M == N) 
			if(N != 1)
				printf("There are %d accounts and no account is modified", N);
			else printf("There is %d account and no account is modified", N);
		else{
			printf("%d\n",N - M);
			for(int i = 0; i < N; i++)
				if(!flag[i])
					printf("%s %s\n", stu[i].name,stu[i].pswd);
		}
	}
	return 0;
}

1077 Kuchiguse (20 分)

地址:1077 Kuchiguse (20 分)

#include<cstdio>
#include<cstring>
#include<iostream>

using namespace std;

void reverse(char* s){
	int len = strlen(s);
	for(int i = 0; i < len / 2; ++i){
		char temp = s[i];
		s[i] = s[len - 1 -i];
		s[len - 1 - i] = temp;
	}
}

int main(int argc, char * argv[]){
	int N;
	while(scanf("%d", &N) != EOF){
		getchar();
		char s[N][230];
		int min = 230;
		for(int i = 0; i < N; ++i){
			cin.getline(s[i], 230);
			reverse(s[i]);
			if(strlen(s[i]) < min)	min = strlen(s[i]);
		}
		int i = 0;
		for(i = 0; i < min; ++i){
			int j = 0;
			for(j = 1; j < N; ++j)
				if(s[j][i] != s[0][i])	break;
			if(j != N )	break;	
		}
		if(i == 0)
			printf("nai\n");
		else{
			for(int j = i - 1; j >= 0 ;--j)
				putchar(s[0][j]);
			puts("");
		}
	}
	return 0;
}

1082 Read Number in Chinese (25 分)

地址:1082 Read Number in Chinese (25 分)

#include<cstdio>
#include<cstring>

char danwei[][10] = {"Shi", "Bai", "Qian", "Wan", "Yi"};
char wei[10][10] = {"ling","yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};

int main(int argc, char * argv[]){
	char s[11];
	while(scanf("%s", s) != EOF){
		int i = 0;
		if(s[0] == '-')	{
			printf("Fu ");
			++i;
		}
		int len = strlen(s);
		bool flag = false;
		if(i+1 == len){
			printf("%s\n",wei[s[i] - '0']);
			continue;
		}
		while(s[i] == '0' && i < len -1) i++;
		printf("%s", wei[s[i] - '0']);
		if(len - i ==9) printf(" Yi");
		else if((len - i) % 4 != 1){
			int danwei1 = len - i;
			if (danwei1 > 4) danwei1 -= 4;	
			printf(" %s", danwei[danwei1 - 2]);
		}
		if(len - i == 5)	printf(" Wan");	
		++i;
		for( ; i <len; ++i){
			if(s[i] > '0'){
				if(flag){
					printf(" ling");
					flag = false;
				}
				printf(" %s", wei[s[i] - '0']);
				if(len - i ==9) printf(" Yi");
				else if((len - i) % 4 != 1){
					int danwei1 = len - i;
					if (danwei1 > 4) danwei1 -= 4;	
					printf(" %s", danwei[danwei1 - 2]);
				}
			}
			else{
				flag = true;
			}
			if(len - i == 5) printf(" Wan");
		}
		puts("");
	}
	return 0;
}
  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XingleiGao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值