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<bits/stdc++.h>
using namespace std;
string add(string& a, string& b) {
// 确保 a 是较长的字符串
if (a.length() < b.length()) {
swap(a, b);
}
// 反转字符串,方便从最低位开始相加
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
string result;
int carry = 0; // 进位
for (size_t i = 0; i < a.length(); ++i) {
int digitA = a[i] - '0'; // 获取 a 的当前位
int digitB = (i < b.length()) ? (b[i] - '0') :
0; // 获取 b 的当前位(如果存在)
// 计算当前位的和
int sum = digitA + digitB + carry;
result.push_back(sum % 10 + '0'); // 当前位的结果
carry = sum / 10; // 更新进位
}
// 如果还有进位,继续添加
if (carry > 0) {
result.push_back(carry + '0');
}
// 反转结果,恢复正确的顺序
reverse(result.begin(), result.end());
return result;
}
int main() {
string a;
int n;
cin >> a >> n;
vector<string> A;
string tmp = a;
for (int i = 0; i < n; i++) {
A.emplace_back(tmp);
tmp += a;
}
string sum{"0"};
for(auto &num : A) sum = add(sum, num);
cout << sum << endl;
}