| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
测试了所有的数据,还是WA 用字符串实现的 有人能帮忙看看吗 附代码#include "stdio.h"
#include "string.h"
#define MAX_FLOAT_SIZE 10
#define MAX_NUM_LEN 300
int ConvertFloatNum(char* szFloatNum)
{
int i = 0;
int iFloatNum = 0;
char szDstFloastNum[MAX_FLOAT_SIZE + 1] = {NULL};
int j = 0;
int iLen = 0;
iLen = strlen(szFloatNum);
while (szFloatNum[i] != '\0')
{
if (szFloatNum[i] == '.')
{
iFloatNum = iLen - 1 - i;
i++;
continue;
}
szDstFloastNum[j++] = szFloatNum[i++];
}
szDstFloastNum[j] = '\0';
strncpy(szFloatNum, szDstFloastNum, j + 1);
return iFloatNum;
}
void CalAddEachBit(char* szFloatNum1, char* szFloatNum2, char* szDstFloatNum)
{
int i = 0;
int j = 0;
int iLen1 = 0;
int iLen2 = 0;
int iLen = 0;
char szBitFloatNum[MAX_NUM_LEN] = {NULL};
memset(szBitFloatNum, '0', MAX_NUM_LEN);
szBitFloatNum[MAX_NUM_LEN - 1] = '\0';
iLen1 = strlen(szFloatNum1);
iLen2 = strlen(szFloatNum2);
iLen = iLen1 < iLen2 ? iLen1 : iLen2;
for (i = 0; i < iLen; i++, j++)
{
if (j == 0)
{
szDstFloatNum[j] = ((szFloatNum1[i] - '0') + (szFloatNum2[i] - '0')) % 10 + '0';
szBitFloatNum[j + 1] = (szFloatNum1[i] - '0') / 10 + '0';
}
else
{
szDstFloatNum[j] = ((szFloatNum1[i] - '0') + (szFloatNum2[i] - '0') + szBitFloatNum[j] - '0') % 10 + '0';
szBitFloatNum[j + 1] = ((szFloatNum1[i] - '0') + (szFloatNum2[i] - '0') + szBitFloatNum[j] - '0') / 10 + '0';
}
}
if (iLen1 > iLen2)
{
for (; i < iLen1; i++, j++)
{
szDstFloatNum[j] = ((szFloatNum1[i] - '0') + szBitFloatNum[j] - '0') % 10 + '0';
szBitFloatNum[j + 1] = ((szFloatNum1[i] - '0') + szBitFloatNum[j] - '0') / 10 + '0';
}
}
else
{
for (; i < iLen2; i++, j++)
{
szDstFloatNum[j] = ((szFloatNum2[i] - '0') + szBitFloatNum[j] - '0') % 10 + '0';
szBitFloatNum[j + 1] = ((szFloatNum2[i] - '0') + szBitFloatNum[j] - '0') / 10 + '0';
}
}
if (szBitFloatNum[j] != '0')
{
szDstFloatNum[j] = szBitFloatNum[j];
szDstFloatNum[j + 1] = '\0';
}
else
{
szDstFloatNum[j] = '\0';
}
}
void CalAddEachNum(int iNum, char szFloatNumEachBit[][MAX_NUM_LEN], char* szDstFloatNumOne)
{
int i = 0;
char szDstFloatNum[MAX_NUM_LEN] = {NULL};
memset(szDstFloatNum, '0', MAX_NUM_LEN);
szDstFloatNum[MAX_NUM_LEN - 1] = '\0';
strncpy(szDstFloatNumOne, szFloatNumEachBit[0], MAX_NUM_LEN);
for (i = 1; i <= iNum; i ++)
{
CalAddEachBit(szDstFloatNumOne, szFloatNumEachBit[i], szDstFloatNum);
strncpy(szDstFloatNumOne, szDstFloatNum, MAX_NUM_LEN);
}
}
void CalMultiplyEachBit(int iBit, char* szFloatNum, char* szDstFloatNum)
{
int i = 0;
int j = 0;
int iLen = 0;
char szBitFloatNum[MAX_NUM_LEN] = {NULL};
memset(szBitFloatNum, '0', sizeof(char) * MAX_NUM_LEN);
szBitFloatNum[MAX_NUM_LEN - 1] = '\0';
iLen = strlen(szFloatNum);
for (i = iLen - 1; i >= 0; i --, j ++)
{
if (j == 0)
{
szDstFloatNum[j] = (szFloatNum[i] - '0') * iBit % 10 + '0';
szBitFloatNum[j + 1] = (szFloatNum[i] - '0') * iBit / 10 + '0';
}
else
{
szDstFloatNum[j] = ((szFloatNum[i] - '0') * iBit + szBitFloatNum[j] - '0') % 10 + '0';
szBitFloatNum[j + 1] = ((szFloatNum[i] - '0') * iBit + szBitFloatNum[j] - '0') / 10 + '0';
}
}
if (szBitFloatNum[j] != '0')
{
szDstFloatNum[j] = szBitFloatNum[j];
szDstFloatNum[j + 1] = '\0';
}
else
{
szDstFloatNum[j] = '\0';
}
}
void CalMultiplyEachNum(char* szFloatNum, char* szFloatNumMutiply, char* szDstFloatNumOne)
{
int i = 0;
char szFloatNumBit[MAX_FLOAT_SIZE - 1][MAX_NUM_LEN] = {NULL};
char szProcFloatNumBit[MAX_NUM_LEN] = {NULL};
int iLen = 0;
int iLen1 = 0;
for (i = 0; i < MAX_FLOAT_SIZE - 1; i++)
{
memset(szFloatNumBit[i], '0', MAX_NUM_LEN);
szFloatNumBit[i][MAX_NUM_LEN - 1] = '\0';
}
memset((char*)szProcFloatNumBit, '0', MAX_NUM_LEN);
szProcFloatNumBit[MAX_NUM_LEN - 1] = '\0';
iLen1 = strlen(szFloatNum);
for (i = 0; i < iLen1; i ++)
{
CalMultiplyEachBit(szFloatNum[iLen1 - 1 - i] - '0', szFloatNumMutiply, szFloatNumBit[i]);
iLen = strlen(szFloatNumBit[i]);
memset((char*)szProcFloatNumBit, '0', MAX_NUM_LEN - 1);
strncpy((char*)&szProcFloatNumBit[i], (char*)&szFloatNumBit[i][0], MAX_NUM_LEN - i);
strncpy((char*)szFloatNumBit[i], (char*)szProcFloatNumBit, MAX_NUM_LEN);
szFloatNumBit[i][iLen + i] = '\0';
}
CalAddEachNum(iLen1 - 1, szFloatNumBit, szDstFloatNumOne);
}
void SwapFloatNum(char* szFloatNum)
{
int i = 0;
int j = 0;
int iLen = 0;
char szDstFloatNum[MAX_NUM_LEN] = {NULL};
iLen = strlen(szFloatNum);
for (i = 0; szFloatNum[i] != '\0'; i++)
{
szDstFloatNum[iLen - i - 1] = szFloatNum[i];
}
szDstFloatNum[iLen] = '\0';
strncpy(szFloatNum, szDstFloatNum, MAX_NUM_LEN);
}
void GetAllResult(int iPoint, char* szFloatNum)
{
int iLen = 0;
int iDstLen = 0;
int i = 0;
int j = 0;
char szDstFloatNum[MAX_NUM_LEN] = {NULL};
int iIsFloat = 0;
int iPointPara = 0;
iLen = strlen(szFloatNum);
for (i = 0; i < iLen; i ++)
{
if (szFloatNum[i] != '0')
{
break;
}
}
strncpy(szDstFloatNum, &szFloatNum[i], iLen - i);
szDstFloatNum[iLen - i] = '\0';
iDstLen = strlen(szDstFloatNum);
if (iDstLen > iPoint)
{
iPointPara = iDstLen - iPoint;
strncpy(szFloatNum, szDstFloatNum, iPointPara);
for (i = iPointPara; szDstFloatNum[i] != '\0'; i++)
{
if (szDstFloatNum[i] != '0')
{
iIsFloat = 1;
break;
}
}
if (iIsFloat == 1)
{
szFloatNum[iPointPara] = '.';
for (i = iDstLen - 1; i >= iPointPara; i--)
{
if (szDstFloatNum[i] == '0')
{
iPoint--;
}
else
{
break;
}
}
strncpy(&szFloatNum[iPointPara + 1], &szDstFloatNum[iPointPara], iPoint);
szFloatNum[iPoint + iPointPara + 1] = '\0';
}
else
{
szFloatNum[iPointPara] = '\0';
}
}
else
{
iPointPara = iPoint - iDstLen;
szFloatNum[0] = '.';
if (iPoint > iDstLen)
{
memset(&szFloatNum[1], '0', iPointPara);
}
for (i = iDstLen - 1; i >= 0; i--)
{
if (szDstFloatNum[i] != '0')
{
break;
}
else
{
iDstLen--;
}
}
strncpy(&szFloatNum[iPointPara + 1], szDstFloatNum, iDstLen);
szFloatNum[iPointPara + 1 + iDstLen] = '\0';
}
}
void CalAllNum(int iNum, char* szSrcFloatNum, char* szDstFloatNum)
{
int i = 0;
char szDstNum[MAX_NUM_LEN] = {NULL};
memset((char*)szDstNum, '0', MAX_NUM_LEN);
szDstNum[MAX_NUM_LEN] = '\0';
strncpy(szDstFloatNum, szSrcFloatNum, MAX_NUM_LEN);
for (i = 0; i < iNum - 1; i++)
{
CalMultiplyEachNum(szSrcFloatNum, szDstFloatNum, szDstNum);
SwapFloatNum(szDstNum);
strncpy(szDstFloatNum, szDstNum, MAX_NUM_LEN);
}
}
int IsEqualToZero(char* szFloatNum)
{
int i = 0;
int iIsNonZero = 0;
for (i = 0; szFloatNum[i] != '\0'; i++)
{
if (szFloatNum[i] != '0')
{
iIsNonZero = 1;
break;
}
}
return iIsNonZero;
}
int main()
{
char szFloatNum[MAX_FLOAT_SIZE + 1] = {NULL};
int n = 0;
int iGetPoint = 0;
char szDstFloatNum[MAX_NUM_LEN] = {NULL};
int iRet = 0;
while (scanf("%s %d", szFloatNum, &n) != EOF)
{
memset((char*)szDstFloatNum, '0', MAX_NUM_LEN);
szDstFloatNum[MAX_NUM_LEN] = '\0';
iGetPoint = ConvertFloatNum(szFloatNum);
if (n == 0)
{
printf("1\n");
continue;
}
else
{
CalAllNum(n, szFloatNum, szDstFloatNum);
}
iRet = IsEqualToZero(szDstFloatNum);
if (!iRet)
{
printf("0\n");
}
else
{
GetAllResult(iGetPoint * n, szDstFloatNum);
printf("%s\n", szDstFloatNum);
}
}
return 1;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator