南邮 OJ 1032 三角形数

三角形数

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 884            测试通过 : 182 

比赛描述

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

    x

   x x

  x x x

 x x x x

开始18个三角形数是13610152128364555667891105120136153171

请求出第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;	
	}
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值