• POJ Exponentiation解题


    Problem: 1001 User: Quincy
    Memory: 260K Time: 0MS
    Language: C++ Result: Accepted
      • Source Code
    // ExponentiationDemo.cpp : Defines the entry point for the console application.
    //
    
    
    #include <string.h>
    #include <iostream>
    
    using namespace std;
    
    const int DATA_LENGTH=200;
    const int INPUT_LENGTH=100;
    
    struct LargeNumber
    {
    	int dotIndex;
    	int dataLength;
    	char data[DATA_LENGTH];
    };
    
    struct InputNumber
    {
    	LargeNumber number;
    	int power;
    };
    
    void MultiLargeNumber(const LargeNumber* num1, const LargeNumber* num2, LargeNumber* outResult)
    {
    	int nLength1 = num1->dataLength;
    	int nLength2 = num2->dataLength;
    
    	LargeNumber tempValue;
    	memset(&tempValue, 0, sizeof(tempValue));
    
    	int ntempValueIndex = 0;
    
    	for (int i=nLength1-1; i >=0; --i, ntempValueIndex++)
    	{
    		int nCarryNum = 0;
    		int index = 0;
    		for (int j=nLength2-1; j >= 0; --j, ++index)
    		{
    			int nData = num1->data[i];
    			nData = nData * num2->data[j] + nCarryNum + tempValue.data[index+ntempValueIndex];
    			tempValue.data[index+ntempValueIndex] = nData % 10;
    			nCarryNum = nData / 10; 
    		}
    
    		if (0!=nCarryNum)
    		{
    			tempValue.data[index+ntempValueIndex] = nCarryNum;
    			index++;
    		}
    
    		tempValue.dataLength = index + ntempValueIndex;
    	}
    
    	tempValue.dotIndex = num1->dotIndex + num2->dotIndex;
    	/// Reserve Result to num1;
    
    	memset(outResult, 0, sizeof(LargeNumber));
    
    	int nLengthResult = tempValue.dataLength;   
    	for (int i=0; i < nLengthResult; ++i)
    	{
    		outResult->data[i] = tempValue.data[nLengthResult-i-1];
    	}
    
    	outResult->dotIndex = tempValue.dotIndex;
    	outResult->dataLength = tempValue.dataLength;
    }
    
    bool ConvertStrToNum(const string& str, LargeNumber* num)
    {
    	int ndataIndex = 0;
    	bool bZero = true;
    	for(int i=0; i<str.length(); ++i)
    	{
    		char tempValue = str.at(i);
    
    		if (tempValue == '.')
    		{
    			num->dotIndex = str.length() - i - 1;
    			continue;
    		}
    
    		if (tempValue < '0' || tempValue > '9')
    		{
    			return false;          
    		}
    
    		if (tempValue != '0')
    		{
    			bZero = false;
    		}
    
    		num->data[ndataIndex++] = tempValue - '0';
    	}
    
    	if (bZero)
    	{
    		num->dataLength = 0;
    		num->dotIndex = 0;
    	}
    	else
    	{
    		num->dataLength = ndataIndex;
    	}
    	
    	return true;
    }
    
    void PrintLargeNumber(const LargeNumber* num)
    {
    	char szResult[DATA_LENGTH] = {0};
    	int  nResultIndex = 0;
    
    	int nLength = num->dataLength;
    	for (int i=0; i<nLength; ++i)
    	{
    		if (num->dotIndex == nLength-i)
    		{
    			szResult[nResultIndex++] = '.';
    			//strResult.push_back('.');
    			//cout << "." ;
    		}
    
    		szResult[nResultIndex++] = char(num->data[i]+'0');
    		//strResult.push_back(char(num->data[i]+'0'));
    		//cout << char(num->data[i]+'0');
    	}
    
    	/// Remove back zero
    
    	for (int i = nResultIndex-1; i >= 0; --i)
    	{		
    		if (szResult[i] != '0')
    		{	
    			if (szResult[i] == '.')
    			{
    				szResult[i] = 0;
    			}
    
    			break;
    		}
    
    		szResult[i] = 0;
    	}
    
    	/// Remove front zero
    
    	int nStartPos = 0;
    	for (; nStartPos < nResultIndex; ++nStartPos )
    	{
    		if (szResult[nStartPos] != '0')
    		{
    			break;
    		}
    	}
    
    	cout << (char*)(szResult+nStartPos) << endl;
    }
    
    int main()
    {
    	char s[8];
    	int n;
    
    	//cin.get(s, 7);
    	//cin >> n;
    	InputNumber Inputs[INPUT_LENGTH] = {0};
    	int nInputCount = 0;
    	while(cin >> s >> n)
    	{
    		if (!ConvertStrToNum(s, &Inputs[nInputCount].number))
    		{
    			return 0; //continue;
    		}
    
    		Inputs[nInputCount].power = n;
    		++nInputCount;
    	}
    
    	int index=0;
    	while (index < nInputCount)
    	{
    		LargeNumber Result;
    		memcpy(&Result, &Inputs[index].number, sizeof(LargeNumber));
    
    		for (int i=0; i<Inputs[index].power-1; ++i)
    		{
    			MultiLargeNumber(&Inputs[index].number, &Result, &Result);
    		}
    
    		PrintLargeNumber(&Result);
    		++index;
    	}
    
    	return 0;
    }

    之前在遍历文件夹下的所以文件和文件夹时,我采用的是递归调用的方式。后来发现可以使用非递归的广度优先算法来实现,感觉比自己的代码要好,更优雅些。

    因为我很多时候解决问题只是把它解决了就好,没有考虑更换思路,所以决定提高自己的算法方面的知识了,以给自己不同的解决思路。

    开始提交几次都出问题了,后来发现还是在现实时把10.0000显示成10.而不是10所以出问题了,主要还是测试用例不全面。

  • 相关阅读:
    Nios学习笔记3——流水灯实验
    Nios学习笔记2——流水灯实验
    Nios学习笔记1——流水灯实验
    转:摄像头camera 7660/7670/7225/9650以及程序流程(一)
    fpga 扇入扇出
    门控时钟的使用
    门控时钟与多扇出问题解决方案
    为所欲为——教你什么才是真正的任意分频
    SDRAM时序--读高手进阶,终极内存技术指南
    FPGA你必须知道的那些事儿
  • 原文地址:https://www.cnblogs.com/Quincy/p/2198844.html
Copyright © 2020-2023  润新知