POJ 1001 "Exponentiation"

#include <stdio.h>

#include <string.h>

 

#define MAX 300

 

int intLen(int *pArr)

{

int len = 0;

while(pArr[len] != -1)

{

len++;

}

return len;

}

 

void copyIntArr(int * pArr1, int *pArr2)

{

int len = intLen(pArr1);

int i = 0;

for(; i < len; i ++)

{

pArr2[i] = pArr1[i];

}

pArr2[i] = -1;

}

 

int* plusArrWithArr(int *pArr1, int *pArr2)

{

int len1 = intLen(pArr1);

int len2 = intLen(pArr2);

int *retArr = (len1 >= len2) ? pArr1 : pArr2;

int *tmpArr = (len1 >= len2) ? pArr2 : pArr1;

int max = (len1 >= len2) ? len1 : len2;

int min = (len1 >= len2) ? len2 : len1;

 

int i = 0;

for(; i < min; i++)

{

retArr[max - i - 1] += tmpArr[min - i - 1];

}

 

if(retArr != pArr1)

{

int len = intLen(retArr);

int i = 0;

for(; i < len; i ++)

{

pArr1[i] = retArr[i];

}

pArr1[i] = -1;

}

return retArr;

}

 

void multiplyArrWithUnits(int* pArr1, int pNum, int index, int * pAns)

{

int i = 0;

int len = intLen(pArr1);

for(; i < len; i++)

{

pAns[i] = pArr1[i] * pNum;

}

for(int j = 0; j < index; j++)

{

pAns[i++] = 0;

}

pAns[i] = -1;

}

 

 

void checkArr(int * pArr, int * pAns)

{

int len = intLen(pArr);

int i=0;

for(; i < len - 1; i++)

{

int a = pArr[len - i - 1] / 10;

int b = pArr[len - i - 1] % 10;

if( a > 0)

{

pArr[len - i - 2] += a;

pArr[len - i - 1] = b;

}

}

int c = pArr[len - i - 1] / 10;

int d = pArr[len - i - 1] % 10;

int max = 0;

if(c > 0)

{

max= c;

pArr[len - i - 1] = d;

}

int j = 0;

if(max > 0)

{

pAns[j] = max;

j = 1;

}

int k = 0;

for(; k < len ; k++)

{

pAns[k + j] = pArr[k];

}

pAns[k + j] = -1;

}

 

int getDigit(char* pNumberString)

{

bool hasDot = false;

int len = strlen(pNumberString);

int ret = 0;

bool start = false;

bool end = false;

for(int i = 0; i < len; i++)

{

if((!start && pNumberString[len - 1 - i] != '0') || start)

{

start = true;

if(pNumberString[len - 1 - i] == '.')

{

hasDot = true;

break;

}

ret++;

}

}

    return   (hasDot) ? ret : 0;

}

 

void getArr(char* pNumStr, int* pNum)

{

int point = getDigit(pNumStr);

int len = strlen(pNumStr);

int index = 0;

bool right = false;

bool start = false;

int i = 0;;

int j = 0;

for(; i < len; i++)

if(pNumStr[i] != '0' && !start)

{

start = true;

}

if(pNumStr[i] == '0' && !right && !start)

{

j ++;

}

if(pNumStr[i] == '.')

{

right = true;

j ++;

continue;

}

if(right)

{

index++;

}

if(index > point)

{

break;

}

pNum[i-j] = pNumStr[i] - '0';

}

if(i == j)

{

pNum[i-j] = 0;

j --;

}

pNum[i-j] = -1;

}

 

int getNumber(int * pNumber)

{

int len = intLen(pNumber);

int ret = pNumber[0];

for(int i = 1; i < len; i++)

{

ret = pNumber[i] + ret*10;

}

return ret;

}

 

void multiplyArrWithArr(int* pArr1, int *pArr2, int * pAns)

{

int len1 = intLen(pArr1);

int len2 = intLen(pArr2);

int *tmpArr = (len1 >= len2) ? pArr2 : pArr1;

int *maxArr = (len1 >= len2) ? pArr1 : pArr2;

 

int x = getNumber(tmpArr);

int index = 0;

do

{

int k = x % 10;

int temp[MAX];

multiplyArrWithUnits(maxArr, k, index, temp);

plusArrWithArr(pAns,temp);

index++;

x = x / 10;

}while(x != 0);

}

/*

void testMultiplyArrWithArr()

{

int a[] = {1, 1, 1, -1};

int b[] = {1, 1, 1, -1};

int c[MAX] = {0, -1};

multiplyArrWithArr(a, b, c);

int i=0;

while(c[i]!=-1)

{

printf("%d ",c[i]);

i++;

}

printf("/n");

}

 

void testGetArr()

{

char arr1[] = "3.0300";

int num1[6];

getArr(arr1,num1);

int i=0;

while(num1[i]!=-1)

{

printf("%d",num1[i]);

i++;

}

printf("/n");

 

char arr2[] = "3.0000";

int num2[6];

getArr(arr2,num2);

i=0;

while(num2[i]!=-1)

{

printf("%d",num2[i]);

i++;

}

printf("/n");

}

void testGetDigit()

{

char a[] = "3.03";

printf("%d/n",getDigit(a));

char b[] = "3.0300";

printf("%d/n",getDigit(b));

char c[] = "3.00";

printf("%d/n",getDigit(c));

char d[] = "3.0";

printf("%d/n",getDigit(d));

char e[] = "0.3";

printf("%d/n",getDigit(e));

char f[] = "0.0";

printf("%d/n",getDigit(f));

}

 

void testCheckArr()

{

int arr1[] = {9, 0, 12, -1};

int arr2[5];

checkArr(arr1, arr2);

int len = intLen(arr2);

int i=0;

while(arr2[i]!=-1)

{

printf("%d ",arr2[i]);

i++;

}

printf("/n");

}

 

void testPlusArrWithArr()

{

int arr1[] = {1,2,3,4,5,-1};

int arr2[] = {2,13,-1};

int* ret = plusArrWithArr(arr1,arr2);

int i=0;

while(ret[i]!=-1)

{

printf("%d ",ret[i]);

i++;

}

printf("/n");

}

 

void testMultiplyArrWithUnits()

{

int arr1[] = {3,4,1,-1};

int ch = 2;

int * ans1 = new int[5];

multiplyArrWithUnits(arr1, ch, 1, ans1);

int i=0;

while(ans1[i]!=-1)

{

printf("%d ",ans1[i]);

i++;

}

printf("/n");

delete ans1;

}*/

 

void notZero(int num, int * arr, int point, int times)

{

int ans[MAX] = {0, -1};

int tmp[MAX];

copyIntArr(arr, tmp);

if( times == 1)

{

copyIntArr(arr, ans);

}

for(int i = 1; i < times; i++)

{

int ans1[MAX] = {0, -1};

multiplyArrWithArr(arr, tmp, ans1);

int t[MAX];

copyIntArr(ans1, t);

checkArr(t, ans1);

copyIntArr(ans1, tmp);

copyIntArr(ans1, ans);

}

int right = point * times;

int left = intLen(ans) - right;

bool negative  = false;

if(left < 0)

{

negative  = true;

left *= -1;

}

int count = -1;

int i=0;

while(ans[i]!=-1)

{

if(!negative && i == left)

{

printf(".");

}

else if(negative && count < left)

{

if(count == -1)

{

printf(".");

}

else

{

printf("0");

}

count ++;

continue;

}

 

printf("%d",ans[i]);

i++;

}

printf("/n");

}

 

int main()

{

// testMultiplyArrWithUnits();

// testPlusArrWithArr();

// testCheckArr();

// testGetDigit();

// testGetArr();

// testMultiplyArrWithArr();

char s[10];

int times;

while(scanf("%s%d",s,&times)==2)

{

int arr[10];

getArr(s, arr);

int number = getNumber(arr);

if(times==0)

{

printf("%d/n",1);

}

else

{

int point = getDigit(s);

notZero(number,  arr, point, times);

 

}

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值