• 12.2训练心得


    题目

    Stat Origin Title Problem Title
    Solved A HDU 1161 Eddy's mistakes
    Solved B HDU 1406 完数
    Solved C HDU 1097 A hard puzzle
    Solved D HDU 1001 Sum Problem
    Solved E HDU 1019 Least Common Multiple
    Solved F HDU 1108 最小公倍数
    Solved G HDU 1008 Elevator

    A题

    ​ 没什么难度了,用的ctype里面的tolower函数遍历一遍就解决了

    AC代码:

    #include<stdio.h>
    #include<string.h>
    #include<ctype.h>
    
    int main()
    {
        char a[1000+100];
        int i;
    
        while(gets(a) != NULL)
        {
            for( i = 0; i < strlen(a); i++)
            {
                if( a[i] >= 'A' && a[i] <= 'Z')
                    a[i] = tolower(a[i]);
            }
            puts(a);
        }
        return 0;
    }
    

    B题

    ​ 其实也没什么难度,为了减少时间复杂度,用了math的sqrt函数,然后再取模判断就ok了,有一个小坑点,就是输入的M,N没有固定大小顺序,也许先输入的比后输入的大。

    AC代码:

    #include<stdio.h>
    #include<math.h>
    
    int main()
    {
        int t;
        int m, n;
        int i, j;
        int temp;
    
        scanf("%d", &t);
        while(t--)
        {
            scanf("%d%d", &m, &n);
            if( m > n)
            {
                temp = m;
                m = n;
                n = temp;
            }
            int count = 0;
            for( i = m; i <= n; i++)
            {
                int sum = 1;
                for( j = 2; j <= sqrt(i); j++)
                {
                    if( i % j == 0)
                    {
                        sum += j + i/j;
                        if( j == i/j)
                            sum -= i/j;
                    }
                }
                if( sum == i)
                    count++;
            }
            printf("%d\n", count);
        }
        return 0;
    }
    

    C题

    ​ 这道题其实不想让我这个菜鸡过的,但是这道题有个巧妙方法完美避开了使用快速幂算法(快速幂解法:菜鸟初尝快速幂),那就是万能无敌的找规律。

    ​ 我们这样做,先把2进行各种次方

    2		2^1		|	32		2^5		|	512		2^9
    4		2^2		|	64		2^6		|	1024	2^10
    8		2^3		|	128		2^7		|	2048	2^11
    16		2^4		|	256		2^8		|	4096	2^12
    

    ​ 会神奇的发现,21与25与2^9最后一位都是2.依次类推‘3’也会发现相同律。10以上的就不用推了,显而易见,12的平方也也有如此规律,而且尾数和2的也巧妙的相同,这个规律应该是有某位著名数学家发现了,有知道的朋友,评论区给我补一下知识。

    AC代码:

    #include<stdio.h>
    #include<math.h>
    
    int main()
    {
        int x, y;
        int sum;
    
        while(~scanf("%d%d", &x,&y))
        {
            x %= 10;
            y %= 4;
            if( y%4 == 0)
                y = 4;
            sum = pow(x,y);
            printf("%d\n", sum%10);
        }
        return 0;
    }
    

    PS:以后学了快速幂算法回来补上这一题。已补:菜鸟初尝快速幂

    D题

    ​ 额,这个题不知道怎么说,高斯公式很巧妙,不会高斯的话直接暴力枚举。这个题有个小坑点,因为是英文题,所以很容易忽视,就是格式问题。

    AC代码:

    #include<stdio.h>
    
    int main()
    {
        int n;
        int i;
    
        while(~scanf("%d", &n))
        {
            int sum = 0;
            for( i = n; i > 0; i--)
                sum += i;
            printf("%d\n\n", sum);
        }
        return 0;
    }
    

    E题

    ​ 多个数求最小公倍数,我用的欧几里得的方法求得gcd然后在算的lcm。这道题有坑点“All integers will be positive and lie within the range of a 32-bit integer.”本来问题不大,但是算最小公倍数的时候,两个一乘就超出int了。所以用long long。

    AC代码:

    #include<stdio.h>
    
    int main()
    {
        long long a, b;
        long long m, n;
        long long t, s;
        long long i;
    
        scanf("%lld", &t);
        while( t--)
        {
            scanf("%lld", &s);
            scanf("%lld", &a);
            for( i = 1; i < s; i++)
            {
                scanf("%lld", &b);
                int x;
                m = a;
                n = b;
                while(b)
                {
                    x = a%b;
                    a = b;
                    b = x;
                }
                a = m*n/a;
            }
            printf("%lld\n", a);
        }
        return 0;
    }
    

    F题

    最小公倍数,没啥讲的,用欧几里德法算gcd,再求lcm。

    AC代码:

    #include<stdio.h>
    
    int main()
    {
        int a, b;
        int m, n;
        int t;
    
        while(~scanf("%d%d", &a, &b))
        {
            m = a;
            n = b;
            while(b)
            {
                t = a%b;
                a = b;
                b = t;
            }
            printf("%d\n", m*n/a);
        }
        return 0;
    }
    

    G题

    ​ 题目看起来很高大上其实就是算时间,上升需要6,下降4秒,在需要停留的楼层停留5秒,从第0层开始上升,结束后不需要回到底层。

    AC代码:

    #include<stdio.h>
    
    int main()
    {
        int n;
        int floor[100];
        int i;
    
        while(~scanf("%d", &n) && n)
        {
            int sum = 0;
            int a = 0;
            for( i = 0; i < n; i++)
                scanf("%d", &floor[i]);
            for( i = 0; i < n; i++)
            {
                if( floor[i] > a)
                    sum += (floor[i]-a)*6 + 5;
                else
                    sum += (a-floor[i])*4 + 5;
                a = floor[i];
            }
            printf("%d\n", sum);
        }
        return 0;
    }
    
  • 相关阅读:
    input 只能输入数字
    “学生宿舍管理系统”主要内容及特点
    web_03Java ee实现定时跳转,使用C3P0,DBUtils类重构数据库操作
    DBUtils工具类的使用
    C3P0连接池
    java ee 中 Jsp 页面的定时的跳转(数字倒数)
    JSP中实现网页访问统计的方法【转】
    Java web验证码
    web_02Java ee实现验证码,网站访问次数功能
    web_01Java ee实现登陆注册功能
  • 原文地址:https://www.cnblogs.com/trirabbits/p/10060206.html
Copyright © 2020-2023  润新知