【HBU2021寒假训练营】2021天梯赛训练笔记-2

这篇博客包含一系列C/C++编程练习,涉及计算指数、整数段和、比较大小、阶乘求和、N个数求和、字符串操作、悄悄关注、点赞狂魔、分而治之、名人堂与代金券以及特立独行的幸福问题。通过这些练习,展示了C/C++在解决数学和逻辑问题上的应用。
摘要由CSDN通过智能技术生成

7-1 计算指数

#include<stdio.h>
#include<math.h>
int main()
{
    int n;
    scanf("%d",&n);
    printf("2^%d = %.0lf",n,pow(2,n));
}

7-2 求整数段和

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a,b,l=0;
    cin >> a >> b ;
    for(int i=a;i<=b;i++)
    {
        cout <<setw(5)<<right<<i;
        l++;
        if(l==5)
        {
            cout << endl;
            l=0;
        }
    }
    if(l!=0)
    cout << endl;
    cout << "Sum = "<< (a+b)*(b-a+1)/2 << endl;
}

7-3 比较大小

#include<bits/stdc++.h>
using namespace std;
void change (int* a,int* b)
{
   int p;
   p=*a;
   *a=*b;
   *b=p;
}
int main()
{
    int a,b,c;
    int p;
    cin >> a >> b >> c ;
    if(a>b) 
    {
        change(&a,&b);
        if(b>c) change(&b,&c);
        if(a>b) change(&a,&b);
    }
    else if(b>c) 
    {
        change(&b,&c);
        if(a>b) change(&a,&b);
    }
    cout << a << "->" << b << "->" << c <<endl; 
}

7-4 计算阶乘和

#include<bits/stdc++.h>
using namespace std;

int Fact(int n)
{
    int i;
    int sum=1;
    for(i=2;i<=n;i++) sum*=i;
    return sum;
}

int main()
{
    int N,i;
    int sum=0;
    cin >> N ;
    for(i=1;i<=N;i++) sum+=Fact(i);
    cout << sum << endl;
    return 0;
}

7-5 N个数求和

#include<bits/stdc++.h>
using namespace std;
int hcf(int m,int n)
{
    while(n!=0)
    {
        int r = m%n;
        m=n;
        n=r;
    }
    return m;
}
int main()
{
    int N,i;
    int a,b,sumfz,sumfm,divisor,lcm;
    scanf("%d %d/%d",&N,&sumfz,&sumfm);
    divisor=hcf(abs(sumfz),abs(sumfm));
    if(divisor) {sumfz/=divisor; sumfm/=divisor;}
    for(i=1;i<N;i++)
    {
        scanf("%d/%d",&a,&b);
        lcm=sumfm*b/hcf(sumfm,b);
        sumfz=sumfz*lcm/sumfm+a*lcm/b;
        sumfm=lcm;
        divisor=hcf(abs(sumfz),abs(sumfm));
        if(divisor)
        {
            sumfz/=divisor;
            sumfm/=divisor;
        }
    }
    if (sumfz&&sumfz/sumfm== 0) printf("%d/%d\n",sumfz,sumfm);
	else if (sumfz%sumfm == 0) printf("%d\n",sumfz/sumfm);
	else printf("%d %d/%d\n",sumfz/sumfm,sumfz%sumfm,sumfm);
    return 0;
}

7-6 A-B

#include<stdio.h>
#include<string.h>
int main()
{
    int i,j,k;
    char A[10001];
    char B[10001];
    gets(A);
    gets(B);
    for(i=0;A[i]!='\0';i++)
    {
        for(j=0;B[j]!='\0';j++)
        {
            if(A[i]==B[j])
            {
                for(k=i;A[k]!='\0';k++)
                {
                    A[k]=A[k+1];
                }
                i--;
            }
        }
    }
    puts(A);
    return 0;
}

7-7 悄悄关注

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct{
    char name[5];
    int  great;
}Stu;
int cmp(const void* a,const void* b)
{
    return strcmp((char *)a,(char *)b);
}//按字典顺序排序字符串
int Bsearch(char x[][5],int low,int high,char key[]){
	int mid;
	while(low<=high){
		mid=(low+high)/2;
		if(strcmp(x[mid],key)==0)	
			return mid;
		else if(strcmp(x[mid],key)>0)
			high=mid-1;	
		else
			low=mid+1;
	}
	return -1;	
}//二分查找查看是否在关注列表
int main()
{
    int N,M,aver=0;
    int i,j,k;
    scanf("%d",&N);
    char Follow[N][5];
    for(i=0;i<N;i++) scanf("%s",Follow[i]);
    qsort(Follow,N,sizeof(Follow[0]),cmp);
    scanf("%d",&M);
    Stu is[M];
    for(i=0;i<M;i++) 
    {
        scanf("%s %d",&is[i].name,&is[i].great);
        aver+=is[i].great;
    }
    qsort(is,M,sizeof(is[0]),cmp);
    aver/=M;
    int flag=0;
    for(i=0;i<M;i++)
    {
        if(is[i].great>aver)//如果大于点赞平均数
        {
            if(Bsearch(Follow,0,N,is[i].name)==-1)//如果不在关注列表
            {
                flag=1;
                printf("%s\n",is[i].name);
            }
        }
    }
    if(flag==0) printf("Bing Mei You");
}

7-8 点赞狂魔

#include<stdio.h>
#include<stdlib.h>
typedef struct{
    char name[9];//用户名
    int aver;//标签平均出现次数
    int picksum;//标签不重复的点赞数
}User;
int ifin(int x[],int n,int flag);//判断x中是否有n,flag为当前x中被计入的标签数
void sort(User x[],int n);//这道题用冒泡也不会超时
int main()
{
    int N,K;
    scanf("%d",&N);
    User blog[N];
    int i,j,k;
    int flag,p;
    int*x;
    for(i=0;i<N;i++)
    {
        scanf("%s %d",&blog[i].name,&K);
        x=(int*)malloc(sizeof(int)*K);
        blog[i].aver=K;
        flag=0;
        for(j=0;j<K;j++)
        {
            scanf("%d",&p);
            if(ifin(x,p,flag)) 
            {
                x[flag]=p;
                flag++;
            }
        }
        blog[i].picksum=flag;
        x+flag==NULL;
        free(x);
    }
    sort(blog,N);
    printf("%s",blog[0].name);
    if(N<3) //点赞狂魔不超过三人的情况
    {
        for(i=1;i<N;i++) printf(" %s",blog[i].name);
        for(i=N;i<3;i++) printf(" -");
    }
    else for(i=1;i<3;i++) printf(" %s",blog[i].name);
    printf("\n");
    return 0;
}
int ifin(int x[],int n,int flag)
{
    int i;
    for(i=0;i<flag;i++)
    {
        if(x[i]==n) return 0;
    }
    return 1;
}
void sort(User x[],int n)
{
    User p;
    int i,j,swap;
    for(i=0;i<n-1;i++)
    {
        swap=0;
        for(j=0;j<n-1-i;j++)
        {
            if(x[j].picksum<x[j+1].picksum||(x[j].picksum==x[j+1].picksum&&(x[j].aver>x[j+1].aver)))
            //按题目要求排序
            {
                p=x[j];
                x[j]=x[j+1];
                x[j+1]=p;
                swap=1;
            }
        }
        if(swap==0) return ;
    }   
}

7-9 分而治之

#include<stdio.h>
#include<stdlib.h>
typedef struct{
    int start;
    int end;
}edge;
int main()
{
    int N,M,K,Np,v;
    int i,j,k;
    int*map;//记录攻略方案
    scanf("%d %d",&N,&M);
    edge e1[M];
    for(i=0;i<M;i++) scanf("%d %d",&e1[i].start,&e1[i].end); 
    scanf("%d",&K);
    for(i=0;i<K;i++)
    {
        scanf("%d",&Np);
        map=(int*)malloc(sizeof(int)*(N+1));
        for(j=0;j<=N;j++) map[j]=0;
        for(j=0;j<Np;j++) 
        {
            scanf("%d",&v);
            map[v]=1;
        }
        for(j=0;j<M;j++)//当所有路径的起点或终点都被攻下时(在map中的值为1),剩下的城市孤立无援
        {
            if(map[e1[j].start]!=1&&map[e1[j].end]!=1)//任一一条路不满足条件,即方案不可行
            {
                printf("NO\n");
                break;
            }
        }
        if(j==M) printf("YES\n");
        free(map);
    }
}

7-10 名人堂与代金券

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct{
    char name[20];
    int score;
}Stu;
int cmp(const void *a,const void *b){
    Stu *c=(Stu *)a;
    Stu *d=(Stu *)b;
    if(c->score!=d->score) return d->score-c->score;//成绩非升序排列
    else return strcmp(c->name,d->name);//用户名字典排序
}//结构体Stu的二级排序

int main()
{
    int N,G,K;
    int i,j,k;
    int sum=0;
    scanf("%d %d %d",&N,&G,&K);
    Stu s1[N];
    for(i=0;i<N;i++) 
    {
        scanf("%s %d",&s1[i].name,&s1[i].score);
        if(s1[i].score>=G) sum+=50;
        else if(s1[i].score>=60) sum+=20;
    }
    qsort(s1,N,sizeof(s1[0]),cmp);
    printf("%d\n",sum);
    int flag=0,No=1;
    i=0;
    while(No<=K)
    {
        printf("%d %s %d\n",No,s1[i].name,s1[i].score);
        if(s1[i].score==s1[i+1].score)//如果i的成绩与i+1相同,No不变,继续输出
        {
            flag++;//记录并列人数
        }
        else //当i的成绩与i+1不同时,No+1+上一名次并列人数
        {
            No++;
            No+=flag;
            flag=0;
        }
        i++}
    return 0;
}

7-11 特立独行的幸福

#include<stdio.h>
#include<stdlib.h>
int n1[10001],n2[10001];
int isprime(int a)
{
    int i;
    for(i=2;i<a;i++)
    if(a%i==0) return 0;
    return 1;
}//是否素数
int ishappy(int i,int n)
{
    int sum=0;
    while(n){
        sum+=(n%10)*(n%10);
        n/=10;
    }
    if (n2[sum]==1) return 0;//当sum在之前的迭代出现过的时候,陷入循环,不是幸福数,退出
    n1[sum]=1;//将依附于该数的sum在n1中置1,以证明非特立独行
    n2[sum]=1;//将依附于该数的sum在n2中置1,以证明出现过出现过一次
    if(sum==1) return i;
    else return ishappy(i+1,sum); 
}//判断是否幸福数并返回依附于n的幸福数的个数i
void clear_zero(int arr[],int n){
    int i;
    for(i=0;i<n;i++) arr[i]=0;
}//数组置零
int main()
{
    int A,B;
    scanf("%d %d",&A,&B);
    int h[B+1];
    for(int i=A;i<=B;i++)
    {
        clear_zero(n2,10001);
        h[i]=ishappy(1,i);
    }
    int flag=0;
    for(int i=A;i<=B;i++)
    {
        if(h[i]&&n1[i]==0)
        {
            if(isprime(i)) printf("%d %d\n",i,h[i]*2);
            else printf("%d %d\n",i,h[i]);
            flag=1;
        }
    }
    if(flag==0) printf("SAD");
    return 0;
}

总结、

这几天看了看c++,前几道题就用c++写了,之后的题还是习惯于c语言,就用c写了。
也看了看大佬写的c++的版本,有很多的很方便函数,算是能明白为啥考试的时候学过c++的同学总是能写的这么快了。
这几天有点懈怠,得加紧学习(内卷)了。
最后说一句,qsort真好用!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值