暑期训练赛三总结(上午写的栈、队列没有保存,不见了QQ)

首先B题

#include<stdio.h>
#include<math.h>
#include<string.h>
#define maxn 100000
char a[100],b[100];
int main()
{
    int i,j;
    int s1,s2,s;
    while(~scanf("%s%s",a,b))
    {
        s1=0;
        s2=0;
        s=0;
       for(i=0;a[i]!='\0';i++)
       {
           s1+=a[i]-48;//ASII码,‘0’,把字母转换为数字
       }
       for(j=0;b[j]!='\0';j++)
       {
           s2+=b[j]-48;
        
       }
        s=s1+s2;
        printf("%d\n",s);
    }
    return 0;
}题意一开始把我绕进去了,其实就是求各位数之和

2、D题

#include<stdio.h>
#include<math.h>
int main()
{
    int t;
    int a,b,c,i;
    scanf("%d",&t);
    int s;
    while(t--)
    {
        s=0;
        scanf("%d%d%d",&a,&b,&c);
        if(b==0)
            printf("0\n");//wa是因为忽略了b可以是0的条件
        else
        {
        for(i=1;;i++)
        {
            if(i*a>b*c)
            {
                printf("%d\n",i);
                break;
            }

        }
        }
    }
    return 0;
}
3、#include<stdio.h>
#include<math.h>
int main()
{
    int t;
    int a,b;
    scanf("%d",&t);
    int s;
    while(t--)
    {
        s=0;
        scanf("%d%d",&a,&b);
        s=fabs(a)+fabs(b);
        printf("%d\n",s);
    }
    return 0;
}//很简单,一次过,直接用绝对值fabs

4、还有20进制转化的问题

首先是要把两个数反转(20进制转化为十进制进行后面的加法-‘0’)

再依次相加各位数,从个位开始,如果有进位,就直接进位加到后一位上自己-20

这里有一个flag问题,若==0的话,就flag--

max+2

相加和

#include<bits/stdc++.h>
using namespace std;
int main()
{
    char a[10000],b[10000];
    int aa[10000],bb[10000],cc[10000];
    while(~scanf("%s%s",a,b))
    {
        memset(aa,0,sizeof(aa));
        memset(bb,0,sizeof(bb));
        memset(cc,0,sizeof(bb));
        int len1=strlen(a),len2=strlen(b);
        for(int i=len1-1;i>=0;i--)
        {
            if(a[i]>='0'&&a[i]<='9')aa[len1-1-i]=a[i]-'0';
            else if(a[i]>='a'&&a[i]<='j')aa[len1-1-i]=a[i]-'a'+10;
        }
        for(int i=len2-1;i>=0;i--)
        {
            if(b[i]>='0'&&b[i]<='9')bb[len2-1-i]=b[i]-'0';
            else if(b[i]>='a'&&b[i]<='j')bb[len2-1-i]=b[i]-'a'+10;
        }
        int len=max(len1,len2);
        for(int i=0;i<len;i++)
        {
            cc[i]+=aa[i]+bb[i];
            if(cc[i]>=20)
            {
                cc[i]-=20;
                cc[i+1]++;
            }
        }
        int flag=len+2;
        while(cc[flag]==0&&flag>=0)flag--;
        if(flag<0)cout<<"0\n";
        else{
            for(int i=flag;i>=0;i--)
            {
                if(cc[i]<=9)cout<<cc[i];
                else printf("%c",cc[i]-10+'a');
            }
            cout<<endl;
        }    
    }
    return 0;
}
 

5、J题,一开始也没有正确理解题意

#include<stdio.h>
//using namespace std;
 
int pd(int x,int y)
{
    return y==0?x:pd(y,x%y);//求得是最大公约数,这个需要记住
}
int main()
{
    int a,b;
    while(~scanf("%d%d",&a,&b))
    {
        int t=0;
        if(a==b){printf("0\n");continue;}//要记住不是break,如果是break,直接跳出循环,不能再输入了
        int c=pd(a,b);
        
        a/=c;b/=c;//这样就求出最大的
   
        if(a%2==0)
        {
            while(a%2==0)
            {
                a/=2;t++;
                
                if(a%2)break;
            }
        }
        if(a%3==0)
        {
            while(a%3==0)
            {
                a/=3;t++;
            
                if(a%3)break;
            }
        }
        if(b%2==0)
        {
            while(b%2==0)
            {
                b/=2;t++;
            
               if(b%2)break;
            }
        }
        if(b%3==0)
        {
            while(b%3==0)
            {
                b/=3;t++;
            
               if(b%3)break;//四种情况
            }
        }
 
        if(a==b)printf("%d\n",t);
        else printf("-1\n");
 
    }
    return 0;
}
 

猜你喜欢

转载自blog.csdn.net/qq_42232118/article/details/81146547