zoukankan      html  css  js  c++  java
  • PAT第三章速刷

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

    #include<stdio.h>
    int main()
    {
        int n,countnum=0;
        scanf("%d",&n);
        while(n!=1)
        {
            if(n%2==0)
            {
                n=n/2;
            }
            else
            {
                n=(3*n+1)/2;
            }
            countnum++;
        }
        printf("%d",countnum);
        return 0;
    }
    View Code

     PAT B1032 挖掘机技术哪家强

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    using namespace std;
    int main()
    {
        int n;
        int a,b,maxnum=0;
        int score[100005];
        scanf("%d",&n);
        memset(score,0,sizeof(score));
        for(int i=1;i<=n;i++)
        {
            scanf("%d %d",&a,&b);
            score[a]+=b;
            if(score[a]>score[maxnum])
                maxnum=a;
        }
        printf("%d %d",maxnum,score[maxnum]);
        return 0;
    }
    View Code

     PAT B1036 跟奥巴马一起编程

    注意行数是(num+1)/2

    #include<stdio.h>
    using namespace std;
    int main()
    {
        int num;
        char c;
        scanf("%d %c",&num,&c);
        for(int i=1;i<=(num+1)/2;i++)
        {
            if(i==1||i==(num+1)/2)
            {
                for(int j=1;j<=num;j++)
                    printf("%c",c);
                if(i==1)
                    printf("
    ");
            }
            else
            {
                printf("%c",c);
                for(int j=2;j<num;j++)
                    printf(" ");
                printf("%c
    ",c);
            }
        }
        return 0;
    }
    View Code

     codeup 1928日期差值(非PAT 比较有锻炼意义的模拟)

    这个先按年调整再一个一个加(截至到year2-year1<=1),注意不是在等于12或者当月日期的时候%,是大于,不然会出现0

    按照年加的时候,如果3月以后看下一年是否闰,如果2.28及之前看本年,如果正好2.29,就是365,另外调整day为28。

    另外这个逢400又闰注意

    最后的叠加不要再用月算了,更麻烦!(不仅要考虑每个月,还要考虑20200501和20210103这种跨的,直接大小于号也不好比浪费时间)直接一个一个加就可以

    还有就是codeup是多输入在一起的。

    这种稍微复杂一点的模拟都不能一次过,需要加强

    #include<stdio.h>
    int pd[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};//0对应平年
    int run(int year)
    {
        if((year%4==0 && year%100!=0)||year%400==0)
            return 1;
        return 0;
    }
    int main()
    {
        int year1,year2,month1,month2,day1,day2;
        int num1,num2;
        while(scanf("%d%d",&num1,&num2)!=EOF)
    {
    
     if(num1>num2)
        {
            int temp=num2;
            num2=num1;
            num1=temp;
        }
        day1=num1%100;
        num1=num1/100;
        month1=num1%100;
        num1=num1/100;
        year1=num1;
        day2=num2%100;
        num2=num2/100;
        month2=num2%100;
        num2=num2/100;
        year2=num2;
        int ansday=1;
        while(year2-year1>1)
        {
            if(month1==2 && day1==29)
            {
                day1=28;
                year1++;
                ansday+=365;
            }
            else if(month1>3)
            {
                year1++;
                ansday+=365+run(year1);
            }
            else
            {
                ansday+=365+run(year1);
                year1++;
            }
        }
        while(day1!=day2 ||month1!=month2 || year1!=year2)
        {
            ansday++;
            day1++;
            if(day1>pd[run(year1)][month1])
            {
                day1=day1%pd[run(year1)][month1];
                month1++;
                if(month1==13)
                {
                    year1++;
                    month1=1;
                }
            }
            //printf("%d %d %d
    ",year1,month1,day1);
        }
        printf("%d
    ",ansday);
    }
        return 0;
    }
    View Code

     PAT B1022 D进制的A+B

    注意为0的情况,要么使用do while保证即使是0也执行,要么特判0(注意不能用c判断,因为经过while处理的c一定是0).

    P进制转10进制,每次取(x%10)最后一位*当前p加上现有num,之后p=p*P x=x/10。(INIT p=1,num=0)

    10进制转p进制,每次%p作为结果存进去,最后倒序输出。注意为0的情况。

    #include<stdio.h>
    #include<string.h>
    int main()
    {
        int a,b,d;
        scanf("%d %d %d",&a,&b,&d);
        int c=a+b;
        int num[100];
        int count=0;
        memset(num,0,sizeof(num));
        while(c)
        {
            num[count++]=c%d;
            c=c/d;
        }
        if(a+b==0)
            count=1;
        for(int i=count-1;i>=0;i--)
            printf("%d",num[i]);
        return 0;
    }
    View Code

     PAT B1009 说反话

    可以利用%s不读空格,使用EOF来分割,注意,%s遇到的第一个让他停止的空格会被下次%s忽略,但如果用getchar也能读。

    这种只能用于PAT这类一次一个输入数据的。

    注意!目前gets在评测机里面会出现CE,不要再使用。正常如果多输入可以一直读取然后用回车啥的判断。结果一样。暂时不写了。

    单独读取字符然后用EOF判断也是可以的。(这道题因为换行的原因出现了格式错误,暂时无法纠正)

    #include<stdio.h>
    #include<string.h>
    int main()
    {
        char str[100][100];
        int i=0;
        while(scanf("%s",str[i])!=EOF)
        {
            i++;
        }
        i=i-1;
        for(i;i>0;i--)
        {
            printf("%s ",str[i]);
        }
        printf("%s",str[0]);
        return 0;
    }
    View Code
    时间才能证明一切,选好了就尽力去做吧!
  • 相关阅读:
    Android Studio 快捷键
    维基百科地址(应该是吧)
    Freeswitch常見問題解決辦法
    配置SIP网关拨打外部电话
    Freeswitch连接SIP软电话
    CentOS6.5安装freeswitch以及啟動
    hdu 4292: Food(Dinic + 链式前向星)
    hdu 2709:Sumsets(递推)
    hdu 2577:How to Type(动态规划)
    hdu 2955:Robberies(01背包)
  • 原文地址:https://www.cnblogs.com/tingxilin/p/13139787.html
Copyright © 2011-2022 走看看