注册 登录
编程论坛 C++教室

序列求和

zy101 发布于 2018-10-27 15:45, 2916 次点击
题:输入两个正整数a的n,求a+aa+aaa+...+a(n个a)之和。例如输入2和3 ,输出2+22+222.

(请大神指教,多谢)
8 回复
#2
rohalloway2018-10-27 22:46
程序代码:

/*
分析过程,以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编辑过]

#3
rohalloway2018-10-27 22:50
你自己排一下版,对齐一下注释中的内容,就很容易发现算法规律了
#4
Jonny02012018-10-28 10:16
我倒是有个思想比较简单的方法
就是利用标准库的 string
第一次输入一个数字到 string
然后利用 stoi 转成 int 求和之后再让这个 string += 输入的数字
#5
zy1012018-10-28 20:14
谢谢
#6
rohalloway2018-10-28 23:09
以下是引用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;
}


按照版主的思路实现了一遍,感觉思路更简单合理,谢谢!
#7
rjsp2018-10-29 09:04
随手写的,没检查,仅供参考
程序代码:
#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


#8
frank66332018-11-20 21:02
我觉得最科学的算法往往是很简单又很美的;
下面是一个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;
}
#9
zy1012018-11-30 18:30
谢谢
1