题目:直线
来源:“科林明伦杯”哈尔滨理工大学第十届程序设计竞赛(同步赛)

解题思路

题目: 条直线在平面上最多存在多少交点。

最多交点个数为

因为 ,所以交点个数可能会大于 ,所以交点个数使用字符串表示。

addStr 函数实现两个表示十进制数的字符串相加的功能。

两数相乘使用竖式计算。注意:乘以高位数字时,在字符串后面补零。

C++代码

#include<iostream>
using namespace std;

string addStr(string& s1, string& s2){
    string ans = "";
    int i = s1.length() - 1;
    int j = s2.length() - 1;
    int flag = 0;
    while(i >= 0 && j >= 0){
        int a = s1[i] - '0';
        int b = s2[j] - '0';
        int c = a + b + flag;
        flag = c / 10;
        c %= 10;
        ans = to_string(c) + ans;
        --i;
        --j;
    }
    while(i >= 0){
        int a = s1[i] - '0';
        int c = a + flag;
        flag = c / 10;
        c %= 10;
        ans = to_string(c) + ans;
        --i;
    }
    while(j >= 0){
        int a = s2[j] - '0';
        int c = a + flag;
        flag = c / 10;
        c %= 10;
        ans = to_string(c) + ans;
        --j;
    }

    if(flag)
        ans = "1" + ans;

    return ans;
}

int main(){
    int t;
    cin >> t;
    while(t){
        unsigned long long n;
        cin >> n;
        unsigned long long a = n;
        unsigned long long b = n - 1;
        if(a % 2 == 0)
            a /= 2;
        else
            b /= 2;

        string ans = "";
        string s = to_string(b);
        int zero = 0;
        for(int i=s.length()-1; i>=0; --i){
            int k = s[i] - '0';
            string str = to_string(a * k);
            string sz(zero, '0');
            str += sz;
            ans = addStr(ans, str);
            ++zero;
        }
        //unsigned long long ans = n * (n-1) / 2;
        cout << ans << endl;
        --t;
    }
    return 0;
}