码迷,mamicode.com
首页 > 其他好文 > 详细

HDU ACM 1041Computer Transformation(大数模拟+找规律)

时间:2015-04-27 13:16:17      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:c   c++   acm   算法   大数   

分析:大数模拟和找规律。

#include<iostream>
using namespace std;

char f[1001][501];

/*
从下面的步骤中可以看出,下一步的后半部分是前一步的整个串,所以对于后半部分有f[n]=f[n-1];
从前半部分和整体可以看出,另一部分有f[n]=f[n-1]-1(奇数步),f[n]=f[n-1]+1(偶数步)。
step0:1                       f[0]=0
step1:01                      f[1]=0
step2:10 01                   f[2]=1 =2*f[1]+1
step3:0110 1001               f[3]=1 =2*f[2]-1
step4:10010110 01101001       f[4]=3 =2*f[3]+1
step5:0110100110010110 1001011001101001    f[5]=5 =2*f[4]-1
step6:10010110011010010110100110010110 01101001100101101001011001101001  f[6]=11 =2*f[5]+1
最终有f[n]=2*f[n-1]+1(n为偶数),f[n]=2*f[n-1]-1(n为奇数)
  */

void createtable()
{
	int i,j;
	int c,fa,sum;

	memset(f,0,sizeof(f));

	for(i=2;i<=1000;i++)
	{
		if(i%2==0)
		{
			for(j=500,c=0;j>=0;j--)
			{
				fa=f[i-1][j]*2+c;
				f[i][j]=fa%10;
				c=fa/10;
			}
			j=500;
			sum=f[i][j]+1;
			f[i][j]=sum%10;
			c=sum/10;
			while(c)
			{
				sum=f[i][j-1]+c;
				f[i][j-1]=sum%10;
				c=sum/10;
				j--;
			}
		}
		else
		{
			for(j=500,c=0;j>=0;j--)
			{
				fa=f[i-1][j]*2+c;
				f[i][j]=fa%10;
				c=fa/10;
			}
			j=500;
			sum=f[i][j]+-1;
			if(sum==-1)
			{
				f[i][j]=9;
				c=-1;
			}
			else
			{
				f[i][j]=sum;
				c=0;
			}
			while(c==-1)
			{
				sum=f[i][j-1]+c;
				if(sum==-1)
				{
			    	f[i][j]=9;
		     		c=-1;
				}
		    	else
				{
		    		f[i][j]=sum;
		    		c=0;
				}
				j++;
			}
		}
	}
}

int main()
{
	int n,j;

	createtable();
	while(cin>>n)
	{
		if(n==1)
			cout<<"0"<<endl;
		else
		{
			j=0;
			while(f[n][j]==0) j++;
			for(;j<=500;j++)
				putchar(f[n][j]+'0');
			putchar('\n');
		}
	}
    return 0;
}


HDU ACM 1041Computer Transformation(大数模拟+找规律)

标签:c   c++   acm   算法   大数   

原文地址:http://blog.csdn.net/a809146548/article/details/45308551

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!