c大数加法问题,求救!

山猪儿烦不得 2007-10-18 01:10:40
老板要求你和 Tom 一起编写一个可以进行大数(不超过500位数字)四则运算的计算器。很显然,这样的大数已经无法用 C 语言中的常规变量直接表示,而你们必须要实现高精度计算的算法。

考虑到加法是各种运算的基础,你们决定从加法开始写起。你和 Tom 进行了分工,他负责编写程序的主函数,而你要编写 add 和 revnum 两个子函数。你们约定了函数的接口如下:

void add(char a[], char b[], char r[]);其中,a 表示被加数、b 表示 加数,而 r 中应当存放 a 和 b 两个函数的和。这三个数字都是使用字符数组来表示的,该大数的各位数字的字符由低至高存储在数组中。譬如被加数 a 为 6894 时,
a[0] = '4', a[1] = '9', a[2] = '8', a[3] = '6', a[4...500] = '\0'为了将数字由高位在前的存储方式转变为低位在前的存储方式,方便模拟加法的计算,Tom 请你再编写一个 revnum 函数,该函数的接口如下:

void revnum(char *num);这个函数应当可以把字符数组 num 中存储的字符颠倒,即把 "1234" 转换成 "4321",参数 num 是一个以 '\0' 结尾的字符串。

输入
该程序的输入包括 n (n >= 0) 对大数,每对大数一行,两个大数之间以空白符分割。

输出
针对每一对大数,输出运算结果。

注意
程序的主函数Tom已经编写好,你只需提交编写好的两个子函数即可。
问题补充:预设代码如下

/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */

#include <stdio.h>
#include <string.h>

void revnum(char *num);
void add(char a[], char b[], char c[]);

int main()
{
char a[501], b[501], r[501];
int n;

for(;;) {
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(r, 0, sizeof(r));

n = scanf("%s %s\n", a, b);
if (n != 2) break;

revnum(a);
revnum(b);
add(a, b, r);
revnum(r);

printf("%s\n", r);
}

return 0;
}

/* PRESET CODE END - NEVER TOUCH CODE ABOVE*/
...全文
989 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zwb8848happy 2011-12-13
  • 打赏
  • 举报
回复
#include <iostream>
#include <string>
#include <cstring>
using namespace std;

int main()
{
string a,b;
int ans[10];
while (1)
{
int index=0,trans=0;
memset(ans,0,sizeof(ans));

cin>>a;
cin>>b;
int i,j;
for (i=a.length()-1,j=b.length()-1;i>=0&&j>=0;i--,j--)
{
ans[index]=a[i]-48+b[j]-48+trans;
trans=ans[index]/10;
ans[index]%=10;
index++;
}
while (i>=0)
{
ans[index]+=a[i]-48+trans;
trans=ans[index]/10;
ans[index]%=10;
index++;
i--;
}
while (j>=0)
{
ans[index]+=b[j]-48+trans;
trans=ans[index]/10;
ans[index]%=10;
index++;
j--;
}

if (trans>0)
{
ans[index++]=trans;
}
cout<<"The answer is :"<<endl;

for (int i=index-1;i>=0;i--)
{

cout<<ans[i];
}
cout<<endl<<endl;
}
return 0;

}

这是我写的,看看
sily13 2010-08-10
  • 打赏
  • 举报
回复
for(i1=0;i1 <=(m/2);i1++)
{
x=*(num+i1);
*(num+i1)=*(num+m-i1-1);
*(num+m-i1-1)=x;
}

for(i1=0;i1 <(m/2);i1++)不要等号,要不偶数个字符时中间2个是不会倒序的。
山猪儿烦不得 2007-10-29
  • 打赏
  • 举报
回复
谢谢谢谢!!!
0黄瓜0 2007-10-18
  • 打赏
  • 举报
回复

/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */
#include <stdio.h >
#include <string.h >

void revnum(char *num);
void add(char a[], char b[], char c[]);

int main()
{
char a[501], b[501], r[501];
int n;

for(;;) {
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(r, 0, sizeof(r));

n = scanf("%s %s", a, b);
if (n != 2) break;

revnum(a);
revnum(b);
add(a, b, r);
revnum(r);

printf("%s\n", r);
}

return 0;
}

/* PRESET CODE END - NEVER TOUCH CODE ABOVE*/

void revnum(char *num)/*字符串反序,应该没有问题*/
{
int m,i1;
char x;

m=strlen(num); //12345 123456

//for(i1=0;i1 <=m/2;i1++)
for(i1=0;i1 <m/2;i1++)
{
x=*(num+i1);
*(num+i1)=*(num+m-i1-1);
*(num+m-i1-1)=x;
}
}

void add(char a[501], char b[501], char c[501])/*加法计算器*/
{
/*static*/ int i,alen,blen,len;//,a[501],b[501],c[501];/*不用静态变量*/

if(strcmp(a,"0")==0)/*先计算加数有0的情况*/
{
strcpy(c,b);
return;
}
if(strcmp(b,"0")==0)
{
strcpy(c,a);
return;
}


alen=strlen(a);
blen=strlen(b);
for(i=0;a[i]!= '\0';i++)/*数值化*/
{
a[i]=a[i]-48;
}
for(i=0;b[i]!= '\0';i++)
{
b[i]=b[i]-48;
}


if(strcmp(a,"0")!=0 && strcmp(b,"0")!=0)/*前面两种情况除了就是这种情况,所以这个判断多余*/
{
if(alen >blen)
{
len=alen;
}
else
{
len=blen;
}/*确定和的最高位数便是len*/

for( i=0;i<len+2;i++)//给结果数组清下0
{
c[i]=0;
}
for(i=0;i <len;i++)
{
c[i]+=a[i]+b[i];/*加法运算*/
if(c[i] >=10)/*进位处理*/
{
c[i+1]++;
c[i]=c[i]%10;
}
}

if(c[len]==0)/*判断最高位是否有数值*/
{
c[len]= '\0';
}
else
{
c[len]= '1';
c[len+1]= '\0';
}
for(i=0;i <len;i++)/*字符化*/
{
c[i]=c[i]+48;
}
}
}
0黄瓜0 2007-10-18
  • 打赏
  • 举报
回复
n = scanf("%s %s\n", a, b);
=========================
scanf,爱出问题.改为n = scanf("%s %s", a, b);


另外,add中使用static变量,使上一次的结果保留到下次.所以只有第一次计算的结果是对的.
山猪儿烦不得 2007-10-18
  • 打赏
  • 举报
回复
我写的如下

void revnum(char *num)/*字符串反序,应该没有问题*/
{
int m,i1;
char x;

m=strlen(num);
for(i1=0;i1<=(m/2);i1++)
{
x=*(num+i1);
*(num+i1)=*(num+m-i1-1);
*(num+m-i1-1)=x;
}
}

void add(char a[501], char b[501], char c[501])/*加法计算器*/
{
static int i,j,x,y,l,a1[501],a2[501],a3[501];/*静态变量初值为0*/

x=strlen(a);
y=strlen(b);
for(i=0;a[i]!='\0';i++)/*数值化*/
{
a1[i]=a[i]-48;
}
for(i=0;b[i]!='\0';i++)
{
a2[i]=b[i]-48;
}
if(strcmp(a,"0")==0)/*先计算加数有0的情况*/
{
strcpy(c,b);
}
if(strcmp(b,"0")==0)
{
strcpy(c,a);
}
if(strcmp(a,"0")!=0&&strcmp(b,"0")!=0)/*再判断没有0的情况*/
{
if(x>y)
{
l=x;
}
else
{
l=y;
}/*确定和的最高位数便是l*/
for(i=0;i<l;i++)
{
a3[i]+=a1[i]+a2[i];/*加法运算*/
if(a3[i]>=10)/*进位处理*/
{
a3[i+1]++;
a3[i]=a3[i]%10;
}
}
if(a3[l]==0)/*判断最高位是否有数值*/
{
c[l]='\0';
}
else
{
c[l]='1';
c[l+1]='\0';
}
for(i=0;i<l;i++)/*字符化*/
{
c[i]=a3[i]+48;
}
}
}
/*问题是输入时好像有问题,正常输入后不会出结果,再输入某个数字才会继续,且结果也不太对*/

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧