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位数,使用字符拼接较为理想,性能较快,而且几乎不用考虑范围,从个位开始拼接,
//大数加法,根据式子的特点可以看出,个位是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; }
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); } } }
/* * *类似于高精度加法,数组进位操作。 */ #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; }
#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]); }
//可以先加,然后最后处理进位 倒序输出数组即可 #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; }
大数哦,效率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);
}
}
}
//现场申请相应位数的空间 #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); }
#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; }
#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()); } }
#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; }挺短的,数组记得开大点
#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; }由于题目数据范围很大,不能通过正常的计算得出正确结果,必然会发生溢出,因此只能采取按位计算的方法,利用数组保持运算的各个数位
#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; }
#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; }