The input will consist of at most 100 lines of text, each of which contains a single VeryLongInteger. Each VeryLongInteger will be 100 or fewer characters in length, and will only contain digits (no VeryLongInteger will be negative). The final input line will contain a single zero on a line by itself. 注意输入数据中,VeryLongInteger 可能有前导0
Your program should output the sum of the VeryLongIntegers given in the input.
123456789012345678901234567890 123456789012345678901234567890 123456789012345678901234567890 0
370370367037037036703703703670
import java.math.BigInteger;
import java.util.Scanner;
public class Main
{
public static void main(String... as)
{
Scanner sc = new Scanner(System.in);
BigInteger sum = BigInteger.ZERO;
BigInteger b = sc.nextBigInteger();
do
{
sum = sum.add(b);
b = sc.nextBigInteger();
}
while (!b.equals(BigInteger.ZERO));
System.out.println(sum);
sc.close();
}
}
#include<iostream>
#include<cstdio>
using namespace std;
void sToArr(int *tmp,string s){
for(int i=0;i<1000;i++)tmp[i]=0;
for(int i=999;i>999-s.length();i--)tmp[i]=s[i-1000+s.length()]-'0';
}
void add(int *result,int *a,int *b){
int jw=0;
for(int i=999;i>=0;i--){
if(a[i]+b[i]+jw>9){
result[i]=a[i]+b[i]+jw-10;
jw=1;
}else{
result[i]=a[i]+b[i]+jw;
jw=0;
}
}
};
int main(){
int result[1000],a[1000],b[1000],jw=0;
string s;
for(int i=0;i<1000;i++){
result[i]=0;
a[i]=0;
}
while(cin>>s&&s!="0"){
sToArr(b,s);
for(int i=0;i<1000;i++)a[i]=result[i];
add(result,a,b);
}
int i=0;
while(result[i]==0)i++;
for(;i<1000;i++)cout<<result[i];
cout<<endl;
} #include<bits/stdc++.h>
using namespace std;
struct bign {
int d[110],len;
bign() {
memset(d,0,sizeof(d));
len=0;
}
};
bign change(string s) {
bign a;
for(int i=s.length()-1; i>=0; i--) {
a.d[a.len++]=s[i]-'0';
}
return a;
}
bign add(bign a,bign b) {
bign c;
int carry=0,temp;
for(int i=0; i<a.len||i<b.len; i++) {
temp=a.d[i]+b.d[i]+carry;
c.d[c.len++]=temp%10;
carry=temp/10;
}
if(carry!=0) c.d[c.len++]=carry;
return c;
}
void p(bign a) {
for(int i=a.len-1; i>=0; i--) {
printf("%d",a.d[i]);
}
printf("\n");
}
int main() {
string s;
bign a,ans;
getline(cin,s);
ans=change(s);
while(getline(cin,s)) {
if(s=="0") break;
a=change(s);
ans=add(a,ans);
}
p(ans);
} #include <stdio.h>
#include <string.h>
int main()
{
char temp[101]={0};
int ans[200]={0};
int p=0; //p指示当前结果位数
while(~scanf("%s",temp) && strcmp(temp,"0")!=0)
{
int l=strlen(temp),c=0,i; //c表示进位
for(i=0;l-i-1>=0;i++) //将新输入的大数从低位(个位)到高位与之前结果相加
{
ans[i]=ans[i]+c+temp[l-i-1]-'0'; //即使当前输入的位数超过了当前结果,也不用管,当前结果高位全是0
c=ans[i]/10;
ans[i]=ans[i]%10;
}
while(c!=0) //进位不为0,继续加
{
ans[i]=ans[i]+c; //超过了当前位数p也不用管,因为结果数组高位全是0
c=ans[i]/10;;
ans[i]=ans[i]%10;
i++;
}
if(i-1>p)p=i-1; //i-1指示算完后结果,若大于p,要更新p
}
while(ans[p]==0)p--; //结果有可能还有前导0,比如003+2,输出005,因为p被更新了
for(int i=p;i>=0;i--)printf("%d",ans[i]);
printf("\n");
} try:
while 1:
s = 0
while 1:
a = raw_input()
if a == '0':
break
s += int(a)
print s
except:
pass
只学了C语言,别的C答案看不懂,自己写个简单的
#include<stdio.h>
#include<string.h>
#define N 120
int main()
{
char str[N];
int ans[N];
int i, len, flag;
memset(ans, 0, sizeof(ans));
while(scanf("%s", str))
{
len=strlen(str);
if( len == 1 && str[ 0 ] == '0' ) break;
for(i=0; i<len; i++)
{
ans[i]=ans[i] + (int)(str[len-1-i]-'0');
if(ans[i]>=10)
{
ans[i]%=10;
ans[i+1]++;
}
}
memset(str, '0', sizeof(str));
}
for(flag=0, i=N-1; i>=0; i--)//倒序,当不为0时,flag标记1,开始输出
{
if(ans[i]==0&&flag==0)
continue;
else
flag=1;
printf("%d", ans[i]);
}
printf("\n");
return 0;
} s = [] while True: a = int(input()) if a == 0: break s.append(a) print(sum(s))
#include <bits/stdc++.h>
using namespace std;
vector<string> s;
int main() {
string a, ans;
int len = 0, add = 0;
while (cin >> a) {
if (a == "0") break;
len = max(len, (int)a.size());
reverse(a.begin(), a.end());
s.push_back(a);
}
for (int i = 0; i < len; i++) {
int sum = add;
for (auto str: s) {
if (str.size() <= i) continue;
sum += str[i] - '0';
}
ans.push_back(sum % 10 + '0');
add = sum / 10;
}
while (add) {
ans.push_back(add % 10 + '0');
add /= 10;
}
reverse(ans.begin(), ans.end());
cout << ans;
return 0;
} #include <iostream> #include <vector> #include <string> using namespace std; vector<int> add(vector<int> a, vector<int> b){ int t=0; vector<int> res; for(int i=0; i<a.size() || i<b.size(); ++i){ if(i<a.size()) t+=a[i]; if(i<b.size()) t+=b[i]; res.push_back(t%10); t /= 10; } if(t==1) res.push_back(1); return res; } vector<int> reverse(vector<int> str){ vector<int> res; for(int i=str.size()-1; i>=0; --i){ res.push_back(str[i]); } return res; } int main(){ vector<string> integers(102); string temp; int k=0; for(int i=0; i<102&&temp!="0"; i++){ cin >> temp; integers[i]=temp; if(temp=="0") integers[i].pop_back(); } for(int i=integers.size()-1; integers[i]==""; --i){ integers.pop_back(); } vector<int> str,res; for(int i=0; i<integers.size(); ++i){ str.clear(); for(int j=integers[i].size()-1; j>=0; --j){ str.push_back(integers[i][j]-'0'); } if(i==0) { res=str; }else{ res=add(res,str); } } for(int i=0; i<res.size(); ++i){ cout << reverse(res)[i]; } cout << endl; }
#include <algorithm>
#include <iostream>
#include <istream>
#include <ostream>
#include <string>
using namespace std;
const int MAXN = 10000;
struct VeryLongInteger {
int* digit;
int length;
VeryLongInteger();
VeryLongInteger(int x);
VeryLongInteger operator=(string str);
bool operator!=(int x);
bool operator!=(const VeryLongInteger& x);
VeryLongInteger operator+=(const VeryLongInteger& x);
friend istream& operator>>(istream& in, VeryLongInteger& x);
friend ostream& operator<<(ostream& out, const VeryLongInteger& x);
};
istream& operator>>(istream& in, VeryLongInteger& x) {
string str;
in >> str;
x = str;
return in;
}
ostream& operator<<(ostream& out, const VeryLongInteger& x) {
for (int i = x.length - 1; i >= 0; i--) {
out << x.digit[i];
}
return out;
}
VeryLongInteger::VeryLongInteger() {
digit = new int[MAXN]();
length = 0;
}
VeryLongInteger::VeryLongInteger(int x) {
digit = new int[MAXN]();
length = 0;
if (x == 0) {
digit[length++] = x;
}
while (x != 0) {
digit[length++] = x % 10;
x /= 10;
}
}
VeryLongInteger VeryLongInteger::operator=(string str) {
length = str.length();
for (int i = 0; i < length; i++) {
digit[i] = str[length - i - 1] - '0';
}
return *this;
}
bool VeryLongInteger::operator!=(int x) {
return *this != VeryLongInteger(x);
}
bool VeryLongInteger::operator!=(const VeryLongInteger& x) {
if (length != x.length) {
return true;
} else {
for (int i = 0; i < length; i++) {
if (digit[i] != x.digit[i]) {
return true;
}
}
}
return false;
}
VeryLongInteger VeryLongInteger::operator+=(const VeryLongInteger& x) {
int carry = 0;
for (int i = 0; i < length || i < x.length; i++) {
int current = digit[i] + x.digit[i] + carry;
carry = current / 10;
digit[i] = current % 10;
}
length = max(length, x.length);
if (carry) {
digit[length++] = carry;
}
return *this;
}
int main() {
VeryLongInteger sum = 0, number;
while (cin >> number && number != 0) {
sum += number;
}
cout << sum << endl;
return 0;
} import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s;
BigInteger sum = new BigInteger("0");
while ((s = br.readLine()) != null) {
if (s.equals("0")) break;
BigInteger num = new BigInteger(s);
sum = num.add(sum);
}
System.out.println(sum);
}
}
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
string add(string a, string b){
string res;
int tmp=0;
int size=max(a.size(), b.size());
//数位对齐,便于竖式计算
while(a.size()<size) a.insert(a.begin(), '0');
while(b.size()<size) b.insert(b.begin(), '0');
//从最低位开始加,每次将相加结果的个位数字保存,同时除以10获得进位
//按字符串读入顺序,数位高的在左边(字符串前面),所以每次在字符串头部插入
for(int i=size-1; i>-1; i--){
tmp=a[i]+b[i]-2*'0'+tmp;
res.insert(res.begin(),tmp%10+'0');
tmp/=10;
}
//相加完成后还有进位
while(tmp>0) {
res.insert(res.begin(),tmp%10+'0');
tmp/=10;
}
//去除前导零
while(res[0]=='0')
res.erase(res.begin());
return res;
}
int main(){
string a, b;
//循环相加
while(cin>>a && a!="0")
b=add(a, b);
cout<<b<<endl;
return 0;
} #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 110;
int sum[maxn] = {0};//从低位开始存储,便于对其
int length = 0; //大数字的位数
int main() {
char str[maxn];//存储从最高位开始的大数字
while(scanf("%s", str) != EOF) {
if(strlen(str) == 1 && str[0] == '0') break;//长度必须要为1,前导零存在
int digit = 0;//位数
for(int i = strlen(str) - 1; i >= 0; --i) {
sum[digit] = sum[digit] + str[i] - '0';
if(sum[digit] >= 10) {
int carry = sum[digit] / 10; //进位
sum[digit] = sum[digit] % 10;
sum[digit + 1] = sum[digit + 1] + carry;
}
digit++;//下一位
}
}
int i = maxn;
while(sum[i] == 0) i--;
while(i >= 0) {
cout<<sum[i];
i--;
}
return 0;
} #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char str[110];
struct bign{
int len;
int num[110];
bign(int l){
memset(num,0,sizeof(num));
len=l;
}
};
bign change(char str[]){
bign a(0);
int len=strlen(str);
a.len=len;
for(int i=0;i<len;++i){
a.num[i]=str[len-i-1]-'0';
}
return a;
}
bign add(bign a,bign b){
int flag=0;
int len=max(a.len,b.len);
for(int i=0;i<len;++i){
int temp=(a.num[i]+b.num[i]+flag)%10;
flag=(a.num[i]+b.num[i]+flag)/10;
a.num[i]=temp;
}
if(flag==1)
a.num[len++]=1;
a.len=len;
return a;
}
int main(){
bign a(0);
while(scanf("%s",str)!=EOF){
int len=strlen(str);
if(len==1&&str[0]=='0')
{ for(int i=a.len-1;i>=0;--i)
printf("%d",a.num[i]);
break;
}
bign b=change(str);
a=add(a,b);
}
return 0;
} #include <bits/stdc++.h>
using namespace std;
string cmp(string x, string y){
int a[10001],b[10001];
int x1=x.size();
int y1=y.size();
string u;
for(int i=0;i<10001;++i){
a[i]=0;
b[i]=0;
}
int k=0;
for(int i=10001-x1;i<10001;++i){
a[i]=x[k]-'0';
++k;
}
k=0;
for(int j=10001-y1;j<10001;++j){
b[j]=y[k]-'0';
++k;
}
if(x1<y1){
for(int i=10000;i>=10001-x1;--i){
b[i]= b[i]+a[i];
}
for(int i=10000;i>0;--i){
if(b[i]>9){
b[i-1]++;
b[i]=b[i]-10;
}
}
int j=0;
for(int i=0;i<10001;++i){
if(b[i]!=0){
j=i;
break;
}
}
for(int i=j;i<10001;++i)
u+=b[i]+'0';
}
if(x1>=y1){
for(int i=10000;i>=10001-x1;--i){
a[i]= a[i]+b[i];
}
for(int i=10000;i>=0;--i){
if(a[i]>9){
a[i-1]++;
a[i]=a[i]-10;
}
}
int j=0;
for(int i=0;i<10001;++i){
if(a[i]!=0){
j=i;
break;
}
}
for(int i=j;i<10001;++i)
u+=a[i]+'0';
}
return u;
}
int main(){
string s;
string res="0";
while(cin>>s){
if(s=="0")
break;
res=cmp(res,s);
}
cout<<res<<endl;
return 0;
} #include<iostream>
(720)#include<string>
#include<cstdio>
using namespace std;
string Add(string s1,string s2){
int len1=s1.length();
int len2=s2.length();
if(len1>len2){
for(int i=0;i<(len1-len2);i++){
s2="0"+s2;
}
}else if(len2>len1){
for(int i=0;i<(len2-len1);i++){
s1="0"+s1;
}
}
int remainder=0;//上一轮进位
for(int i=s1.length()-1;i>=0;i--){
int current=s1[i]-'0'+s2[i]-'0'+remainder;
s1[i]=(current%10)+'0';
remainder=current/10;
}
if(remainder!=0){
s1=char(remainder+'0')+s1;
}
return s1;
}
int main(){
string str,ans;
ans="0";
while(cin>>str){
if(str=="0"){
break;
}
ans=Add(ans,str);
}
cout<<ans;
return 0;
} #include<bits/stdc++.h>
using namespace std;
int num[1000]={0},m,len=0;
int main(){
string a;
while(cin>>a){
reverse(a.begin(),a.end());//翻转以方便对齐进位等
int a1[1000]={0};
for(int i=0;i<a.size();i++){
a1[i]=a[i]-'0';//转化成整型
}
int jinwei=0;
for(int i=0;i<a.size()+100;i++){//加100是因为最高位可能会出现不止一位的进位
if(num[i]+a1[i]+jinwei<10){
num[i]=num[i]+a1[i]+jinwei;
jinwei=0;
}
else{
num[i]=(num[i]+a1[i]+jinwei)%10;
jinwei=1;
}
}
int flag=0;
if(a=="0"){
for(int i=1000;i>=0;i--){
if(num[i]!=0)
flag=1;
if(flag==1)
cout<<num[i];
}
break;
}
}
return 0;
} 这个最高位进位可能 不止1位 坑了我好久
#include<string>
#include<iostream>
using namespace std;
void AddZero(string &a,string &b)//对其补零
{int len;
if(a.size()>b.size())
{len=a.size()-b.size();
for(int i=0;i<len;i++)
{b='0'+b;}
}
else if(a.size()<b.size())
{len=b.size()-a.size();
for(int i=0;i<len;i++)
{a='0'+a;}
}}
int main()
{string s;string tmp="";
while(cin>>s)
{if(s=="0"){break;}
AddZero(s,tmp);int carry=0;
for(int i=s.size()-1;i>=0;i--)
{ int t=tmp[i]-'0'+s[i]-'0'+carry;
if(t>9){tmp[i]='0'+t-10;carry=1;}
else{tmp[i]='0'+t;carry=0;}
}
if(carry==1){tmp='1'+tmp;}//最高位可能溢出
}
cout<<tmp<<endl;
return 0;
}