HDU1023——Train Problem II

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1023

解题思路:其实就是N个数的出栈入栈。

这道题的难点就是大数运算。跟另外一篇博客一样的思想。

链接:http://blog.csdn.net/kay_zhyu/article/details/8718576

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

#define N 101
char f[N + 1][N];
char str[N];
int L[N];

int Mutiply(char *str1, char *str2, char *str)
{
	int i,j;
	int a,b;
	int Result[N];
	memset(Result,0,sizeof(Result));

	for(i = 0; str1[i] != '#'; ++i)
	{
		a = (int)(str1[i] - '0');
		for(j = 0; str2[j] != '#'; ++j)
		{
			b = (int)(str2[j] - '0');
			Result[i + j] += a * b;
		}
	}

	j += i - 1;
	i = 0;

	//到了最高位,如果不为零,就一直赋值。
	for(i = 0; (i < j || Result[i] > 0); ++i)
	{
		str[i] = Result[i] % 10 + '0';
		Result[i+1] += Result[i] / 10;
	}

	str[i] = '#';//加结束标志
	return i;
}

int Add(char *str1, char *str2, char *str)
{
	int i;
	int a,b;
	int temp,flag;
	flag = 0;
	for(i = 0; (str1[i] != '#' && str2[i] != '#'); ++i)
	{
		a = str1[i] - '0';
		b = str2[i] - '0';
		temp = a + b + flag;
		flag = temp / 10;
		str[i] = temp % 10 + '0';
	}

	if(str1[i] != '#')
	{
		while(str1[i] != '#')
		{
			a = str1[i] - '0';
			temp = a + flag;
			flag = temp / 10;
			str[i] = temp % 10 + '0';
			++i;
		}
	}
	else if(str2[i] != '#')
	{
		while(str2[i] != '#')
		{
			b = str2[i] - '0';
			temp = b + flag;
			flag = temp / 10;
			str[i] = temp % 10 + '0';
			++i;
		}
	}

	if(flag > 0)
	{
		str[i++] = flag + '0';
	}

	str[i] = '#';
	return i;
}

//nLen表示所有字符的个数
void Invert(char *str, int nLen)
{
	int i;
	char temp;

	for(i = 0; i < (nLen >> 1); ++i)
	{
		temp = str[i];
		str[i] = str[nLen - i - 1];
		str[nLen - i - 1] = temp;
	}
}

void Print(char *str, int nLen)
{
	int i;
	for(i = 0; i < nLen; ++i)
	{
		putchar(str[i]);
	}
	printf("\n");
}
void main()
{
	int n;
	int nLen;

	memset(f,0,sizeof(f));
	f[0][0] = '1';
	f[0][1] = '#';
	L[1] = 1;
	f[1][0] = '1';
	f[1][1] = '#';
	for(int i = 2; i < N; ++i)
	{
		f[i][0] = '#';
		f[N][0] = '#';
		for(int j = 0; j < i; ++j)
		{
			nLen = Mutiply(f[j],f[i - j - 1],str);
			nLen = Add(str, f[N],f[i]);
			memcpy(f[N],f[i],(nLen + 2) * sizeof(char));		
		}
		memset(f[N],0,(nLen + 2)*sizeof(char));
		L[i] = nLen;
	}

	for(int i = 2; i < N; ++i)
	{
		Invert(f[i],L[i]);
	}

	while(scanf("%d",&n) != EOF)
	{
		Print(f[n],L[n]);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值