题目
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;
}