注册 登录
编程论坛 C++教室

一个老生常谈的程序,求解

jianweichief 发布于 2007-07-19 11:23, 553 次点击
实现:7896541236995233+7889255458625215,也就是大数相加,一直没整明白,望赐教。

谢谢!
5 回复
#2
aipb20072007-07-19 11:42
光算你这个式子不考虑其他,直接用整型数组吧。
就是满10进1,用循环一位一位的加。
当然,可可以分割下数组,每几位相加进位(注意越界)。

#3
Jackzdong2007-07-20 10:14

#include <iostream>
using namespace std;
#define MAX 10000 //可以计算10000位
void num_read(int *a) //逆向读取数据 a[0]为低位
{
int len,i;
char temp[MAX];
scanf("%s",&temp);
len=strlen(temp);
for(i=len;i>=1;i--)
a[i]=temp[len-i]-'0';
a[0]=len;
}

void bigplus(int a[],int b[],int c[]) //大整数加法
{
int i,len;
len=(a[0]>b[0]?a[0]:b[0]);
for(i=0;i<=len+1;i++) //将数组清0
c[i]=0;
int len1=(a[0]<b[0]?a[0]:b[0]);
for (i=1;i<=len1;i++) //计算每一位的值
{
c[i]+=(a[i]+b[i]);
while (c[i]>=10)
{
c[i]-=10; //大于10的取个位
c[i+1]++; //高位加1
}
}
bool tag = a[0]>b[0];
for(i=len1+1;i<=len;i++)
{
if(tag)
c[i]=a[i];
else
c[i]=b[i];
while (c[i]>=10)
{
c[i]-=10; //大于10的取个位
c[i+1]++; //高位加1
}
}
if (c[i]>0)
len++;
c[0]=len; //c[0]保存结果数组实际长度
for (i=len;i>=1;i--)
{
printf("%d",c[i]);
}
printf("\n");
}
int main()
{
int a[MAX],b[MAX],c[MAX];
num_read(a);
num_read(b);
bigplus(a,b,c);
return 0;
}
ACM上经常遇到的一个函数
前几天刚写的一个, 刚学习
ACM写的不是很好


[此贴子已经被作者于2007-7-20 10:16:48编辑过]

#4
jianweichief2007-07-22 10:01
呵呵,有短一点的没,题目这么麻烦啊,劳驾诸位高手了
#5
jianvsgao2007-07-22 16:40

不是core C++

#6
wingyip2007-07-23 08:45

什么叫 core c++

1