| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 874 人关注过本帖
标题:任意精度的加减乘除
只看楼主 加入收藏
andyss
Rank: 1
等 级:新手上路
帖 子:189
专家分:0
注 册:2006-4-8
收藏
 问题点数:0 回复次数:3 
任意精度的加减乘除

那天有人出的题目,我回去写了,精度可以任意.这里的除法用到了乘和减,但是又点问题,我过几天再贴.还有先申明,我得英文不好.还有这个程序写的不太好有待完善的地方.
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 
2006-05-06 20:22
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
只要10进制12位有效数字,
但方法一定要简洁巧妙
——出题人

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-06 20:42
andyss
Rank: 1
等 级:新手上路
帖 子:189
专家分:0
注 册:2006-4-8
收藏
得分:0 
那你觉得用什么方法,大家可以讨论一下,我对数值方面没有很多的研究,我觉得我的算法比较容易理解,兄弟不知道你是怎么写的,加我的QQ:274839490,一起讨论一下.还有我觉得对于任意精度的加减乘除我觉得还是有一点实际意义的.

幽幽黄桷兰----建四狼
2006-05-06 20:47
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
利用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);


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-06 20:56
快速回复:任意精度的加减乘除
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032891 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved