12.2训练心得
題目
| 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? 會神奇的發現,2^1與2^5與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;elsesum += (a-floor[i])*4 + 5;a = floor[i];}printf("%d\n", sum);}return 0; }轉載于:https://www.cnblogs.com/trirabbits/p/10060206.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
- 上一篇: mysql node
- 下一篇: Leetcode264. Ugly Nu