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;
}