• hdu 1063 && pku1001


    嘿嘿,转帖的代码,感觉简单明了

    大数乘法来的,不过要注意的问题还真多

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

    void times(char *a,char *b,char *t)    //大数乘法,a和b相乘,结果赋给t
    {
        int len_a=strlen(a),len_b=strlen(b);
        int c[10]={0},d[200]={0},e[200]={0};
        for(int i=0;i<len_a;i++)
        c[i]=a[len_a-1-i]-'0';
        for(int i=0;i<len_b;i++)
        d[i]=b[len_b-1-i]-'0';
        int k;
        for(int i=0;i<len_a;i++)
        for(int j=0;j<len_b;j++)
        {
            k=i+j;
            e[k]+=c[i]*d[j];
            if(e[k]>9)
            {
                e[k+1]+=e[k]/10;
                e[k]%=10;
            }
        }
        int len_t=e[k+1] ? k+2 : k+1;
        for(int i=0;i<len_t;i++)
        t[i]=e[len_t-1-i]+'0';
        t[len_t]=0;
    }

    int main()
    {
        char temp[10];
        int n;
        while(scanf("%s%d",temp,&n)!=EOF)
        {
            char r[10];      //从这往下,是将temp去头去尾,将小数化整数,存到r中
            int i,j=0,cnt,end;        //cnt记录小数位数,end用于去掉小数后面多于的0
            for(i=0;temp[i]=='0';i++);      //找第一个不为0的位置,该位置只有两种可能:小数点或数字
            if(temp[i]=='.')
            {
                for(end=strlen(temp)-1;temp[end]=='0';end--);
                cnt=end-i;
                for(i++;temp[i]=='0'&&temp[i];i++);
                for(;i<=end;i++)
                r[j++]=temp[i];
            }
            else       
            {
                for(;temp[i]!='.'&&temp[i];i++)
                r[j++]=temp[i];
                if(temp[i]==0) cnt=0;
                else
                {
                    for(end=strlen(temp)-1;temp[end]=='0';end--);
                    cnt=end-i;
                    for(i++;i<=end;i++)
                    r[j++]=temp[i];
                }
            }
            r[j]=0;
       
            char t[200];    //t存放最终结果
            strcpy(t,r);
            int flag=cnt;    //flag记录小数位数
            while(--n)
            {
                times(r,t,t);
                flag+=cnt;
            }
            int len_t=strlen(t);
            if(flag==0) puts(t);      //flag=0,说明结果是整数
            else if(flag>=len_t)     //flag>=len_t,说明需要在小数点后面、t 前面补0
            {
                putchar('.');
                cnt=flag-len_t;
                while(cnt--)
                putchar('0');
                puts(t);
            }
            else                            //小数点在 t 中间
            {
                flag=len_t-1-flag;
                for(i=0;t[i];i++)
                {
                    putchar(t[i]);
                    if(i==flag) putchar('.');
                }
                putchar('\n');
            }
        }
        return 0;
    }

  • 相关阅读:
    ES6入门 阮一峰
    NPM
    移动端BUG
    配置每次git push 不需要输入账号密码
    移动端rem布局,用户调整手机字体大小或浏览器字体大小后导致页面布局出错问题
    课程表
    岛屿数量
    二叉树的右视图
    c++设计模式——工厂模式
    克隆图
  • 原文地址:https://www.cnblogs.com/nanke/p/2171391.html
Copyright © 2020-2023  润新知