zoukankan      html  css  js  c++  java
  • 数列求和

    给定某数字A(1A9)以及非负整数N(0N100000),求数列之和S=A+AA+AAA++AAA(N个A)。例如A=1, N=3时,S=1+11+111=123。

    输入格式:

    输入数字A与非负整数N。

    输出格式:

    输出其N项数列之和S的值。

    输入样例:                       输入样例:

    1 3               6 100

    输出样例:                       输出样例:

    123              7407407407407407407407407407407407407407407407407407407407407407407407407407407407407407407407407340

    解题思路:  我们发现,求和时个位数上共有N个A相加,十位数上共有N-1个A相加,依此类推。因此,可以直接计算个位数的结果,十位数的结果,等等。每个数位的结果为(N-K)*A加上进位值,需要O(1)时间;总共有N个数位,因此时间复杂度为O(N)。

    大整数的表示方法:可以将大整数的十进制表示中的每个数为值放在数组中的对应位置。

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 int sum[120000000];     //由于N的值可以很大,可能超过整数的表示范围,所以用数组来保存计算结果
     5 
     6 int main()
     7 {
     8     int A, N;
     9     scanf("%d %d", &A, &N);
    10     if(N == 0)
    11     {
    12         printf("0");
    13         return 0;
    14 
    15     }
    16     sum[0] = 0;
    17     int carry = 0;    //carry表示进位值
    18     for(int i = N; i > 0; --i)
    19     {
    20         int s = A * i + carry;
    21         sum[i] = s % 10;
    22         carry = s / 10;
    23     }
    24     if(carry)         //注意最后的进位(最高位的进位值)要加上!!!
    25         sum[0] = carry;
    26     if(sum[0])
    27         printf("%d", sum[0]);
    28     for(int i = 1; i <= N; ++i)
    29         printf("%d", sum[i]);
    30 
    31     return 0;
    32 }
  • 相关阅读:
    如何实现数据库实体生成工具
    linux samba 与 Windows 共享文件
    CUnit 的使用
    Xml Document与 xml反序列化
    c语言多文件链接
    c 递归获取文件与目录
    gdb输入输出重定向
    C 链表实现
    Log4net多程序集使用独立的配置文件
    Sqlite 学习 编译sqlite静态库,供其他项目调用
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/9682177.html
Copyright © 2011-2022 走看看