三角形数

来源:互联网 发布:用mac什么软件能下视频 编辑:程序博客网 时间:2024/05/01 18:34
  • 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
原创粉丝点击