hdu ACM Steps 2.3

2.3.1 A + B Problem II

高精度什么的最讨厌了

#include<stdio.h>
#include<string.h>
#define N 1005
char A[N],B[N],sum[N];
int main()
{
    int T,i,j,k,x,sign;
    while(scanf("%d",&T)!=EOF)
    {
        for(i=0;i<T;i++)
        {
            if(i)
                printf("\n");
            scanf("%s%s",&A,&B);
            j=strlen(A)-1,k=strlen(B)-1;
            for(x=0,sign=0;(j+1)&&(k+1);j--,k--,x++)
            {
                if((A[j]-'0')+(B[k]-'0')+sign<10)
                {
                    sum[x]=(A[j]-'0')+(B[k]-'0')+sign;
                    sign=0;
                }
                else
                {
                    sum[x]=(A[j]-'0')+(B[k]-'0')+sign-10;
                    sign=1;
                }
            }
            if(j+1)
            {
                for(;j>=0;j--,x++)
                {
                    if(A[j]-'0'+sign<10)
                    {
                        sum[x]=(A[j]-'0')+sign;
                        sign=0;
                    }
                    else
                    {
                        sum[x]=0;
                        sign=1;
                    }
                }
            }
            else if(k+1)
            {
                for(;k>=0;k--,x++)
                {
                    if(B[k]-'0'+sign<10)
                    {
                        sum[x]=(B[k]-'0')+sign;
                        sign=0;
                    }
                    else
                    {
                        sum[x]=0;
                        sign=1;
                    }
                }
            }
            if(sign)
                sum[x]=1;
            else
                x--;
            printf("Case %d:\n",i+1);
            printf("%s + %s = ",A,B);
            while(x>-1)
                printf("%d",sum[x--]);
            printf("\n");
        }
    }
    return 0;
}


2.3.2 Exponentiation

都说了讨厌高精度

#include <stdio.h>
#include <string.h>

int get_decamial(int *a,int l)
{
    int i,k;
    k = 0;
    for ( i = 0; i < l; i++)
    {
        a[i] += k;
        k = a[i] / 10;
        a[i] %= 10;
    }
    while ( k > 0)
    {
        l++;
        a[i] += k;
        k = a[i] / 10;
        a[i] %= 10;
        i++;
    }
    return l;
}


int main()
{
    int i,j,k;
    char str[7];
    int a[1000], num, len;
    int n;
    while ( scanf("%s%d",str,&n) != EOF)
    {
        k = -1;
        num = 0;
        memset(a,0,sizeof(a));
        j = 0;
        len = strlen(str);
        for ( i = len-1; i >= 0; i--)
        {
            if ( '.' == str[i])
            {
                k = 5 - i;
                continue;
            }
            a[j] = str[i] - '0';
            j++;
        }

        for ( i = j-1; i >= 0; i--)
        {
            num = num*10 + a[i];
        }
        if ( num == 0)
        {
            printf("0\n");
            continue;
        }
        len = j;
        k *= n;

        for ( i = 1; i < n; i++)
        {
            for ( j = 0; j < len; j++)
            {
                a[j] *= num;
            }
            len = get_decamial(a,len);
        }
        i = 0;
        while (a[i] == 0)
        {
            if ( i >= k) break;
            i++;
        }
        if ( len < k)
        {
            len = k;
        }
        j = len+1;
        while ( a[j] == 0)
        {
            j--;
            if ( j == k-1)
            {
                break;
            }
        }

        for (; j >= i; j--)
        {
            if ( j == k-1)
            {
                printf(".");
            }
            printf("%d",a[j]);
        }
        printf("\n");
    }
    return 0;
}


2.3.3 Hat's Fibonacci

#include<stdio.h>
using namespace std;
int s[7500][670];
void solve(){
    s[1][1] = 1;s[2][1] = 1;
    s[3][1] = 1;s[4][1] = 1;
    int i,j,k=0;
    for(i = 5;i<7500;i++)
    for( j = 1;j<=670 ;j++)
    {
        k += s[i-1][j]+s[i-2][j]+s[i-3][j]+s[i-4][j];
        s[i][j] = k%10000;
        k = k/10000;
    }
    while(k)
    {
        s[i][j++] = k%10000;
        k = k/10000;
    }
}
int main()
{
    int n,i,j;
    solve();
    while(scanf("%d",&n)!=EOF)
    {
        for(i = 670; i>=1;i--)
        if(s[n][i]!=0)break;
        printf("%d",s[n][i]);
        for(j = i-1;j>=1;j--)
        printf("%04d",s[n][j]);
        printf("\n");
    }
}


2.3.4 How Many Trees?

卡特兰数

不知为什么这题我又用回cin,cout了

#include<iostream>
#include<string.h>
using namespace std;
int a[101][400];
int flag=0;
void print()
{
    a[1][399]=1;
    int i,j,k;
    for(i=2; i<=100; i++)
    {
        for(j=399; j>=0; j--)
        {
            a[i][j]=a[i-1][j]*(4*i-2);
        }
        flag=0;
        for(j=399; j>=0; j--)
        {
            a[i][j]+=flag;
            if(a[i][j]>=10)
            {
                flag=a[i][j]/10;
                a[i][j]%=10;
            }
            else
                flag=0;
        }
        for(k=0; k<=399; k++)
            if(a[i][k]!=0) break;

        int c=0;
        for(j=k; j<=399; j++)
        {
            c=c*10+a[i][j];
            a[i][j]=c/(i+1);
            c=c%(i+1);
        }
    }
}
int main()
{
    int n,i,j;
    print();
    while(cin>>n)
    {
        if(n==0)
            cout<<n<<endl;
        else
        {
            for(i=0; i<=399; i++)
                if(a[n][i]!=0) break;
            for(j=i; j<=399; j++)
                cout<<a[n][j];
            cout<<endl;
        }

    }
    return 0;
}


2.3.5 Buy the Ticket

直接上模板

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define MAX 100
#define BASE 10000
void multiply(int a[],int Max,int b)  //大数乘小数
{
    int i,array=0;
    for (i=Max-1; i>=0; i--)
    {
        array+=b*a[i];
        a[i] = array%BASE;
        array /= BASE;
    }
}

void divide(int a[], int Max, int b)  //大数除小数
{
    int i,div=0;
    for (i=0;i<Max; i++)
    {
        div = div*BASE + a[i];
        a[i] = div / b;
        div %= b;
    }
}
int fact[205][MAX];
void setFact ()
{
     fact[0][MAX-1] = fact[1][MAX-1] = 1;
     for ( int i = 2; i <= 200; ++ i )
     {
           memcpy ( fact[i] , fact[i-1] , MAX * sizeof ( int ) );
           multiply ( fact[i] , MAX , i );
     }
}
void outPut ( int ctl[MAX] )
{
     int i = 0;
     while ( i < MAX && ctl[i] == 0 )
     {
             i ++ ; //去前导0
     }
     printf ( "%d", ctl[i++] );
     while ( i < MAX )
     {
             printf ( "%04d", ctl[i++] );
     }
     putchar ( '\n' );
}
int res[MAX];
int main ()
{
     int M,N;
     int ca = 1;
     setFact();
     while ( cin >> M >> N , M + N )
     {
             printf ( "Test #%d:\n",ca++ );
             if ( N > M )
             {
                  puts ( "0" );
                  continue;
             }
             memcpy ( res , fact[M+N] , MAX * sizeof ( int ) );     // 阶乘 ( m + n )!
             multiply ( res, MAX, M - N + 1 );                             //  ( m + n )! * ( m-n+1 )
             divide ( res, MAX, M + 1 );                                   //     ( m + n )! * ( m-n+1 )  / ( m+ 1 )
             outPut ( res );
     }
     return 0;
}


2.3.6 Count the Trees

卡特兰数

#include<iostream>
#include<string.h>
using namespace std;
int a[101][400];
int flag=0;
void print()
{
    a[1][399]=1;
    int i,j,k;
    for(i=2;i<=100;i++)
    {
        for(j=399;j>=0;j--)
        {
            a[i][j]=a[i-1][j]*(4*i-2)*i;
        }
        flag=0;
        for(j=399;j>=0;j--)
        {
             a[i][j]+=flag;
             if(a[i][j]>=10)
             {
                 flag=a[i][j]/10;
                 a[i][j]%=10;
             }
             else
             flag=0;
        }
        for(k=0;k<=399;k++)
        if(a[i][k]!=0) break;

        int c=0;
        for(j=k;j<=399;j++)
        {
            c=c*10+a[i][j];
            a[i][j]=c/(i+1);
            c=c%(i+1);
        }
    }
}
int main()
{
    int n,i,j;
    print();
    while(cin>>n)
    {
       if(n==0)
       break;
       else
       {

           for(i=0;i<=399;i++)
           if(a[n][i]!=0) break;

           for(j=i;j<=399;j++)
           cout<<a[n][j];
           cout<<endl;
       }

    }
    return 0;
}


2.3.7 Game of Connections

还是卡特兰数

#include<iostream>
#include<string.h>
using namespace std;
int a[101][400];
int flag=0;
void print()
{
    a[1][399]=1;
    int i,j,k;
    for(i=2;i<=100;i++)
    {
        for(j=399;j>=0;j--)
        {
            a[i][j]=a[i-1][j]*(4*i-2);
        }
        flag=0;
        for(j=399;j>=0;j--)
        {
             a[i][j]+=flag;
             if(a[i][j]>=10)
             {
                 flag=a[i][j]/10;
                 a[i][j]%=10;
             }
             else
             flag=0;
        }
        for(k=0;k<=399;k++)
        if(a[i][k]!=0) break;

        int c=0;
        for(j=k;j<=399;j++)
        {
            c=c*10+a[i][j];
            a[i][j]=c/(i+1);
            c=c%(i+1);
        }
    }
}
int main()
{
    int n,i,j;
    print();
    while(cin>>n)
    {
       if(n==-1)
       break;
       else
       {

           for(i=0;i<=399;i++)
           if(a[n][i]!=0) break;

           for(j=i;j<=399;j++)
           cout<<a[n][j];
           cout<<endl;
       }

    }
    return 0;
}


2.3.8 小兔的棋盘

卡卡卡特兰数!!

#include<iostream>
#include<string.h>
using namespace std;
int a[101][400];
int flag=0;
void print()
{
    a[1][399]=2;
    int i,j,k;
    for(i=2;i<=100;i++)
    {
        for(j=399;j>=0;j--)
        {
            a[i][j]=a[i-1][j]*(4*i-2);
        }
        flag=0;
        for(j=399;j>=0;j--)
        {
             a[i][j]+=flag;
             if(a[i][j]>=10)
             {
                 flag=a[i][j]/10;
                 a[i][j]%=10;
             }
             else
             flag=0;
        }
        for(k=0;k<=399;k++)
        if(a[i][k]!=0) break;

        int c=0;
        for(j=k;j<=399;j++)
        {
            c=c*10+a[i][j];
            a[i][j]=c/(i+1);
            c=c%(i+1);
        }
    }
}
int main()
{
    int n,i,j,num=0;
    print();
    while(cin>>n)
    {
       num++;
       if(n==-1)
       break;
       else
       {

           for(i=0;i<=399;i++)
           if(a[n][i]!=0) break;

           cout<<num<<" "<<n<<" ";
           for(j=i;j<=399;j++)
           cout<<a[n][j];
           cout<<endl;
       }

    }
    return 0;
}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值