标题:序列求和
只看楼主
zy101
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2018-10-27
结帖率:33.33%
 问题点数:0 回复次数:8 
序列求和
题:输入两个正整数a的n,求a+aa+aaa+...+a(n个a)之和。例如输入2和3 ,输出2+22+222.

(请大神指教,多谢)
搜索更多相关主题的帖子: 序列 求和 输入 之和 输出 
2018-10-27 15:45
rohalloway
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:97
专家分:405
注 册:2018-9-28
得分:0 
程序代码:
/*
分析过程,以2/7为例:
2 22 222 2222 22222 222222 2222222    value7 = 2469134    n = 7
2 22 222 2222 22222 222222          value6 = 246912        n = 6
2 22 222 2222 22222                 value5 = 24690        n = 5
2 22 222 2222                       value4 = 2468        n = 4
2 22 222                            value3 = 246        n = 3
2 22                                value2 = 24            n = 2
2                                   value1 = 2            n = 1

通过结果集可总结出规律如下
n = 1时,结果 value1 = a = 2;
n = 2时,结果 value2 = 24  也就是 value1 * 10 + n * 2;
n = 3时,结果 value3 = 246 也就是 value2 * 10 + n * 2;

得出算法为:
int num =0;
for(int i=1; i<=n; i++)
{
    num = num * 10 + i * a;
}
*/

//实现:
#include <iostream>
using namespace std;
int main()
{
    long long a, n;
    cin >> a >> n;
    long long num = 0;
    for (int i = 1; i <= n; i++)
    {
        num = num * 10 + i * a;
    }
    cout << "result:" << num << endl;
    system("pause");
    return 0;
}


[此贴子已经被作者于2018-10-27 22:49编辑过]

2018-10-27 22:46
rohalloway
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:97
专家分:405
注 册:2018-9-28
得分:0 
你自己排一下版,对齐一下注释中的内容,就很容易发现算法规律了
2018-10-27 22:50
Jonny0201
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:52
帖 子:488
专家分:2603
注 册:2016-11-7
得分:0 
我倒是有个思想比较简单的方法
就是利用标准库的 string
第一次输入一个数字到 string
然后利用 stoi 转成 int 求和之后再让这个 string += 输入的数字
2018-10-28 10:16
zy101
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2018-10-27
得分:0 
谢谢
2018-10-28 20:14
rohalloway
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:97
专家分:405
注 册:2018-9-28
得分:0 
以下是引用Jonny0201在2018-10-28 10:16:16的发言:

我倒是有个思想比较简单的方法
就是利用标准库的 string
第一次输入一个数字到 string
然后利用 stoi 转成 int 求和之后再让这个 string += 输入的数字


程序代码:
#include <iostream>
#include <string>
using namespace std;
int main()
{
    while (true)
    {
        string a, str;
        int n, value = 0;

        cin >> a >> n;

        for (int i = 0; i < n; i++)
        {
            str += a;
            value += atoi(str.c_str());
        }

        cout << value << endl;
    }
    system("pause");
    return 0;
}


按照版主的思路实现了一遍,感觉思路更简单合理,谢谢!
2018-10-28 23:09
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
随手写的,没检查,仅供参考
程序代码:
#include <string>

std::string foo( unsigned a, unsigned n )
{
    if( a==0 || n==0 )
        return "0";

    // 当 a==9 且 n>1 时,结果是 n+1 位;其它情况结果都是 n 位
    unsigned m = n + (a==9 && n>1);

    std::string result( m, '0' );
    for( unsigned carry=0; m--; --n)
    {
        carry += n*a;
        result[m] = carry%10 + '0';
        carry /= 10;
    }
    return result;
}

#include <iostream>
using namespace std;

int main( void )
{
    unsigned a, n;
    cin >> a >> n;
    cout << foo(a,n) << endl;
}

输入 8 100
输出 9876543209876543209876543209876543209876543209876543209876543209876543209876543209876543209876543120
输入 9 100
输出 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111010


2018-10-29 09:04
frank6633
Rank: 1
等 级:新手上路
帖 子:4
专家分:4
注 册:2018-11-13
得分:0 
我觉得最科学的算法往往是很简单又很美的;
下面是一个c++程序
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
    int a,b,c,d=0,e;
    cin>>a>>b;
    c=a;
    for(e=1;e<=b;e++){
        d=d+a;
        a=a*10+c;
    }
    cout<<d;
    return 0;
}
2018-11-20 21:02
zy101
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2018-10-27
得分:0 
谢谢
2018-11-30 18:30



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-490736-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.237454 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved