三角形数

  • Description

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

    x

   x x

  x x x

 x x x x
开始18个三角形数是1、3、6、10、15、21、28、36、45、55、66、78、91、105、120、136、153、171。
请求出第n个三角形数。

  • Input

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

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

  • Output

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

  • Sample Input

1
2
3
4
5
11111111

  • Sample Output

1
3
6
10
15
61728399382716

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdlib>
using namespace std;
const int MAXSIZE = 101;
void Add(char *str1, char *str2, char *str3);
void Minus(char *str1, char *str2, char *str3);
void Mul(char *str1, char *str2, char *str3);
void Div(char *str1, char *str2, char *str3);
int main()
{
//    freopen("in.txt","r",stdin);
    char str1[MAXSIZE],str2[MAXSIZE],str3[MAXSIZE*MAXSIZE],str11[MAXSIZE],str22[MAXSIZE];
    while(scanf("%s",str1)!=EOF)
    {
        int i=0;
        memset(str2,'0',sizeof(str2));
        memset(str3,'0',sizeof(str3));
        memset(str11,'0',sizeof(str2));
        memset(str22,'0',sizeof(str2));
        while(str1[i])i++;
        if((str1[i-1]-48)%2==0)
        {
            Div(str1,"2",str11);
            Add(str1,"1",str2);
            Mul(str11,str2,str3);
            puts(str3);
        }
        else
        {
            Add(str1,"1",str2);
            Div(str2,"2",str22);
            Mul(str1,str22,str3);
            puts(str3);
        }
    }
    return 0;
}
void Add(char *str1, char *str2, char *str3)
{// str3 = str1 + str2;
    int  i, j, i1, i2, tmp, carry;
    int  len1 = strlen(str1), len2 = strlen(str2);
    char  ch;
    i1 = len1-1; i2 = len2-1;
    j = carry = 0;  
    for( ; i1 >= 0 && i2 >= 0; ++j, --i1, --i2 ){
        tmp = str1[i1]-'0'+str2[i2]-'0'+carry;
        carry = tmp/10;
        str3[j] = tmp%10+'0';
    }
    while( i1 >= 0 ){
        tmp = str1[i1--]-'0'+carry;
        carry = tmp/10;
        carry = tmp/10;
        str3[j++] = tmp%10+'0';
    }
    if( carry ) str3[j++] = carry+'0';
    str3[j] = '\0';
    for( i=0, --j; i < j; ++i, --j ){
        ch = str3[i]; str3[i] = str3[j]; str3[j] = ch;
    }
}
void Mul(char *str1, char *str2, char *str3){
    int  i, j, i1, i2, tmp, carry, jj;
    int  len1 = strlen(str1), len2 = strlen(str2);
    char  ch;
    jj = carry = 0;
    for( i1=len1-1; i1 >= 0; --i1 ){
        j = jj;
        for( i2=len2-1; i2 >= 0; --i2, ++j ){
            tmp =
                (str3[j]-'0')+(str1[i1]-'0')*(str2[i2]-'0')+carry;
            if( tmp > 9 ){
                carry = tmp/10; str3[j] = tmp%10+'0';
            } 
            else {
                str3[j] = tmp+'0'; carry = 0;
            } 
        } 
        if( carry ) {
            str3[j] = carry+'0'; carry = 0; ++j;
        } 
        ++jj;
    }
    --j;
    while( str3[j] == '0' && j > 0 ) --j;
    str3[++j] = '\0';
    for( i=0, --j; i < j; ++i, --j ){
        ch = str3[i]; str3[i] = str3[j]; str3[j] = ch;
    }
}
void Div(char *str1, char *str2, char *str3){
    int  i1, i2, i, j, jj, tag, carry, cf, c[MAXSIZE];
    int  len1 = strlen(str1), len2 = strlen(str2), lend;
    char  d[MAXSIZE];
    memset(c, 0, sizeof(c));
    memcpy(d, str1, len2);
    lend = len2; j = 0;
    for( i1=len2-1; i1 < len1; ++i1 ){
        if( lend < len2 ){
            d[lend] = str1[i1+1]; c[j] = 0;
            ++j; ++lend;
        } 
        else if( lend == len2 ){
            jj = 1;
            for( i=0; i < lend; ++i ){
                if( d[i] > str2[i] ) break;
                else if( d[i] < str2[i] ){
                    jj = 0; break;
                } 
            } 
            if( jj == 0 ){
                d[lend] = str1[i1+1]; c[j] = 0;
                ++j; ++lend;
                continue;
            } 
        } 
        if( jj==1 || lend > len2 ){
            cf = jj=0;
            while( d[jj] <= '0' && jj < lend ) ++jj;
            if( lend-jj > len2 ) cf = 1;
            else if( lend-jj < len2 ) cf = 0;
            else{
                i2 = 0; cf = 1;
                for( i=jj; i < lend; ++i ){
                    if( d[i] < str2[i2] ){
                        cf = 0; break;
                    } 
                    else if( d[i] > str2[i2] ){
                        break;
                    } 
                    ++i2;
                } 
            }//else
            while( cf ){
                i2 = len2-1; cf = 0;
                for( i=lend-1; i >= lend-len2; --i ){
                    d[i] = d[i]-str2[i2]+'0';
                    if( d[i] < '0' ){
                        d[i] = d[i]+10;    carry = 1;
                        --d[i-1];
                    } 
                    else carry = 0;
                    --i2;
                }
                ++c[j]; jj=0;
                while( d[jj] <= '0' && jj < lend ) ++jj; 
                if( lend-jj > len2 ) cf = 1;
                else if( lend-jj < len2 ) cf = 0;
                else{
                    i2 = 0; cf = 1;
                    for( i=jj; i < lend; ++i ){
                        if( d[i] < str2[i2] ){
                            cf = 0; break;
                        } 
                        else if( d[i] > str2[i2] ){
                            break;
                        } 
                        ++i2;
                    } 
                }//else
            }//while
            jj = 0;
            while( d[jj] <= '0' && jj < lend ) ++jj;
            for( i=0;i < lend-jj; ++i ) d[i] = d[i+jj];
            d[i] = str1[i1+1];    lend = i+1;
            ++j;
        }//else
    }//for
    i = tag = 0;
    while( c[i] == 0 ) ++i;
    for( ; i < j; ++i, ++tag ) str3[tag] = c[i]+'0';
    str3[tag] = '\0';
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值