2017年9月25日 星期一

[UVa]10783 - Odd Sum(C++)

這題如果單純只使用迴圈累加會超過limit time,所以可以使用等差級數

先使用公式1找出項數n,再把n帶入公式2,算出等差級數。

  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. int main() {  
  5.     int fir, end, n, a, b, N, S;  
  6.       //首項, 末項, 測資數量, a~b, 項數, 等差級數
  7.     cin >> n;  
  8.     for(int i = 0;i < n ;i++)  
  9.     {  
  10.         cin >> a >> b;  
  11.         if(a%2==0)   //如果首項是偶數,則a向前移一位
  12.         {  
  13.             a = a + 1;  
  14.         }  
  15.         if(b%2==0)  //如果末項是偶數,則b向後移一位
  16.         {  
  17.             b = b - 1;  
  18.         }  
  19.         N = (b - a)/2 + 1;  //公式1
  20.         S = (a + b)*N/2;    //公式2
  21.         cout << "Case " << i+1 << ": " << S <<endl;  
  22.     }  
  23.     return 0;  
  24. }  

[UVa]10170 - The Hotel with Infinite Rooms(C++)

範例:
1. first_people = 1, day = 6
(1人)1
(2人)2 3
(3人)4 5 6
output : 3

2. first_people = 3, day = 10
(3人)1 2 3
(4人)4 5 6 7
(5人)8 9 10
output : 5

3. first_people = 3, day = 14
(3人)1  2  3
(4人)4  5  6  7
(5人)8  9  10 11 12
(6人)13 14 
output : 6

我是使用遞減的方法如果>0則持續執行迴圈,以day = 14first_people = 3為例
14-3 > 0
14-3-4 > 0
14-3-4-5 > 0
14-3-4-5-6 < 0

  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. int main() {  
  5.     long long int first_people, day, mins; 
  6.     //第一天(first_people)人旅行團入住,天數到第(day)天 
  7.     while(cin >> first_people >> day)  
  8.     {  
  9.         while((day - first_people) >= 0)  
  10.         {  
  11.             day = day - first_people;  
  12.             if(day != 0)  
  13.             {  
  14.                 first_people++;  
  15.             }  
  16.         }  
  17.         cout << first_people << endl;  
  18.     }  
  19.     return 0;  
  20. }  

[UVa]10929 - You can say 11(C++)

找出11的倍數,此數字的奇數位數的和簡偶位數的和相減的絕對值,為11的倍數則此數是11的倍數,反之則否。
5038297 :
奇數 : 7 + 2 + 3 + 5 = 17
偶數 : 9 + 8 + 0 = 17
|奇數 - 偶數| = 0
5038297是11的倍數

  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. int main() {  
  5.     string s;  //待測數字
  6.     while(cin >> s && s != "0")  //使用者輸入s,且s不能為0
  7.     {  
  8.         long long sum[2] = {0, 0};   //放奇數和和偶數和的陣列
  9.         for(int i = 0;i < s.length();i++)    
  10.         {  
  11.             sum[i%2] = sum[i%2] + s[i] - '0';  
  12.         }  
  13.         if(abs(sum[0]-sum[1])%11 == 0)  
  14.         {  
  15.             cout << s << " is a multiple of 11." << endl;  
  16.         }else  
  17.         {  
  18.             cout << s << " is not a multiple of 11." << endl;  
  19.         }  
  20.     }  
  21.     return 0;  
  22. }  

[UVa]100 - The 3n + 1 problem(C++)

一個數字x,如果是奇數,則3*x+1,如果是偶數,則x/2,最後得到1就結束並得知長度length。
x = 10 : 10 - 5 - 16 - 8 - 4 - 2 - 1,則長度7。
x = 6   : 6 - 3 - 10 - 5 - 16 - 8 - 4 - 2 - 1,則長度9。

題目說給定範圍a~b之間,找出最長長度mxx。
a = 2,b = 5,那就是找出2, 3, 4, 5的長度出來。

x = 2 : 2 - 1,則長度2
x = 3 : 3 - 10 - 5 - 16 - 8 - 4 - 2 - 1,則長度8
x = 4 : 4 - 2 - 1,則長度3
x = 5 : 5 - 16 - 8 - 4 - 2 - 1,則長度6

max = 8

  1. #include <iostream>  
  2. using namespace std;  
  3.    
  4. int main() {  
  5.     int a, b, c;  //a是第一個數字,b是第一個數字,c是讓ab兩者交換的變數
  6.     int n = 0;  //現在是a~b之間的哪個正在算長度的數字
  7.     int length = 0;  //n 的長度
  8.     bool change = false;  //檢測是否交換的布靈值
  9.     int max = 0;  //最大長度
  10.     while(cin >> a >> b)  //使用者輸入a, b
  11.     {  
  12.         if(a > b)  //題目沒說a一定比b小,要假設a > b大的狀況
  13.         {  
  14.             c = a;  //互換
  15.             a = b;  //互換
  16.             b = c;  //互換
  17.             change = true;  //表示互換過
  18.         }  
  19.    
  20.         for(int i = a; i <= b; i++)  //開始計算n的長度
  21.         {  
  22.             int n = i;   //n從a開始
  23.             length = 1;  //自己也算長度
  24.             while(true)  
  25.             {  
  26.                 if(n == 1)  //如果n到一則計算長度結束,跳出迴圈
  27.                 {  
  28.                     break;  
  29.                 }  
  30.                 if(n % 2 == 0)  //如果是偶數
  31.                 {  
  32.                     n = n / 2;  
  33.                 }  
  34.                 else  //如果是奇數
  35.                 {  
  36.                     n = 3 * n + 1;  
  37.                 }  
  38.                 length++;  //不管奇數還偶數,長度+1
  39.             }  
  40.             if(length > max)  //計算出來的長度如果大於之前的長度,則存入max
  41.             {  
  42.                 max = length;  
  43.             }  
  44.             length = 0;  
  45.         }  
  46.         if(change)  //change如果等於true代表a, b互換過,那要再換回來
  47.         {  
  48.             c = a;  //互換
  49.             a = b;  //互換
  50.             b = c;  //互換
  51.         }  
  52.         cout << a << " " << b << " " << max << endl;  
  53.         max = 0;  
  54.         change = false;  
  55.     }  
  56.     return 0;  
  57. }  

2017年9月24日 星期日

[UVa]12019 - Doom's Day Algorithm(C++)

題目說已以2011年來算,輸入測資數量、月份、日期,來輸出這天星期幾。
如果是8/12 -> 把一到七月天數加起來(底線部分),加上天數 = 31+28+31+30+31+30+31+12
如果是1/6 -> 只要天數 = 6

  1. #include <iostream>  
  2. using namespace std;  
  3.    
  4. int main() {  
  5.     int n, month, day, totle = 0;  
  6.     int years_day[12] =   //儲存每月的天數
  7.         {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};  
  8.     cin >> n;  
  9.     for(int i = 0; i < n;i++)  //有幾筆測資就重複幾次
  10.     {  
  11.         cin >> month >> day;  //輸入月份和日期
  12.         if(month == 1)  //如果是一月
  13.         {  
  14.             totle = (day + 5) % 7;  
  15.         }  
  16.         else  //一月以外的月份
  17.         {  
  18.             for(int j = 0; j < (month-1);j++)  
  19.             {  
  20.                 totle = totle + years_day[j];  
  21.             }  
  22.             totle = (totle + day + 5)%7;  
  23.         }  
  24.    
  25.         switch(totle)  //由餘數判定現在星期幾
  26.         {  
  27.             case 0:  
  28.                 cout << "Sunday" << endl;  
  29.                 break;  
  30.             case 1:  
  31.                 cout << "Monday" << endl;  
  32.                 break;  
  33.             case 2:  
  34.                 cout << "Tuesday" << endl;  
  35.                 break;  
  36.             case 3:  
  37.                 cout << "Wednesday" << endl;  
  38.                 break;  
  39.             case 4:  
  40.                 cout << "Thursday" << endl;  
  41.                 break;  
  42.             case 5:  
  43.                 cout << "Friday" << endl;  
  44.                 break;  
  45.             case 6:  
  46.                 cout << "Saturday" << endl;  
  47.                 break;  
  48.         }  
  49.         totle = 0;  
  50.     }  
  51.     return 0;  
  52. }
  53.