Codeforces 486A Calculating Function 計算公式

難易度 : 800

英文原文如下

For a positive integer n let’s define a function f:

f(n) =  - 1 + 2 - 3 + .. + ( - 1)nn

Your task is to calculate f(n) for a given integer n.

中文翻譯

對於一個正整數 n,我們來定義一個公式 f:

f(n) =  - 1 + 2 - 3 + .. + ( - 1)nn

你的任務就是要算出給予整數 n 套入公式 f(n) 的結果

輸入

The single line contains the positive integer n (1 ≤ n ≤ 1015).

唯一的一行包含了正整數 n (1 ≤ n ≤ 1015)

輸出

Print f(n) in a single line.

用一行印出 f(n) 的結果

範例

輸入4
輸出2

f(4) = -1+2-3+4 = 2 

輸入5
輸出-3

f(5) = -1+2-3+4-5 = -3


解題思路

在最開始的嘗試中,嘗試用兩個變數 tmp 跟 res來計算

但卻超過時間限制了哈哈

C#解決方案

失敗的第一次嘗試- Runtime error/ Time limit exceeded 

int n = int.Parse(Console.ReadLine());
int tmp = -1;
int res = 0;

for(int i=1; i<=n; i++){
    res+=tmp*i;
    tmp*=-1;
}

Console.WriteLine(res);

方案1

long n = long.Parse(Console.ReadLine());

if(n%2==0)
{
    Console.WriteLine(n/2);
}
else{
    var res = (n/2)-n;
    Console.WriteLine(res);
}

仔細觀察範例可以發現,連續的兩個數字可以被視為一組,一個負的奇數與一個正的偶數他們的組合永遠為1,例如 :

  • (−1+2)=1
  • (−3+4)=1
  • (−5+6)=1

故,我們可以判斷 n 為偶數與否,要是為偶數,代表我們可以分為 n/2組,答案也就是 n/2 * 1 = n/2

要是 n 為奇數,則要 n/2 再扣掉最後的 n ➡ (n/2)-n

至於為什麼奇數也可以 n/2來計算呢,是因為 C# 與 Java中,整數相除也會得到整數(無條件捨去)

例如 : 7/2 = 3,故可視為前面3組的總和 再 扣掉最後的奇數就好 (為負數)

Java解決方案

方案1

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        long n = scanner.nextLong();
        
        if(n%2==0)
        {
            System.out.println(n/2);
        }
        else{
            System.out.println((n/2)-n);
        }
    }
}

與C#相同


結論

以前國高中的時候,記得數學課天天都在算著各種公式呢

工作後,卻沒有用超過加減乘除以外的…

🧡如果文章有幫上你的忙,那是我的榮幸

🧡收藏文章或幫我點個廣告,那都是對我的支持

✅如有任何疑問,歡迎透過留言或messenger讓我知道 !

題目連結 : Problem – 486A – Codeforces

一些其他的Codeforces文章

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *