题目:直线
来源:“科林明伦杯”哈尔滨理工大学第十届程序设计竞赛(同步赛)
解题思路
题目: 条直线在平面上最多存在多少交点。
最多交点个数为 。
因为 ,所以交点个数可能会大于 ,所以交点个数使用字符串表示。
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; }