zoukankan      html  css  js  c++  java
  • 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;
    }
    


     

  • 相关阅读:
    CSU 1605 数独
    HDU 1426 dancing links解决数独问题
    FZU 1686 dlx重复覆盖
    hdu 2295 dlx重复覆盖+二分答案
    zju 3209 dancing links 求取最小行数
    hust 1017 dancing links 精确覆盖模板题
    POJ 1724 二维费用最短路
    【转载】学习总结:初等数论(3)——原根、指标及其应用
    【poj3415-Common Substrings】sam子串计数
    【hdu4436/LA6387-str2int】sam处理不同子串
  • 原文地址:https://www.cnblogs.com/zcube/p/4194543.html
Copyright © 2011-2022 走看看