uva 10523 Very Easy !!! 大数模拟加法和乘法

来源:互联网 发布:C语言经典算法实现 编辑:程序博客网 时间:2024/06/08 03:51

题意:求Σi*a^i, 1<=i<=n,因为n过于庞大,只能用大数做


思路:就大数模板题,注意下a==0就可以了


题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=17&page=show_problem&problem=1464


#include <cstdio>#include <cstring>#include <string>#include <algorithm>#include <iostream>using namespace std;int n, x;const int maxn = 10005;const int base = 10;//这里表示10进制,可以使用百进制,千进制都可class Biginteger{public:    int num[maxn];    int cnt;//cnt是数字长度    void init()    {        cnt = 0;        memset(num, 0, sizeof(num));    }    void show()    {        for(int i=cnt-1; i>=0; i--)            printf("%d",num[i]);        printf("\n");    }};Biginteger a, b, c;//a是累乘的结果,b是累加的结果, c为输入的xvoid multi(int k){    for(int i=0; i<a.cnt; i++)    {        a.num[i] *= k;    }    int i;    for(i=0; i<a.cnt; i++)    {        a.num[i+1] += a.num[i]/base;        a.num[i] %= base;    }    while(a.num[i])    {        a.num[i+1] = a.num[i]/base;        a.num[i] %= base;        i++;    }    while(i>=0 && !a.num[i]) i--;//去到最后一位不为0的位置    a.cnt = i+1;}Biginteger add(const Biginteger &e, const Biginteger &f){    Biginteger h;    h.init();    for(int i=0, j=0, g=0; ; i++, j++)    {        if(g==0 && i>=e.cnt && j>=f.cnt) break;        int x = g;        if(i < a.cnt) x += e.num[i];        if(j < b.cnt) x += f.num[i];        h.num[h.cnt++] = x%base;        g = x/base;    }    return h;}int main(){    while(~scanf("%d%d", &n, &x))    {        if(x == 0)        {            printf("0\n");            continue;        }        a.init(), b.init();        c.cnt = 1, c.num[0] = x;        for(int i=1; i<=n; i++)        {            a.init();//这里一定要清空            a.cnt = 1, a.num[0] = 1;            for(int j=1; j<=i; j++)//累乘            {                multi(x);            }            multi(i);            b = add(a, b);//累加        }        b.show();    }    return 0;}


0 0
原创粉丝点击