UVA 113 Power of Cryptography(数学)

        大数开方,结果不超过整型范围。我用的高精和二分在POJ通过了,在UVA没通过。后来在网上看到有大牛直接用double过了,实在让人佩服啊。

我的代码:

#include <stdio.h>
#include <string.h>

// 交换字符串函数
void swap_str(char str[]) {
    int len = strlen(str);
    for (int i=0; i<len/2; i++) {
        int tmp = str[i];
        str[i] = str[len-i-1];
        str[len-i-1] = tmp;
    }
}

// 大数与整型相乘函数(大数以字符串形式给出)
void my_mul(char str[], int x) {
    int len = strlen(str);
    int cp = 0, i, tmp;
    swap_str(str);

    for (i=0; i<len; i++) {
        tmp = (str[i]-'0')*x + cp;
        str[i] = (tmp%10) + '0';
        cp = tmp / 10;
    }

    while (cp) {
        str[i++] = (cp%10) + '0';
        cp /= 10;
    }

    while ('0'==str[i-1] && i>1)
        i--;
    str[i] = '\0';

    swap_str(str);
}
// 比较两个大数的大小(大数前没有0)
int my_numCmp(char str1[], char str2[]) {
    int len1, len2;
    len1 = strlen(str1);
    len2 = strlen(str2);

    if (len1 > len2)
        return 1;
    if (len1 < len2)
        return -1;

    return strcmp(str1, str2);
}

// 字符串存储开方结果
void my_pow(char str[], int k, int n) {
    str[0] = '1', str[1] = '\0';
    while (n--) {
        my_mul(str, k);
    }
}

// 二分查找正确答案
int my_binary_search(int n, char str[]) {
    int high = 1e9, low = 0;
    int mid;
    char tot[2005];

    while (low < high) {
        mid = low + (high-low)/2;
        my_pow(tot, mid, n);
        int tmp = my_numCmp(tot, str);
        if (0 == tmp)
            return mid;
        if (tmp < 0)
            low = mid + 1;
        else
            high = mid;
    }
    return mid;
}

int main() {
    char str[105];
    int n;
    while (scanf("%d%s", &n, str) != EOF) {
        printf("%d\n", my_binary_search(n, str));
    }

    return 0;
}


牛人代码:

#include <stdio.h>
#include <math.h>

int main() {
    double n, p;

    while (scanf("%lf%lf", &n, &p) != EOF) {
        printf("%.lf\n", pow(p, 1/n));
    }

    return 0;
}


 

原文地址:https://www.cnblogs.com/zcube/p/4194543.html