题目是给一个n,输出1到n中任取三个不重复数能够组成三角形的个数
到现在还是不相信我做出来了。。。
我先用三重循环跑,代码如下:
for(int i=2; i<=n; ++i){
for(int j=i+1; j<=n; ++j){
for(int k=i+j-1; k>j; --k){
if(i+j>k && k<=n){
cout << "i = " << i << "\t";
cout << "j = " << j << "\t";
cout << "k = " << k << endl;
count++;
}
}
}
}
然后运行程序通过输入的n与得到的结果找规律。。。结果就找到规律了
![尴尬](http://static.blog.csdn.net/xheditor/xheditor_emot/default/awkward.gif)
对应结果如下:
3 0
4 1 0+1×1
5 3 1+1×2
6 7 3+2×2
7 13 7+2×3
8 22 13+3×3
9 34 22+3×4
10 50 34+4×4
11 70 50+4×5
12 95 70+5×5
13 125 95+5*6
14 161 125+6*6
会发现
如果n为偶数
a[i] = a[i-1]+(n-2)*(n-2)/4
如果n位奇数
a[i] = a[i-1]+(n-1)*(n-3)/4
所以如果n为偶数
a[n] = 0+1*1+1*2+2*2+2*3+...+((n-2)/2)*((n-2)/2) = 1*3+2*5+3*7+...+((n-2)/2)*((n-2)/2)
n为奇数
a[n] = 0+1*1+1*2+2*2+2*3+...+((n-1)/2)*((n-3)/2)=1*3+2*5+3*7+...+((n-1)/2)*((n-3)/2)
不妨另b[i] = i*(2*i+1);
则上面两式对应为:
a[n] = sum{ b[i] }+((n-2)/2)*((n-2)/2) 其中(1<= i <=(n-4)/2)
a[n] = sum{ b[i] }其中(1<= i <=(n-3)/2)
所以最后的代码如下:
#include <cstdio>
#include <iostream>
#include <algorithm>
#define MAXN 1000010
#define ll long long
using namespace std;
ll a[MAXN];
ll f(ll n){
return n*(n+1)*(2*n+1)/3+n*(n+1)/2;
}
int main(void){
ll n;
int ans = 0;
while(cin >> n, n>2){
ll ans = 0;
if(n % 2){
ans = f((n-3)/2);
}
else {
ans = f((n-4)/2)+((n-2)/2)*((n-2)/2);
}
/*
for(int i=2; i<=n; ++i){
for(int j=i+1; j<=n; ++j){
for(int k=i+j-1; k>j; --k){
if(i+j>k && k<=n){
cout << "i = " << i << "\t";
cout << "j = " << j << "\t";
cout << "k = " << k << endl;
count++;
}
}
}
}
*/
cout << ans << endl;
}
return 0;
}