zoukankan      html  css  js  c++  java
  • TLE: csu 1211 大整数开平方练习

    模拟手工开方,必须使用大数,否则只用sqrt()即可。

    代码有点乱,结果应该是正确的,但是。。TLE了。。。

    接下来应该考虑把代码变短些,除去不必要的运算。

    要还是不行,怎么办啊。。。。欢迎各位大牛测试,谢谢指点!

    /* 大整数开方 */
    # include <stdio.h>
    # include <string.h>
    # include <stdlib.h>
    # include <math.h>
    # include <time.h>

    # define MAXN 1001

    void bigN_sqrt(char *s);
    int bigN_cmp(char *a, char *b, int lim);
    void bigN_mul(char *a, int k, int lim);
    void bigN_add(char *a, int k);
    void bigNN_minus(char *a, char *b, int lim);

    char str[MAXN];

    int main()
    {
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);

    while (~scanf("%s", str))
    bigN_sqrt(str);

    printf("time cost %.3lfs.\n", (double)clock()/CLOCKS_PER_SEC);
    return 0;
    }

    int bigN_cmp(char *a, char *b, int lim)
    {
    int i;
    for (i = lim-1; i >= 0; --i)
    if (a[i] < b[i]) return 1;
    else if (a[i] > b[i]) return -1;
    return 0;
    }
    void bigN_mul(char *a, int k, int lim)
    {
    int i, tmp, c;
    for (c=i=0; i < lim; ++i) {
    tmp = a[i]*k + c;
    c = tmp / 10;
    a[i] = tmp - 10*c;
    }
    }
    void bigN_add(char *a, int k)
    {
    int i = 0;
    while (k > 0) {
    a[i++] += k%10;
    k /= 10;
    }
    }
    void bigNN_minus(char *a, char *b, int lim) // b = b - a;
    {
    int i, tmp, c;
    for (c=i=0; i < lim; ++i) {
    tmp = b[i] - a[i] + c;
    c = (tmp<0 ? -1:0);
    b[i] = (tmp+10) % 10;
    }
    }
    void bigN_sqrt(char *s)
    {
    short int i, k, slen; // 根的一个十进制位
    char res[MAXN]; // 试方余数
    char cur[MAXN]; // 试方上限
    char tmp[MAXN];
    int lim;

    memset(res, 0, sizeof(res));
    memset(cur, 0, sizeof(cur));

    lim = slen = strlen(s);
    if (slen < 18) {
    printf("%.0lf\n", sqrt(atof(s)));
    return;
    }
    if (slen & 0x1) {
    k = -1;
    cur[0] = s[0] - 48;
    } else {
    k = 0;
    cur[1] = s[0] - 48;
    cur[0] = s[1] - 48;
    }
    while (1) {
    i = 0;
    while (1) {
    ++i;
    memcpy(tmp, res, MAXN);
    bigN_mul(tmp, i*20, lim);
    bigN_add(tmp, i*i);
    if (-1 == bigN_cmp(tmp, cur, lim)) break; // break until tmp > cur;
    }
    --i;
    printf("%d", i);

    memcpy(tmp, res, MAXN); //cur -= res*i*20+i*i;
    bigN_mul(tmp, i*20, lim);
    bigN_add(tmp, i*i);
    bigNN_minus(tmp, cur, lim);

    bigN_mul(res, 10, lim); // res = res*10+i;
    bigN_add(res, i);

    k += 2;
    if (k >= slen) break;
    else {
    bigN_mul(cur, 100, lim);
    bigN_add(cur, ((s[k]-48)*10+(s[k+1]-48)));
    }
    }
    printf("\n");
    }



  • 相关阅读:
    关于SubSonic3.0查询或更新时出现System.NullReferenceException异常的处理
    SubSonic3.0使用例子
    Hive:ORC File Format存储格式详解
    HiveQL之Sort by、Distribute by、Cluster by、Order By详解
    Hive之import和export使用详解
    手动安装cloudera manager 5.x(tar包方式)详解
    初次安装hive-2.1.0启动报错问题解决方法
    LAMP下安装zabbix流水
    ESXI虚拟机磁盘管理(精简-厚置-精简)
    VMware esxi 5.5装机方案
  • 原文地址:https://www.cnblogs.com/JMDWQ/p/2378497.html
Copyright © 2011-2022 走看看