您的位置:首页 > 其它

南邮 OJ 1032 三角形数

2015-08-03 10:56 197 查看

三角形数

时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte

总提交 : 884            测试通过 : 182 


比赛描述

一定数目的点或圆在等距离的排列下可以形成一个等边三角形,这样的数被称为三角形数。比如10个点可以组成一个等边三角形,因此10是一个三角形数:

    x
   x x
  x x x
 x x x x

开始18个三角形数是13610152128364555667891、105、120、136、153、171。

请求出第n个三角形数。

输入

输入数据包含多组测试用例。

每组测试用例为一个整数N,长度不超100。

输出

对于每组测试用例,输出对应的三角形数。

样例输入

1

2

3

4

5

11111111

样例输出

1

3

6

10

15

61728399382716

题目来源

南京邮电大学计算机学院首届ACM程序设计大赛(2009)

#include <iostream>
#include <string>
#define MAX 1000
using namespace std;

/*
*功能:string存放数字,将其转换成数字数组,其中a[0]存放的是个位,a[1]存放十位,以此类推
*输入:str:string类型数据;
*输出:a[]:输出的数组;
*作者:陈汝军
*时间:2014-8-22 21:28:02
*/
void stringToNo(string str,short a[]){
short i=0,j=0;
for(i=(int)str.size()-1;i>=0;--i,++j){
a[j] = (int)(str[i]-'0');
}
while(j<MAX){
a[j] = 0;
++j;
}
}
/*
*功能:输出数组表示的数字
*输入:num[]:将要输出的数组
*输出:无
*作者:陈汝军
*时间:2014-8-22 21:46:28
*/
void printNum(short num[]){
short i=MAX-1;
while(!num[i]&&i>=0){
--i;
}
if(i < 0){
cout<<0;
return;
}
while(i>=0){
cout<<num[i];
--i;
}
}
/*
*功能:将两个数组所表示的大数相加;
*输入:add1[]:加数1;
* add2[]:加数2;
*输出:sum[] :和;
*作者:陈汝军;
*时间:2014-8-22 21:32:17
*/
void add(short add1[],short add2[],short sum[]){
short i=0;
for(i=0;i<MAX;++i){
sum[i] = 0;
}
for(i=0;i<MAX;++i){
sum[i] += add1[i]+add2[i];
sum[i+1] += sum[i]/10;
sum[i] %= 10;
}
}
/*
*功能:将两个数组表示的两个大数相乘
*输入:mul1[]:大数1
* mul2[]:大数2
*输出:product[]:积
*作者:陈汝军
*时间:2014-8-23 14:55:04
*/
void multi(short mul1[],short mul2[],short product[]){
short i=0,j=0,temp=0;
for(i=0;i<2*MAX;++i){
product[i] = 0;
}
for(i=0;i<MAX;++i){
for(j=0;j<MAX;++j){
temp = mul1[i]*mul2[j];
product[i+j] += temp;
}
}
for(i=0;i<2*MAX-1;++i){
product[i+1] += product[i]/10;
product[i] %=10;
}
}
/*
*功能:将数组表示的两个大数除以一个短整型的数
*输入:divid[]:被除数
* num[]:大数2
*输出:divid[]:商
*作者:陈汝军
*时间:2014-8-23 14:56:20
*/
void divide(short divid[],unsigned short num){
short i=0,temp=0;
for(i=2*MAX-1;i>0;--i){
temp = divid[i];
divid[i] = temp/num;
divid[i-1] += temp%num*10;
}
divid[0] = divid[0]/num;
}
int main(){
short add1[MAX]={0},add2[MAX]={0},sum[MAX]={0},product[2*MAX]={0};
string str;
while(cin>>str){
stringToNo(str,add1);
str = "1";
stringToNo(str,add2);
add(add1,add2,sum); //sum=n+1
multi(add1,sum,product); //product=n*(n+1)
divide(product,2); //product=n*(n+1)/2
printNum(product);cout<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  南邮OJ ACM 三角形数