zoukankan      html  css  js  c++  java
  • SCAU 8629 热身游戏(高精度)

    8629 热身游戏

    时间限制:500MS  内存限制:1000K 提交次数:2 通过次数:1

    题型: 编程题   语言: 无限制

    Description

        ACM 程序设计竞赛是一项激励人心的竞赛,除了考验大家的编程功底,更多的是考验大家的思维以
    及数学运算能力。开赛前15分钟,我们华农的某队开始了以下对话:
    ipc:“我们玩接龙热一下身吧!免得一会没睡醒。”
    Arokenda:“好啊!没问题!怎么玩?”
    ipc:“我先写两个数,然后你我轮流接着已经写好的数列继续写数,每人写1 个数。接龙的规则就是,
    下一个数是前两个数的和。”
    Arokenda:“这还不简单!不就是Fibonacci数列嘛。绝对秒杀啦!”
        此时,ipc 开始写数:1、3。居然不是Fibonacci 数列!下一个就是4 啦!接着数列成型了:1、3、
    4、7、11、18……一直写了N 项,ipc 觉得热身还不够。于是他忽然说了句:“求前N 项和怎么样?”两
    个人顿时“卡”了一下……
    若ipc写出数列的前两项以及项数,你能算出来吗?
    

    Input

    输入一个整数T(T<=20),表示ipc写了T个数列。
    接下来T行, 每行三个整数, 分别为a1,a2,n , 分别表示该数列的前两项和项数。其中0<a1,a2,n<=1000
    

    Output

    每组数据输出一行,该数列的前n项和sum(n)。

    Sample Input

    3
    1 2 15
    1 1 10
    2 2 10
    

    Sample Output

    2582
    143
    286
    

    Hint

    
    

    Source

    朱伟琛

    Provider

    admin

     

    #include<stdio.h>
    #include<string.h>
    int main()
    {
        int T, n1[1000], n2[1000], n[1000], m[1000],temp, e, m1len, m2len, i, j, sum;
        char m1[1000], m2[1000];
        scanf("%d", &T);
        while(T--)
        {
            memset(m1, 0, sizeof(m1));
            memset(m2, 0, sizeof(m2));
            memset(m, 0, sizeof(m)); 
            memset(n1, 0, sizeof(n1));
            memset(n2, 0, sizeof(n2));
            memset(n, 0, sizeof(n));
            scanf("%s%s%d", m1, m2, &sum);
            if(sum == 1) {printf("%s\n", m1); continue;}
            m1len = strlen(m1); m2len = strlen(m2);
            for(i=m1len-1; i>=0; --i) n[i] = n1[i] = m1[m1len-1-i]-'0';
            for(i=m2len-1; i>=0; --i) n2[i] = m2[m2len-1-i]-'0';
            for(i=2,e=0; i<=sum; ++i)
            {
                for(j=0; j<1000; ++j)
                {
                    m[j] = n2[j];
                    temp = (n[j] + n2[j] + e);
                    n[j] = temp%10;
                    e = temp/10;
                }
                for(j=0,e=0; j<1000; ++j)
                {
                    temp = (n1[j] + n2[j] + e);
                    n2[j] = temp%10;
                    e = temp/10;
                }
                
                for(j=0; j<1000; ++j)  n1[j] = m[j];
                
            }
            for(j=999; !n[j] && j>0; --j);
            for(; j>=0; --j) printf("%d", n[j]);
            printf("\n");
        }
        return 0;
    }

    解题报告:
    #高精度#

    建立在Fabionacci上,进行大数相加的运算。

    输入[ 1 1 100]用unsigned long long 已经不能满足,更何况是[1000 1000 1000],经过多次的联系后,改变了以往的小心翼翼计算字符串长度而频繁用strlen函数,这

    次索性开大数组,很快就过了,不然要在整型数组和字符数组之间转换,会浪费较多的时间(只因为strlen)

  • 相关阅读:
    微信小程序
    svn
    当滑动条滑动到某一位置触发js
    css固定页面
    css三级菜单
    h5时钟
    DOM节点
    应用r.js来优化你的前端
    浅谈javascript中的作用域
    javascript 中的 arguments,callee.caller,apply,call 区别
  • 原文地址:https://www.cnblogs.com/liaoguifa/p/2774787.html
Copyright © 2011-2022 走看看