NYOJ - 155:求高精度幂(c语言)(大数)

本题思路较为简单,就是对小数点位置的把握,以及小数点后0的有无作用注意即可!

#include 
#include 
int main()
{
    char R[15];
    int i,j,len,n,flag,digit,k,sum,realNum,s,c,flag1,nums[200];
    while(scanf("%s %d",R,&n) != EOF)
    {
        if(n == 0)
        {
            printf("1\n");
            continue;
        }
        memset(nums, 0, sizeof(nums));
        len = strlen(R);
        //标记.、数组最高位下标、.后面位数、标记小数点后没有作用0的个数、真实的数字
        flag = k = digit = sum = realNum = 0;
        flag1 = 1;
        for(i = 0;i < len;i++)
        {
            if(R[i] == '.')
            {
                flag = 1;
                break;
            }
        }
        //若存在小数点
        if(flag)
        {
            for(i = len-1;i >= 0;i--)
            {
                //记录小数点后面无作用0的个数
                if(R[i] == '0' && flag1)
                {
                    sum++;
                    continue;
                }
                else
                {
                    flag1 = 0;
                    if(R[i] == '.')
                    {
                        flag1 = 0;
                        //计算小数点后真实数字的位数
                        digit = len-sum-i-1;
                        continue;//注意:此处已经跳过去,那么在数组对应下标下该位置的数组元素为0!!!
                    }
                }
                nums[k++] = R[i] - '0';
            }
        }
        //没有小数点
        else
        {
            for(i = len-1;i >= 0;i--)
                nums[k++] = R[i] - '0';
        }
        for(i = k-1;i >= 0;i--)
            realNum = realNum*10 + nums[i];
        for(i = 1;i < n;i++)
        {
            c = 0;
            for(j = 0;j < 199;j++)
            {
                s = realNum*nums[j] + c;
                nums[j] = s%10;
                c = s/10;
            }
        }
        for(i = 199;nums[i]==0 && i>=n*digit;i--);//!!!!一定要加结束符,否则循环不会跳出
        for(j = i;j >= 0;j--)
        {
            if(j == n*digit-1)
                printf(".");
            printf("%d",nums[j]);
        }
        printf("\n");
    }
    return 0;
}

你可能感兴趣的:(高精度,大数)