您的位置:首页 > 其它

UVa:10519 - !! Really Strange !!

2013-11-29 11:09 393 查看
数据量这么大一看就是有公式,而且肯定要用大数

ans=n*(n-1)+2

用到了大数乘法,减法,加法。

要特别注意乘法开的数组要求是最大的乘数的两倍以上。

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 205
using namespace std;
void BigAdd(char *a,char *b,char *back)
{
    char c[MAXN];
    int p=0,up=0;
    for(int i=strlen(a)-1,j=strlen(b)-1; i>=0||j>=0;--i,--j)
    {
        int x,y,z;
        if(i<0) x=0;
        else x=a[i]-'0';
        if(j<0) y=0;
        else y=b[j]-'0';
        z=x+y+up;
        if(z>9) up=1;
        else up=0;
        c[p++]=z%10+'0';
    }
    if(up) c[p++]='1';
    c[p]=0;
    int q=0;
    for(int i=p-1; i>=0; --i) back[q++]=c[i];
    back[q]=0;
}
void BigSub(char *a,char*b,char*back)
{
    char c[MAXN];
    int down=0,p=0;
    for(int i=strlen(a)-1,j=strlen(b)-1; i>=0; --i,--j)
    {
        int x,y,z;
        x=a[i]-'0';
        if(j<0) y=0;
        else y=b[j]-'0';
        z=x-y+down;
        if(z<0)
        {
            down=-1;
            z+=10;
        }
        else down=0;
        c[p++]=z+'0';
    }
    c[p]=0;
    int q=0;
    bool ok=false;
    for(int i=p-1; i>=0; --i)
    {
        if(c[i]!='0') ok=true;
        if(ok) back[q++]=c[i];
    }
    back[q]=0;
}
void BigMult(char *a,char *b,char *back)
{
    int res[MAXN]= {0};
    for(int i=strlen(a)-1,I=0; i>=0; --i,++I)
        for(int j=strlen(b)-1,J=0; j>=0; --j,++J)
            res[I+J]+=(a[i]-'0')*(b[j]-'0');
    int L=strlen(a)+strlen(b)+1;
    for(int i=0; i<=L; ++i)
    {
        res[i+1]+=res[i]/10;
        res[i]=res[i]%10;
    }
    int p=0;
    bool ok=false;
    for(int i=L; i>=0; --i)
    {
        if(res[i]) ok=true;
        if(ok) back[p++]=res[i]+'0';
    }
    if(!ok) back[p++]='0';
    back[p]=0;
}
int main()
{
    char str[MAXN];
    while(scanf("%s",str)!=EOF)
    {
        if(!strcmp(str,"0"))
        {
            puts("1");
            continue;
        }
        char a[MAXN],b[MAXN],c[MAXN];
        BigSub(str,"1",a);
        BigMult(str,a,b);
        BigAdd(b,"2",c);
        puts(c);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: