Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:真不知道我哪里错了 结果一样的

Posted by CrossChao at 2009-11-29 18:51:58 on Problem 1001
In Reply To:真不知道我哪里错了 结果一样的 Posted by:CrossChao at 2009-11-28 22:01:50
#include <iostream>
#include <string>
using namespace std;

void caculate( string string1, int cinum );

int main()
{
    string string1;
	int cinum;

	while( cin >> string1 >> cinum )
	{
	    caculate( string1, cinum );
	}
	return 0;
}

void caculate( string string1, int cinum )
{
	int numTmp[500], rs[500], ping[500][500],dot(0),z(0),z2(0),pingHMax(0),jz(0);//dot 记录被乘数小数点后面的位数
	int i(0),j(0);
    //判断string1中的数字是否有小数点
	numTmp[0] = string1.length();//默认情况下认为不含有小数点
	for( i = 0; i < string1.length(); ++ i )
	{
	    if( (int)string1[i] == 46 )
		{
         numTmp[0] = string1.length() - 1;//numTmp数组第0位记录长度,-1表示除去小数点
		 dot = string1.length() - 1 - i;
		 break;
		}
	}
	//结束判断string1中的数字是否有小数点
    for( i = 0, j = 0; j < numTmp[0] ; ++ i, ++j )//将string1中的内容压入numTmp数组中,0位为长度
	{
		if( (int)string1[i] == 46 )
		{
			--j;
		   continue;
		}
		numTmp[j + 1] = string1[i] - 48;
		//cout << "string[" << i <<"]" << string1[i] << endl;
	    //cout << j <<" " << string1.length()<< endl;
		//cout << numTmp[j+1] << endl;
	}
	//TEST BEGIN
	/**
	for( i = 0; i <= numTmp[0] ; ++ i ) // test numTmp[500]
	{
	cout << i << " : " << numTmp[i] << endl;
	}
	
	  cout << "test for [int]dot" << dot << endl; //test dot
	/**/
	
	//TEST END

	//开始清除numTmp数组末尾的无效0
	if( dot != 0 )
	{
	for( i = numTmp[0]; i > 0; -- i )
	{
	    if( numTmp[i] == 0 )
		{
		    --numTmp[0];
			-- dot;
		}
		else
		{
		    break;//第一次遇到不是0的数字则跳出清除循环
		}
	}
	}
	//清除完毕

	/**开始将numTmp[500]内容复制到rs[500]数组中,为第一次运算做准备**/
	for( i = 0; i < numTmp[0] + 1; ++ i )
	{
		rs[i] = numTmp[i];
	}
	/**复制完毕**/
	
	//test begin
	/**
	for( i = 0; i < rs[0]; ++ i )
	{
	cout << rs[i] << endl;
	}
	**/
	//test end
	
	for( int ci = 1; ci < cinum; ++ ci )
	{
        //test begin
		/**
		for( i = 0; i < rs[0]; ++ i )
		{
		cout << rs[i + 1];
		}
		cout << endl;
		/**/
		//test end
		/**开始计算,利用过渡矩阵ping[500][500]**/
		for( i = numTmp[0]; i > 0; -- i )//外层循环numTmp[0]次
		{
			int k = 0;//k用来每次暂时存储运算矩阵ping[][]的每一行的位数
			//int jz = 0;//运算进制标志
			//int z = 0;//用于运算矩阵的位标志,在前面声明过
			//test begin
			//cout << "z: " << z << endl;
			//test end
			for( j = rs[0], z2 = 0; j > 0; -- j, ++ z2 )//内层
			{
				if( z > 0 && z2 == 0 )//结构化运算矩阵中的内容,是最后合并计算简便好算
				{
					for( int q = z; q > 0; -- q )
					{
						ping[z][z2+1] = 0;
						++ z2;
						++ k;
					}
				}
				
				ping[z][z2 + 1] = numTmp[i] * rs[j] + jz;
				//test begin
				//cout << numTmp[i] << "*" << rs[j] << endl;
				//cout << "ping[][] : z = " << z << " " << ping[z][z2 + 1] << endl;
				//system("pause");
				//test end
				jz = 0;//恢复jz标志
				++ k;//迭进位数计数
				
				if( ping[z][z2 + 1] > 9 )//判断是否进位
				{
					jz = ping[z][z2+1] / 10;//进位标记
					ping[z][z2 + 1] %= 10;
					//test begin
					//cout << "jz:" << jz << endl;
					//cout << "ping[z][z+1]= " << ping[z][z2+1] << endl;
					//test end
				}
			}
			//ping[z][0] = k;//存储位数
			//检查是否还遗留有进位
			while( jz > 0 )//如果还需要进制
			{
				ping[z][++ k] = jz % 10;
				jz /= 10;
				
				//test begin
				//cout << "jz" << jz << endl;
				//cout << "ping[][]: " << ping[z][k] << endl;
				//cout << "行位数:" << k << endl;
				//test end
			}
			ping[z][0] = k;//存储位数
			
			k = jz = 0;//恢复
			++ z;
		}
		/**计算结束**/
		
		//test begin - 测试运算矩阵第一次平方的内部值 注意 运算矩阵的行数值是 numtmp[0]
		//cout << numTmp[0] << endl;
		//cout << "ping[][]" << ping[3][0] << endl;
		/**
		for( i = 0; i < numTmp[0]; ++i )
		{
		for( j = 0; j <= ping[i][0]; ++j )
		{
		cout << ping[i][j] <<" ";
		}
		cout << endl;
		}
		/**/
		//test end
		
		//开始找出运算矩阵中长度值最大行,存储于pingHMax中
		for( i = 0; i < numTmp[0]; ++ i )
		{
			if( ping[i][0] > pingHMax )
			{
				pingHMax = ping[i][0];
			}
		}
		//运算矩阵中长度值最大行超找完毕
		
		//test begin
		//cout << "pingHMax: " << pingHMax << endl;
		//test end
		
		jz = 0;//回复jz初始状态
		/**开始合并运算矩阵ping,将结果存入rs中,运算矩阵斜线相加**/
		for( i = 0; i < pingHMax; ++ i )
		{
			rs[pingHMax - i] = 0;//先对结果此位数组值置零
			for( j = 0; j < numTmp[0]; ++ j )
			{
				if( i >= ping[j][0] )
				{
					continue;
				}
				rs[pingHMax - i] += ping[j][i + 1];
				//test begin
				//cout << "ping[][]:" << ping[j][i + 1] << "   ";
				//test end
			}
			//test begin
			//cout << "test: " << rs[pingHMax - i] << endl; 
			//test end
			rs[pingHMax - i] += jz;//加上进位的数
			jz = 0;//进位后恢复jz标志
			if( rs[pingHMax - i] > 9 )//检测是否需要进制
			{
				jz = rs[pingHMax - i] / 10 ;
				rs[pingHMax - i] %= 10;
			}
		}
		rs[0] = pingHMax;//改变rs中记录长度的数值
		z = 0;//恢复z,为下次用
		//至此第一次平方完毕
		
		//test begin
		//cout << "ci" << ci << endl;
		/**
		system("pause");
		for( i = 0; i < rs[0]; ++ i )
		{
			cout << rs[i + 1];
		}
		cout << endl;
		**/
		//test end
	}

	dot *= cinum;//计算小数点位数

	//输出前开始对结果最后的连续0进行清除,注意是小数点后面的0,不是小数点前面的0
    /**
	for( i = rs[0]; true; -- i )
	{
	    if( rs[i] == 0)
		{
		    -- rs[0];
		}
		else
		{
		    break;
		}
	}
	//清除完毕
	**/
	//开始输出最后的结果
	if( rs[1] == 0 && rs[0] != 1)
	{}
	else if( rs[0] == 1 )
	{
	    cout << rs[1];
	}
	else
	{
	    cout << rs[1];
	}
	for( i = 1; i < rs[0]; ++ i )
	{
		//test begin
		//cout << "dot: " << dot << "rs[0]: " << rs[0] << endl;
		//test end

		if( i == rs[0] - dot )//判断是否输出小数点
		{
			if( i != rs[0] )//不打印小数点如果结果是整数
			{
			    cout <<'.';
			}
		}
		cout << rs[i + 1];
	}
	cout << endl;
	//输出最后的结果完毕
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator