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;
}
原文地址:https://www.cnblogs.com/trirabbits/p/10060206.html