没有合适的资源?快使用搜索试试~ 我知道了~
高精度算法(加减乘除)[参考].pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 109 浏览量
2021-10-12
06:37:00
上传
评论
收藏 20KB PDF 举报
温馨提示
试读
11页
高精度算法(加减乘除)[参考].pdf
资源推荐
资源详情
资源评论
高 精 度 算 法
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <malloc.h>
int an,bn,fa=1,fb=1; /* 把 an,bn,k 设为全局变量 ,an 纪录第一个高精度数组的位
数,bn 纪录第二个高精度数组的位数 ,k 纪录输出结果的位数 */
char b1[250], b2[250]; /* 纪录需要计算的两个高精度数据 */
void input(int a1[],int a2[]) /* 函数 input 为输入函数 ,用来纪录两个待计算的高精度数据 ,
以数组首地址为参数 .以实现返回两个高精度数据 */
{
int i,ai=1,bi=1;
scanf ( "%s%s", b1, b2 ); /* 输入两个高精度数据 */
an = strlen( b1 ); /*an 纪录 b1 的位数 */
bn = strlen( b2 ); /*bn 纪录 b2 的位数 */
if(b1[0]==45) { an--; fa=-1;ai=0;} /* 判断数组的符号 */
if(b2[0]==45) { bn--; fb=-1;bi=0;}
for (i=0; i<an; i++,ai++) {a1[i]=b1[an-ai]-'0'; printf("%d",a1[i]);} /* 把字符形数据 b1 转
为整数形数据 ,同样用数组纪录 */
for (i=0; i<bn; i++,bi++) a2[i]=b2[bn-bi]-'0'; /* 同上 */
return;
}
void addition(int a[],int b[],int q) /* 高精度加法运算 */
{
int i,c[251]={0},k;
if(fa*fb>0||q)
{
if(an>bn) k=an;
else k=bn; /* 用 k 纪录结果的最
小位数 */
for(i=0;i<k;i++)
{
c[i]=a[i]+b[i]+c[i];
c[i+1]=(int)c[i]/10;
c[i]=(int)c[i]%10;
} /* 高精度加法运算过程
*/
if(c[k]) k++; /* 判断最后结果的位数 */
if(fa<0&&q||fa<0) printf("-");
for(i=k-1;i>=0;i--) printf("%d",c[i]); /* 输出结果 */
return;
}
else subtraction(a,b,1);
return;
}
subtraction(int a[],int b[],int q) /* 高精度减法运算 */
{
int i,f=0,c[251]={0},k;
if(fa*fb>0||q)
{
if(an>bn) k=an;
else /* 用 k 纪录结果的最大位数 */
{ k=bn;
for(i=k;a[i]<=b[i]&&i>=0;i--)
if(a[i]<b[i]) f=1; /*f 纪录结果符号 */
}
if(!f) /* 高精度减法运算过程 */
for(i=0;i<k;i++)
{
if(a[i]<b[i])
{ a[i+1]--;
a[i]+=10;
}
c[i]=a[i]-b[i];
}
else /* 当 a<b 时的处理 */
for(i=0;i<k;i++)
{
if(b[i]<a[i])
{ b[i+1]--;
b[i]+=10;
}
c[i]=b[i]-a[i];
}
while(!c[k-1]&&k>1) k--; /* 判断最后结果的位数 */
if(q&&(fa>0&&f||fa<0&&!f)||fa>0&&(fb>0&&!f||f&&!q)) printf("-");
/* 如果 f 为真是输出负号 */
for(i=k-1;i>=0;i--) printf("%d",c[i]);
return;
}
else addition(a,b,1);
}
void multiplication( int a[], int b[]) /* 高精度乘法运算 */
{
int i, j, c[501] = {0},k;
k = an + bn - 1; /* 用 k 纪录结果的最大位数 */
for(i = 0; i < an; i++) /* 高精度乘法运算过程 */
for(j = 0;j < bn; j++)
{
c[i+j] = a[i] * b[j] + c[i+j];
c[i+j+1] = c[i+j] / 10 + c[i+j+1];
c[i+j] = c[i+j] % 10;
}
while(!c[k]) k--; /* 判断最后结果的位数 */
if(fa*fb<0) printf("-");
for(i = k; i >= 0; i--) printf("%d",c[i]); /* 输出结果 */
}
main()
{
int a[250]={0},b[250]={0};
input(a,b);
printf("\n%s+%s=",b1,b2);addition(a,b,0);
printf("\n%s-%s=",b1,b2);subtraction(a,b,0);
printf("\n%s*%s=",b1,b2);multiplication(a,b);
getch();
}
1、 高精度除以低精度;
算法:按照从高位到低位的顺序,逐位相除。在除到第 j 位时,该位在接受了来自第 j+1 位
的余数后与除数相除,如果最高位为零,则商的长度减一。源程序如下:
#include <stdio.h>
#define N 500
main()
{
int a[N] = {0}, c[N] = {0};
int i, k, d, b;
char a1[N];
printf("Input 除数 :");
scanf("%d", &b);
printf("Input 被除数 :");
scanf("%s", a1);
k = strlen(a1);
for(i = 0; i < k; i++) a[i] = a1[k - i - 1] - '0';
剩余10页未读,继续阅读
资源评论
czq131452007
- 粉丝: 2
- 资源: 12万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- CISCN2024-re3-rust-baby(Frida多字节程序插桩爆破)
- soft:磁盘清理工具
- .netcore控制台使用Nssm打包windows服务,加winform管理服务界面
- db-college.sql
- wpf-dragdrop-treeview(WPF较好拖拽效果).7z
- img-1716258776282bf88540b0e387ddd2ea677d02c7f3594ad72383f796d86b02fb7d2ae2543915d.jpg
- 《伦敦共享单车数据分析与代码》
- SKIP-v2.1.1.apk
- IMG20240521103815.jpg
- 松下A4系列伺服参数调试软件
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功