首页 > 试题广场 >

数字阶梯求和

[编程题]数字阶梯求和
  • 热度指数:11702 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
给定a和n,计算a+aa+aaa+a...a(n个a)的和。

输入描述:
测试数据有多组,输入a,n(1<=a<=9,1<=n<=100)。


输出描述:
对于每组输入,请输出结果。
示例1

输入

1 10

输出

1234567900
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int a = sc.nextInt();
            int n = sc.nextInt();
            StringBuilder sb = new StringBuilder();
            //使用re接收余数
            int re;
            //使用lt接收进位
            int lt=0;
            for(int i=0;i<n;i++){
                re=((n-i)*a+lt)%10;
                lt=((n-i)*a+lt)/10;
                sb.append(re);
            }
            //将所得数倒置即为所求
            System.out.print(sb.reverse());
        }
    }
}
因为数据大到能达到100位数,使用字符拼接较为理想,性能较快,而且几乎不用考虑范围,从个位开始拼接,
发表于 2018-08-03 03:35:10 回复(0)
//大数加法,根据式子的特点可以看出,个位是n个a相加,十位是n-1个a相加,依次递减
#include<iostream>
(720)#include<algorithm>
using namespace std;
int main()
{
    int a,n;
    while(cin>>a>>n)
    {
        int carry=0;
        string ans="";
        for(int i=n;i>=1;i--)
        {
            int t=i*a+carry;
            ans+=t%10+'0';//字符串拼接
            carry=t/10;
        }
        while(carry)ans+=carry+'0';
        reverse(ans.begin(),ans.end());
        cout<<ans<<endl;
    }
    return 0;
}

发表于 2020-05-09 21:07:48 回复(0)
import java.util.Scanner;
import java.math.BigInteger;
public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            int a = in.nextInt();
            int n = in.nextInt();
            BigInteger sum = BigInteger.valueOf(0);
            BigInteger aa = BigInteger.valueOf(a);
            BigInteger aaa = aa;
            BigInteger radix = BigInteger.valueOf(10);
            BigInteger tmp;
            for(int i=1;i<=n;i++){
                sum = sum.add(aaa);
                aaa = aaa.add(aa.multiply(radix.pow(i)));
            }
            System.out.println(sum);
        }
    }
}

发表于 2018-03-02 16:53:40 回复(0)
#include <stdio.h>
#include <string.h>

int arr[101];

/*假设a为1时,计算1 + 11 + ... + 11...1(n个1)的和:
                11111
                 1111
                  111
                    11
                     1
   如上,n = 5时, sum = 12345;
*/
void initial(int n){
    memset(arr, 0, sizeof(arr));
    int carry = 0;
    int temp;
    for(int i = 0; i < n; i++){
        temp = n - i + carry;
        carry = temp / 10;
        arr[i] = temp % 10;
    }
}

//用初始化后的值乘以a;
int  multiply(int a, int n){
    int i = 0;
    for(; i < n; i++){
        arr[i] *= a;
        arr[i+1] += arr[i] / 10;
        arr[i] %= 10;
    }
    if(arr[n] == 0){
        i--;  //判断是否有进位,若无则把循环后的 i 减1;
    }
    return i;  //返回乘积的位数;
}

int main(){
     int a, n;
     while(scanf("%d %d", &a, &n) != EOF){
        initial(n);
        int point = multiply(a, n);   // 用point标记乘积的位数;
        //从高位到低位打印结果:
        for(int j = point; j >= 0; j--){
            printf("%d", arr[j]);
        }
        printf("\n");
     }
     return 0;
}

编辑于 2021-03-23 12:06:32 回复(0)
/*
*
*类似于高精度加法,数组进位操作。
*/

#include<bits/stdc++.h>

using namespace std;

const int maxn = 1e3;
int a[maxn+5], len;

void stepAns(int x, int n)
{
    int c = 0; len = 0;
    for(int i = n;i >= 1; i--)
    {
        int t = i*x + c;
        a[len++] = t%10; c = t/10;
    }
    while(c)
    {
        a[len++] = c%10; c /= 10;
    }
}

int main()
{
    ios::sync_with_stdio(false);
    int x , n;
    while(cin >> x >> n)
    {
        stepAns(x, n);
        for(int i = len-1;i >= 0; i--) cout << a[i];
        cout << '\n';
    }
    return 0;
}

发表于 2021-01-20 16:14:05 回复(0)
#include<stdio.h>//大数累加问题
int main()
{
    int m,n,i,j,a[1000]={0},sum[1000]={0};
    scanf("%d%d",&m,&n);
    for(i=0;i<n;i++)
    {
        a[i]=m;//每个位置都为m的值a[0]作为个位
        for(j=0;j<=i;j++)
        {
            sum[j]+=a[j];//开始各个位累加
            if(sum[j]>9&&j!=n-1)//进位,最后一位可以不进位直接存储
            {
                sum[j]=sum[j]%10;
                sum[j+1]+=1;
            }
        }    
    }
    for(i=n-1;i>=0;i--)//2.倒序输出
        printf("%d",sum[i]);
}

发表于 2020-04-08 15:00:24 回复(0)
//可以先加,然后最后处理进位 倒序输出数组即可
#include <stdio.h>
(737)#include <string.h>
int main(){
    int result[300];
    int add[200];
    int a,n;
    int i,j,pos;
    memset(result,0,sizeof(result));
    scanf("%d %d",&a,&n);
    for(i=0;i<200;i++) add[i]=a;
    for(i=1;i<=n;i++){
        for(j=0;j<i;j++){
            result[j]+=add[j];
        }
    }
    for(i=0;i<300;i++){
        if(result[i]>9){
            result[i+1]+=result[i]/10;
            result[i]=result[i]%10;
        }
    }
    pos=299;
    while(result[pos]==0) pos--;
    while(pos!=-1) printf("%d",result[pos--]);
    return 0;
}

发表于 2020-03-13 18:47:16 回复(0)
#include <iostream>
#include <string>
using namespace std;

int main()
{
    int a,n;
    while(cin >> a >> n)
    {
        int i,c=0,ans;
        string tmp,res;
        for(i=n;i>0;i--)
        {
            ans=a*i+c;
            res=to_string(ans%10);
            tmp=res+tmp;
            c=ans/10;
        }
        cout << tmp << endl;
    }
    return 0;
}
发表于 2019-04-18 11:27:36 回复(0)
#include<bits/stdc++.h>
char c[102];
int main(){
    int a,n;
    while(scanf("%d %d",&a,&n)!=EOF){
        int s=0,t;
        for(int i=0;i<n;i++){
            t=a*(n-i);
            c[i]=(s+t)%10;
            s=(s+t)/10;
        }
        for(int i=n-1;i>=0;i--)
            printf("%d",c[i]);
        printf("\n");
    }
}
发表于 2019-03-19 11:42:58 回复(0)

大数哦,效率java榜第一!

package com.speical.first;

import java.util.Scanner;

/** 
* 数字阶梯求和
* 
* 大数相加即可,对于每一位的结果为a * 有这个位的数的个数 + 进位
* 然后我们用一个数组存储结果,末尾对应结果的地位
* @author special
* @date 2018年1月31日 下午12:15:36
*/
public class Pro164 {

    public static void sum(int a, int n){
        int[] result = new int[n + (int)(Math.log10(n)) + 1];
        int temp, carry = 0, index = result.length;
        for(int i = n; i > 0; i--){
            temp = a * i + carry;
            carry = temp / 10;
            temp %= 10;
            result[--index] = temp;
        }
        while(carry > 0) {
            result[--index] = carry % 10;
            carry /= 10;
        }
        int i = 0;
        for(; i < result.length && result[i] == 0; i++);
        for(; i < result.length; i++){
            System.out.print(result[i]);
        }
        System.out.println();
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner input = new Scanner(System.in);
        while(input.hasNext()){
            int a = input.nextInt();
            int n = input.nextInt();
            sum(a, n);
        }
    }

}
发表于 2018-01-31 17:29:36 回复(0)

解题思路:由题目阶梯数知,个位数n个,都是a,十位数n-1个,依此推。我们可以从个位开始开始先乘后加,满十进位即可。【PS:为了输出方便我使用了栈图片说明

发表于 2017-03-10 23:43:15 回复(0)
try:
    while 1:
        a, n = map(int, raw_input().split())
        print (10 ** (n + 1) - 9 * n - 10) / 81 * a
except:
    pass

发表于 2016-12-26 21:34:08 回复(5)
代码好说,写过大整数加法的应该很快有思路。注意测试用例有111位的,要么预先声明足够大的,要么用malloc即可
//现场申请相应位数的空间
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{    
    char *result=NULL;           
    int a,n,i,j;             
    scanf("%d%d",&a,&n);           
    result=(char *)malloc((n+2)*sizeof(char));//最后一位留下当作字符串结束标志,第一位预留进位使用
    memset(result,48,(n+2)*sizeof(char));           
    result[n+1]='\0';      
    for(i=0;i<n;i++)      
    {         
        for(j=0;j<=i;j++)         
        {             
           if(result[n-j]+a>57)//进位             
           {                 
               result[n-1-j]++;                 
               result[n-j]+=a-10;                 
               continue;             
           }             
           result[n-j]=result[n-j]+a;         
       }      
    }      
    for(i=0;result[i]==48;i++);      
    printf("%s\n",result+i);                    
    free(result);
}

编辑于 2019-02-27 19:54:16 回复(0)
#include<iostream>
#include<stdio.h>
#define maxIndex 100
using namespace std;
int main()
{
    int x,n;
    //while(cin>>x>>n)    //结果都是没处理循环,这两种在本地都是好好的啊?
    while(scanf("%d %d",&x,&n)!=EOF)
    {
        if(n<1||n>maxIndex||x<0||x>9) //非法数据
            return 0;
        int num[n+1];
        int ci=0;//初始进位
        int ans;
        for(int i=n;i>0;i--)
            {
            ans = (i*x+ci)%10;
            num[n-i] = ans;  //当前位结果
            ci = (i*x+ci)/10;//进位
        }
        if(ci!=0)//最终进位
        {
            n++;
            num[n]=ci;
        }
        for(int j=n;j>0;j--)
            cout<<num[j-1];
        cout<<endl;
    }
    return 0;
}


发表于 2016-12-30 14:15:43 回复(3)
#include<stdio.h>
#include<string>
using namespace std;
int main(){
    int a,n,i,c;
    while(scanf("%d%d",&a,&n)!=EOF){
        string res="";
        for(i=n,c=0;i>=1;i--){
            int sum=a*i+c;
            char tmp=sum%10+'0';
            res=tmp+res;
            c=sum/10;
        }
        if(c) printf("%d",c);
        printf("%s\n",res.c_str());
    }
}
编辑于 2017-10-15 23:38:43 回复(1)
#include <stdio.h>
int main()
{
    int ans[10000];
    int a,n;
    while(scanf("%d%d",&a,&n)!=EOF)
    {
        int carry=0;
         for(int i=n;i>=1;i--)
         {
             ans[i]=((i*a)+carry)%10;
             carry=((i*a)+carry)/10;
         }
        for(int i=1;i<=n;i++)
            printf("%d",ans[i]);
    }
   return 0;
}
挺短的,数组记得开大点
发表于 2019-03-24 21:32:46 回复(3)
后台输入的n大于100,检查了半天,另外用%d输出要到200,%c150就够,太坑了

发表于 2018-10-09 21:40:09 回复(1)
#include<stdio.h>

int main(){
    int a , n;
    scanf("%d %d",&a,&n);
    int sum[200] = {0} ;
    int temp[200] = {0} ; 
    for(int i = 0 ; i < n ; i++){
        temp[i] = a ;
        for(int j = 0 ; j <= i ; j++){
            sum[j] += temp[j] ; 
            if(sum[j] >= 10){
                sum[j] = sum[j] % 10;
                sum[j+1]++;
            }
        }
    }
    for(int i = n-1 ; i >= 0 ; i--){
        printf("%d",sum[i]);
    }
    return 0;
}
由于题目数据范围很大,不能通过正常的计算得出正确结果,必然会发生溢出,因此只能采取按位计算的方法,利用数组保持运算的各个数位
发表于 2020-04-25 13:13:47 回复(0)
#include <stdio.h>

int main() {
    int a, b;
    while (scanf("%d %d", &a, &b) != EOF) {
        int n[200]={0},k=0,carry=0;
        for(int i=b;i>0;i--){
            int reminder=a*i+carry;
            n[k++]=reminder%10;
            carry=reminder/10;
        }
        while(carry){
            n[k++]=carry%10;
            carry=carry/10;
        }
        for(int i=k-1;i>=0;i--) printf("%d",n[i]);
        printf("\n");
    }
    return 0;
}

编辑于 2024-03-06 15:42:25 回复(0)
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int a, n;
    while (cin >> a >> n) {
        vector<int>result(n);   //数组存储大整数
        int carry = 0;  //进位
        for (int i = 0; i < n; i++) {
            int current = (n - i) * a + carry;  //第i位为n-i个a累加
            result[i] = current % 10;
            carry = current / 10;
        }
        while (carry != 0) {    //处理进位
            result.insert(result.begin(), carry % 10);
            carry /= 10;
        }
        //输出大整数
        reverse(result.begin(), result.end());
        for (const auto& i : result) {
            cout << i;
        }
        cout << endl;
    }
    return 0;
}

发表于 2024-03-04 09:31:05 回复(0)