输入几个相当大的数字,当输入为0的时候就将这几个大的数字的和输出。
1、这几个数字是非常大的,什么long int之类的是绝对装不下的
2、其次这几个数字的长度是一样的
麻烦高手写一个。我写出来的可以通过DEV-C++,但是在OJ上面不能通过。谁写的过了悬赏分不是问题。
输入几个相当大的数字,当输入为0的时候就将这几个大的数字的和输出。
1、这几个数字是非常大的,什么long int之类的是绝对装不下的
2、其次这几个数字的长度是一样的
麻烦高手写一个。我写出来的可以通过DEV-C++,但是在OJ上面不能通过。谁写的过了悬赏分不是问题。
楼主为何非要考虑整型呢……用char不型照样可以输出数字,把char大小设成1000,这样就能存上1000位的数了
#include<stdio.h>
int main()
{
int i = 0;
char word,a[1000];
printf("请输入某数(遇到0退出):\n");
scanf("%c",&word);
while(word != '0')
{
a[i] = word;
++i;
scanf("%c",&word);
}
a[i] = '\0';
printf("%s\n",a);
return 0;
}
用一个vector<char>储存一行数字
再用vector< vector<char> >储存所有数字
#include <iostream> #include <vector> #include <cassert> using namespace std; //测试用define宏 #define TEST1 typedef vector<char> NUM;//数字的类型,每个数字都一个NUM //检测是否遇到了0; bool MeetZero(istream &is) { if( '0'== is.peek() ) return 1; else return 0; } //从输入流is中读出一个数,作为char型的vector存到num中,此时num没有经过反序 int ReadNum(istream &is,NUM &num) { char tem; while( (tem=is.peek())!=' ' && tem!='\n' && tem!='\t') num.push_back(is.get()); while( (tem=is.peek())==' ' || tem=='\n' || tem=='\t') is.get(); return 1; } int WriteNum(ostream &os,const NUM &num) { for(int i=num.size()-1,k=0;i>=k;i--) os << num[i]; return 1; } //在数字num的第weishu位上进位,进位制为jinwei,要求jinwei<10,但weishu可以超过num最大位 int JinWei(NUM &num,int weishu,int jinwei) { assert(jinwei<10); if( weishu>(int)num.size()) { for(int i=num.size();i<weishu-1;i++)//多出来的空位上补0 num.push_back('0'); num.push_back( char(jinwei+0x30) );//在num[weishu-1]上写上jinwei } else { num[weishu-1]+=jinwei; if(num[weishu-1]>0x39) { num[weishu-1]-=10; JinWei(num,weishu+1,1); } } return 1; }
int main(int argc,char *argv[]) { vector<NUM> nums; while(!MeetZero(cin)) { NUM num1; ReadNum(cin,num1); NUM num2(num1.size()); for(int i=0,k=num1.size();i<k;i++) num2[i]=num1[k-i-1];
nums.push_back(num2); } //测试数字是否正确读入 #ifdef TEST for(int i=0,k=nums.size();i<k;i++) { WriteNum(cout,nums[i]); cout << endl; } #endif //获取所有数字的最长位数 unsigned int max_lenth=0; for(int i=0,k=nums.size();i<k;i++) { if(max_lenth<nums[i].size()) max_lenth=nums[i].size(); } //新建一个数字,作为它们的和 NUM sum(max_lenth,'0'); for(unsigned int i=0;i<max_lenth;i++)//代表当前加到第i位 { //小循环里是第i位上数字的相加 for(unsigned int ii=0,ik=nums.size();ii<ik;ii++)//代表当前加上第ii个数字 { if(nums[ii].size()>i ) //第ii个数字上有第i位才相加,否则跳出循环加下一个数字 { sum[i]+=nums[ii][i]-0x30; if(sum[i]>0x39)//产生进位 { sum[i]-=10;//两个一位数字相加,若进位,其进位一定是1 JinWei(sum,i+2,1);//在sum[i+1]上进位 } }
} } #ifdef TEST //测试 99721 在第3位进3的结果 JinWei(nums[0],3,3); WriteNum(cout,nums[0]); #endif WriteNum(cout,sum); return 0; }
c++代码 希望满足lz的要求:
##include <iostream> #include <cmath> #include <cstring> using namespace std;
void main() { cout << "输入大数字的个数: "; int n; cin >> n;
cout << "输入大数字的位数: "; int length; cin >> length;
cout << "enter the number: "; char **s = new char*[n]; for (int i = 0; i < n; i++) { s[i] = new char[length]; cin >> s[i];
}
int *result = new int[length + 1]; int c = 0; int b = 0; for (int k = length - 1; k >= 0; k--) { int sum = 0; for (int j = 0; j < n; j++) { sum += (int)(s[j][k]) - 48; } sum += c; c = sum / 10; result[length - k - 1] = (sum - c * 10); } result[length] = c;
cout << "cin>> (print'0' to cout: )"; int d; cin >> d; if (d == 0) { cout << "the result is "; if (result[length] != 0) cout << result[length];
for (int m = length - 1; m >= 0; m--) cout << result[m];
cout << endl; } else exit(0); }