主题:用C++来设计超大数的精确运算,在类内来实现
sdsal1228
[专家分:0] 发布于 2004-10-20 12:44:00
用C++来设计超大数的精确运算,在类内来实现,
实现+,-,*最好还有/.
+,-要求有小数,没有也可以.
如果哪为仁兄知道或者有程序请帮帮忙.
谢谢了!!! [em10]
回复列表 (共7个回复)
沙发
ruchong [专家分:380] 发布于 2004-10-20 18:54:00
超大是多大,
板凳
sdsal1228 [专家分:0] 发布于 2004-10-21 09:41:00
越大越好
希望哪位朋友帮帮忙!!!帮我度过难关!
老师说最好能达到+.-20亿,不能达到也没有关系,只要大家能帮我的忙我在这里就非常感谢了,
谢谢各位朋友了!
3 楼
LangHua888 [专家分:600] 发布于 2004-10-21 15:42:00
32位加法:
#include "string.h"
#include "mem.h"
#include "stdio.h"
main()
{
char a[33],b[33],result[34],Temp[33];
int alen,blen,len,flag=0,t;
int i;
printf("Please input the first number:");
gets(a);
a[strlen(a)]=0;
alen=strlen(a);
printf("Please input the second number:");
gets(b);
b[strlen(b)]=0;
blen=strlen(b);
memset(Temp,0,33);
strcpy(Temp,a);
for (i=0;i<alen;i++)
{
a[i]=Temp[alen-i-1];
}
memset(Temp,0,33);
strcpy(Temp,b);
for (i=0;i<blen;i++)
{
b[i]=Temp[blen-i-1];
}
len=alen>blen? alen:blen;
if (alen>blen)
{
memset(b+blen,'0',alen-blen);
}
else
{
memset(a+alen,'0',blen-alen);
}
memset(result,0,strlen(result));
for (i=0;i<len;i++)
{
t=a[i]+b[i]-'0'-'0'+flag;
if (t<10)
flag=0;
else
{
flag=t%10;
flag=(t-flag)%10;
t=t%10;
}
result[i]=t+'0';
}
if (flag) result[i++]=flag;
memset(Temp,0,34);
strcpy(Temp,result);
for (i=0;i<strlen(result);i++)
{
result[i]=Temp[strlen(result)-i-1];
}
i=0;
while(result[i]=='0')
{
i++;
}
printf("%s",&result[i]);
}
4 楼
LangHua888 [专家分:600] 发布于 2004-10-21 15:44:00
32位加法:
#include "string.h"
#include "mem.h"
#include "stdio.h"
main()
{
char a[33],b[33],result[34],Temp[33];
int alen,blen,len,flag=0,t;
int i;
printf("Please input the first number:");
gets(a);
a[strlen(a)]=0;
alen=strlen(a);
printf("Please input the second number:");
gets(b);
b[strlen(b)]=0;
blen=strlen(b);
memset(Temp,0,33);
strcpy(Temp,a);
for (i=0;i<alen;i++)
{
a[i]=Temp[alen-i-1];
}
memset(Temp,0,33);
strcpy(Temp,b);
for (i=0;i<blen;i++)
{
b[i]=Temp[blen-i-1];
}
len=alen>blen? alen:blen;
if (alen>blen)
{
memset(b+blen,'0',alen-blen);
}
else
{
memset(a+alen,'0',blen-alen);
}
memset(result,0,strlen(result));
for (i=0;i<len;i++)
{
t=a[i]+b[i]-'0'-'0'+flag;
if (t<10)
flag=0;
else
{
flag=t%10;
flag=(t-flag)%10;
t=t%10;
}
result[i]=t+'0';
}
if (flag) result[i++]=flag;
memset(Temp,0,34);
strcpy(Temp,result);
for (i=0;i<strlen(result);i++)
{
result[i]=Temp[strlen(result)-i-1];
}
i=0;
while(result[i]=='0')
{
i++;
}
printf("%s",&result[i]);
}
5 楼
zzd183816 [专家分:80] 发布于 2005-05-06 15:48:00
小弟菜蔬只编了个任意位的加法
只要修改数组长度就可以了哦
时间不是问题
但是我在ACM上去通不过,小弟求跟好的算法阿,最好有乘法和除法
#include <string.h>
#include <stdio.h>
#include <time.h>
void reverse(char d[],int len)
{
char t,*p1,*p2;
for(p1=d,p2=&d[len-1];p1<p2;p1++,p2--)
{
t=*p1;
*p1=*p2;
*p2=t;
}
}
main()
{
char s1[1000],s2[1000],s3[1000];int lenmax,len1,len2;int t=0,i,j;time_t time1,time2;
while(1)
{
scanf("%s",&s1);
scanf("%s",&s2);
len1=strlen(s1);
len2=strlen(s2);
memset(s3,0,sizeof(s3));
for(i=0;i<len1;i++)
s1[i]=s1[i]-'0';
for(i=0;i<len2;i++)
s2[i]=s2[i]-'0';
if(len1>len2)
{for(i=len2;i<len1;i++)
s2[i]=0;
}
else
{for(i=len1;i<len2;i++)
s1[i]=0;
}
reverse(s1,len1);
reverse(s2,len2);
lenmax=(len1>len2)?len1:len2;
j=lenmax;
time1=time(NULL);
for(i=0;i<j;i++)
{
s3[i]=s1[i]+s2[i]+t;
t=s3[i]/10;
if(s3[i]>=10&&i!=(lenmax-1))
s3[i]=s3[i]%10;
else
{if(i==(lenmax-1)&&s3[i]>=10)
{
j=lenmax+1;
s3[lenmax]=(s3[i]/10);
}
else
j=lenmax;
}
}
reverse(s3,j);
for(i=0;i<j;i++)
printf("%d",s3[i]);
printf("\n");
time2=time(NULL);
printf("the operation took %f!\n",difftime(time2,time1));
}
return 0;
}
6 楼
liang0200551 [专家分:40] 发布于 2005-05-06 17:25:00
2楼的 你的程序我大致懂了
我问一下:
为什么 要
flag=t%10;
flag=(t-flag)%10;
t=t%10;
而不是 flag=t%10;
t=t-flag*10;
小弟愚昧,还请多多指教!!
7 楼
liang0200551 [专家分:40] 发布于 2005-05-06 17:31:00
还有 为什么要把字符串a倒过来呢??
我来回复