当前位置: 代码迷 >> C语言 >> 任意精度的加减乘除
  详细解决方案

任意精度的加减乘除

热度:657   发布时间:2006-05-06 20:22:00.0
任意精度的加减乘除

那天有人出的题目,我回去写了,精度可以任意.这里的除法用到了乘和减,但是又点问题,我过几天再贴.还有先申明,我得英文不好.还有这个程序写的不太好有待完善的地方.
include <stdio.h>
#include <stdlib.h>

#define LONG (100) //加法或乘法结果的精度


void Make(char *p);
void GetString(char *p);
void Add(int *sum,char *number1,char *number2);//加法
void ChenFa(int *sum,char *number1,char *number2);//乘法
void JianFa(int *sum,char *number1,char *number2);//减法
int BiJiao(char *number1,char *number2);//比较两个字符串数字的大小

int p,p1,p2;


void main()
{
char string1[LONG];
char string2[LONG];
int temp;
int sum[2*LONG-1],sum1[LONG-1],sum2[LONG-1],sum3[LONG-1];

GetString(string1);
GetString(string2);

Make(string1);
Make(string2);

Add(sum2,string1,string2);
JianFa(sum1,string1,string2);
ChenFa(sum,string1,string2);

for(temp=0;temp<LONG-1;temp++)
{
if(sum[temp]!=0){
p=temp;
break;
}
}

for(temp=0;temp<LONG-1;temp++)
{
if(sum1[temp]!=0){
p1=temp;
break;
}
}

for(temp=0;temp<LONG-1;temp++)
{
if(sum2[temp]!=0){
p2=temp;
break;
}
}

JianFa(sum1,string1,string2);
ChenFa(sum,string1,string2);
Add(sum2,string1,string2);

printf("The JianFa result is:");
for(temp=p1;temp<LONG-1;temp++)
{
printf("%d",sum1[temp]);
}
printf("\n");

printf("The ChenFa result is:");
for(temp=p;temp<LONG-1;temp++)
{
printf("%d",sum[temp]);
}
printf("\n");

printf("The Add result is:");
for(temp=p2;temp<LONG-1;temp++)
{
printf("%d",sum2[temp]);
}
printf("\n");

}

void Make(char *p){//对字符串重新排列
int i,j;
for(i=0;p[i]>47;i++){
}
for(j=LONG-1;j>=0;j--,i--){
if(i<0){
p[j]=48;
}
else
p[j]=p[i];
}
}

void GetString(char *p){//输入字符串
printf("please input number2:");
for(int temp=0;temp<LONG-1;temp++){
scanf("%c",&p[temp]);
if(p[temp]<=47){
p[temp]=0;
break;
}
}
}

void Add(int *sum,char *number1,char *number2){//加法
int i[LONG-1],j[LONG-1];
for(int temp=0;temp<LONG-1;temp++){
sum[temp]=0;
}
for(temp=LONG-2;temp>=0;temp--){
i[temp]=number1[temp]-48;
j[temp]=number2[temp]-48;
sum[temp]=sum[temp]+i[temp]+j[temp];
sum[temp-1]=sum[temp-1]+(sum[temp])/10;
sum[temp]=(sum[temp])%10;
for(int m=0;m<temp+1;m++)
{
sum[temp-2-m]=sum[temp-2-m]+(sum[temp-1-m])/10;
sum[temp-1-m]=sum[temp-1-m]%10;
}
}
}

void JianFa(int *sum,char *number1,char *number2){
int i[LONG-1],j[LONG-1];
int temp;
for(temp=LONG-2;temp>=0;temp--){
if(BiJiao(number1,number2)){
i[temp]=i[temp]+number1[temp]-48;
j[temp]=j[temp]+number2[temp]-48;
}
else{
j[temp]=j[temp]+number1[temp]-48;
i[temp]=i[temp]+number2[temp]-48;
}

if(i[temp]-j[temp]<0){
i[temp]=i[temp]+10;
i[temp-1]=i[temp-1]-1;
}
sum[temp]=(i[temp]-j[temp]);
if(sum[temp-1]==0) break;
}
if(BiJiao(number1,number2)==0) sum[p1]=-sum[p1];
}

int BiJiao(char *number1,char *number2){
int i[LONG-1],j[LONG-1];
for(int temp=0;temp<LONG-1;temp++){
i[temp]=i[temp]+number1[temp]-48;
j[temp]=j[temp]+number2[temp]-48;
if(i[temp]>j[temp]){
return 1;
}
else if(i[temp]<j[temp]){
return 0;
}
}
}

void ChenFa(int *sum,char *number1,char *number2){//乘法
int i[LONG-1],j[LONG-1];
int m;
for(int s=0;s<2*LONG-1;s++){
sum[s]=0;
}
for(int temp=0;temp<LONG-1;temp++){
for(int temp1=0;temp1<LONG-1;temp1++){
if((number1[temp]>47)&&(number2[temp1]>47)&&(number1[temp]<59)&&(number2[temp1]<59)){
i[temp]=number1[temp]-48;
j[temp1]=number2[temp1]-48;
sum[temp1+temp-LONG+2]=sum[temp1+temp-LONG+2]+(i[temp]*j[temp1])%10;
sum[temp1+temp-LONG+1]=sum[temp1+temp-LONG+1]+(i[temp]*j[temp1])/10+(sum[temp1+temp-LONG+2])/10;
sum[temp1+temp-LONG+2]=sum[temp1+temp-LONG+2]%10;
}
}
for(m=0;m<temp+1;m++)
{
sum[temp1+temp-LONG+1-m]=sum[temp1+temp-LONG+1-m]+(sum[temp1+temp-LONG+2-m])/10;
sum[temp1+temp-LONG+2-m]=sum[temp1+temp-LONG+2-m]%10;
}
}
}


搜索更多相关的解决方案: 精度  char  void  加减乘除  int  

----------------解决方案--------------------------------------------------------
只要10进制12位有效数字,
但方法一定要简洁巧妙
――出题人
----------------解决方案--------------------------------------------------------
那你觉得用什么方法,大家可以讨论一下,我对数值方面没有很多的研究,我觉得我的算法比较容易理解,兄弟不知道你是怎么写的,加我的QQ:274839490,一起讨论一下.还有我觉得对于任意精度的加减乘除我觉得还是有一点实际意义的.
----------------解决方案--------------------------------------------------------
利用double,因为这家伙能提供15~16个有效数字。例如
typedef double I12;
I12 a,b,c;
scanf("%lf",&a);
scanf("%lf",&b);
//1。加法。
c=a+b;
printf("%.0lf+%.0lf=%.0lf\n",a,b,c);
//2。乘法。
c=a*b;
if(fabs(c)>=1e13)
{printf("a*b too large...");exit(1);}
printf("%.0lf*%.0lf=%.0lf\n",a,b,c);


----------------解决方案--------------------------------------------------------