C++实现超长正整数的加法,跪求修改
#include
#include
#include
int main(int argc, char *argv[])
{int a[100],b[100],c[100],i,j=0,m,n,k;
char a1[100],b1[100];
scanf("%s %s",&a1,&b1);
m=strlen(a1);
n=strlen(b1);
if(m<n) k=n;
else k=m;
for(i=0;a1[i]!='\0';i++)
{ a[m-1]=a1[i]-48;
m--;
}
for(i=0;b1[i]!='\0';i++)
{ b[n-1]=b1[i]-48;
n--;
}
for(i=0;i<k;i++)
{ c[i]=a[i]+b[i]+j;
j=0;
if(c[i]>=10) /* 这里是大于等于 */
{ c[i]=c[i]%10;
j=1;
}
}
if (j==1) /* 如果最高位相加超过10需要进位 */
c[k++] = 1;
for(i=k-1;i>=0;i--)
printf("%d",c[i]);
printf("
");
system("PAUSE");
return 0;
}
除了数据格式没弄外,不清楚你所说的数据格式指的是什么,详细代码看附件,代码可是一句一句敲上去的啊,累啊,呵呵,希望你成功!
我觉得大整数不应该用double做为输入,应该用字符串,另外,为什么int a[N]里一个int只存放一位数字哪?这个感觉也不太好,我觉得应该可以放更大的数字。我把代码简单的调整了下:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
const int M = 4;
const int N = 99;
void Sort(int a[], string z)
{
int i = 0;
int zlen = 0;
while (z.size() > 0) {
zlen = z.size();
if (zlen <= 4) {
stringstream ss(z);
ss>>a[i++];
z = "";
} else {
string tmp = z.substr(zlen-M);
stringstream ss(tmp);
ss>>a[i++];
z = z.substr(0, zlen - M);
}
}
}
int main()
{
string x, y;
cin >> x >>y;
int a[N] = {0}, b[N] = {0}, c[N] = {0};
int carry = 0;
int tmp = 0;
int num = 0;
Sort(a, x);
Sort(b, y);
for (int i = 0; i < N; ++i) {
tmp = a[i] + b[i];
c[i] = (tmp + carry)%10000;
carry = tmp/10000;
if (c[i] > 0) num = i;
}
for (int i = num; i >= 0; --i) {
cout << c[i];
}
cout<<endl;
return 0;
}
cout<<"输入长度"<<endl;
char len[12];
memset(len , 0 , 12);
cin>>len;
int ilen = atoi(len);
char* buff1 = new char[ilen + 1];
char* buff2 = new char[ilen + 1];
memset(buff1 , 0 , ilen + 1);
memset(buff2 , 0 , ilen + 1);
cout<<"输入数字1"<<endl;
cin>>buff1;
cout<<"输入数字2"<<endl;
cin>>buff2;
list<int> temp1;
list<int> temp2;
for (int i = 0 ; i < ilen ; ++i)
{
//反序存放
if (0 != buff1[i])
{
char data = buff1[i];
temp1.push_front(atoi(&data));
}
if (0 != buff2[i])
{
char data = buff2[i];
temp2.push_front(atoi(&data));
}
}
list<char> temp3;
int ten = 0;
char flag = 1;
flag |= 1 << 1;
while(true)
{
int arg1 = 0;
list<int>::iterator ite1 = temp1.begin();
if (ite1 == temp1.end())
{
flag &= 1;
}
else
{
arg1 = *ite1;
temp1.erase(ite1);
}
int arg2 = 0;
list<int>::iterator ite2 = temp2.begin();
if (ite2 == temp2.end())
{
flag &= 1 << 1;
}
else
{
arg2 = *ite2;
temp2.erase(ite2);
}
if (0 == flag)
{
break;
}
int rt = arg1 + arg2 + ten;
ten = 0;
int one = rt % 10;
ten = rt / 10;
char crt = 0;
itoa(one , &crt , 10);
temp3.push_front(crt);
crt = 0;
}
if (0 != ten)
{
char crt = 0;
itoa(ten , &crt , 10);
temp3.push_front(crt);
crt = 0;
}
char* outputbuff = new char[temp3.size() + 1];
memset(outputbuff , 0 , temp3.size() + 1);
int index = 0;
for (list<char>::iterator ite = temp3.begin();
ite != temp3.end();
++ite)
{
outputbuff[index] = *ite;
++index;
}
cout<<"两数相加"<<outputbuff<<endl;
system("Pause");
直接写在main函数里,退出的时候有错,我没处理,但是逻辑就是这样。要用list。
我简单的测试了下没问题。
思路就是用两个list保存每个位置上的数量,然后就和我们小学学数学那样从最后一位一个一个的向前加,用一个数字来保存进位信息,每次相加就加上这个进位信息,结果放在第三个list里。
首先大整数我觉得不能用double,因为可能超出,所以存只能一个字符一个字符存,然后就是进位的问题,我重写了一个,你可以看一下,N就是你给的N,每一个整数以#结尾,表示输入完了
char a[N]={'0'};
char b[N]={'0'};
int c[N]={0};
int ia,ib,ic;
int carry=0; //进位标志
for(ia=1;a[ia-1]!='#';++ia)
{
cin>>a[ia];
}
for(ib=1;b[ib-1]!='#';++ib)
{
cin>>b[ib];
}
ia=ia-2;
ib=ib-2;
for(ic=0;ia>=0&&ib>=0;++ic,--ia,--ib)
{
if(carry==1)
{
c[ic]=(int)(a[ia]-'0')+(int)(b[ib]-'0')+1;
carry=0;
}
else
{
c[ic]=(int)(a[ia]-'0')+(int)(b[ib]-'0');
}
if(c[ic]>=10)
{
c[ic]=c[ic]-10;
carry=1;
}
}
for(int i=ic-1;i>=0;--i)
{
cout<<c[i];
}
cout<<endl;
system("pause");
return 0;
大数运算
两个99位的大数不能用double临时存储,只能用数组来存。
要考虑进位问题,且需逆序输出
两个超长正整数相加(C语言)
p1--;p2--;pz++;} for(i=0;i<lenmax-lenmin;i++){ pz=*p1;if (pz>z && *(pz-1)>='0'+10){ (pz-1)-=10;pz+=1;} pz++;p1--;} pz--;if (*pz>='0'+10){ (pz++)-=10;pz='1';} for(p1=z;p1<pz;p1++,pz--){ t=*p1;*p1=*pz;*pz=t;} return z;...
...题目是:请设计一个算法完成两个超长正整数的加法。谁会的帮帮忙...
我记得长整数指的是long型、超过long还有long long、以及__int64 不过显然题目不是这个意思。我想LZ对加法的竖式应该很熟悉、高精度就是用的竖式的原理。我只给你算法、不提供代码、自己写代码才是最好的。首先、输入的时候就不能直接scanf整形了、那就以字符串的形式输入--我想LZ你会的。然后建立四...
看图编写VB超长正整数的加法
Const HUNTHOU = 10000Private Type node data As Integer next As IntegerEnd Type ' \/\/定义链表结构Dim d(100) As node, pd% 'vb没有指针,用数组模拟Sub main() Dim s1%, s2%, s% Debug.Print "Enter S1= " s1 = inputint() ' \/\/输入被加数 Debug.Print ...
怎么用数组完成两个超长的正整数乘法
\/\/例如:100011 1011101\/\/程序中先输入被乘数和乘数的位数,然后动态申请空间,以字符的形式来处理长整数的每一位。\/\/模拟计算机乘法的实现,将整数乘法转换为整数加法来实现。#include <stdio.h>\/\/将数组元素左移x位,低位补0 void leftmove(char c[],int len,int x){ if(x==0)return ;else ...