• UVA 10523 Very Easy!!!(大数据加法、乘法)


    题意:给出N,A,计算i*A^i(i=1~N)的和。1<=N<=30,0<=A<=15。

    就是大数据运算,别的没什么,注意细节之处即可。

    这题还要注意两个地方:

    1.考虑A=0的情况,直接输出0即可。(我没写这个判断时,竟给我RE,而不是WA。。。不知道RE出在哪里了)

    2.计算A^i的值的时候,不要每次都重新计算,会超时。后一次A^(i+1)可以利用前一次A^i的结果,乘以A即可。

    #include <iostream>
    #include <string.h>
    #include <stdio.h>
    #include <string>
    #include <string.h>
    
    using namespace std;
    int N,A;
    int n1,n2,n3;//n1表示a的位数,n2表示b的位数,n3表示c的位数
    int a[10],b[10],c[200]; //a存储A的值,b存储N的值,c存储A^i的值
    int ans[200],tmp[200]; //ans存储最后的结果
    
    void add(int b[]) {
        for(int i=0; i<200; i++) {
            ans[i]=ans[i]+b[i];
            if(ans[i]>9) {
                ans[i]-=10;
                ans[i+1]++;
            }
        }
    }
    int multiply(int a1[],int b1[],int n1,int n2) {
        memset(tmp,0,sizeof(tmp));
        for(int i=0; i<n1; i++) {
            for(int j=0; j<n2; j++) {
                tmp[i+j]+=a1[i]*b1[j];
            }
        }
        for(int i=0; i<n1+n2; i++) {
            if(tmp[i]>=10) {
                tmp[i+1]+=tmp[i]/10;
                tmp[i]%=10;
            }
        }
        /*
        for(int i=0; i<n1+n2; i++)
            c[i]=tmp[i];
        */
        //第n1+n2位的序号为n1+n2-1,一开始就直接写了c[n1+n2]>0,结果就错了
        if(tmp[n1+n2-1]>0)
            return n1+n2;
        else
            return n1+n2-1;
    }
    
    int main() {
        while(scanf("%d%d",&N,&A)!=EOF) {
            memset(ans,0,sizeof(ans));
            //不写下面A=0的情况,会RE,但具体RE出在哪里就不知道了
            if(A==0) {
                printf("0
    ");
                continue;
            }
    
            if(A<10)
                n2=1;
            else
                n2=2;
            a[0]=A%10;
            a[1]=A/10;
            memset(c,0,sizeof(c));
            c[0]=1;
            n1=1;
            //不需要每次都重新计算A^i的值(不然会超时),后一次A^(i+1)可以利用前一次A^i的结果,每次计算的值存储在c数组里
            for(int i=1; i<=N; i++) {
                n1=multiply(c,a,n1,n2);
                //将乘后的结果存入到c数组,以便后一次利用
                for(int j=0; j<n1+n2; j++)
                    c[j]=tmp[j];
                b[0]=i%10;
                b[1]=(i/10)%10;
                b[2]=i/100;
                if(i<10)
                    n3=1;
                else if(i<100)
                    n3=2;
                else
                    n3=3;
                //每次循环i*A^i的值存储在tmp数组里后,再与ans相加存储到ans数组中
                multiply(c,b,n1,n3);
                add(tmp);
            }
            //找到ans中最高位的索引
            int idx=199;
            while(1) {
                if(ans[idx]==0) {
                    idx--;
                    continue;
                } else
                    break;
            }
            for(int i=idx; i>=0; i--) {
                printf("%d",ans[i]);
            }
            printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    ERRORCODE=4228, SQLSTATE=null
    DB2和Oracle中唯一约束和唯一索引对比
    SW 3D 样条曲线
    SW 快速操作
    spring依赖注入的方式(一)
    Oracle Connect By的用法
    转:min(x,y)高效算法
    【转】QQ盗号核心编程
    转:理解并解决GBK转UTF8奇数中文乱码
    Oracle数据库的导入和导出命令
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/3328450.html
Copyright © 2020-2023  润新知