永发信息网

C语言高精度教程

答案:3  悬赏:30  手机版
解决时间 2021-08-11 23:50
求一C语言高精度部分的教程,直接粘可以,链接也可以,谢谢!
最佳答案

高 精 度 算 法
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <malloc.h>
int an,bn,fa=1,fb=1;    
char b1[250], b2[250];    
void input(int a1[],int a2[])   
{
    int i,ai=1,bi=1;
    scanf ( "%s%s", b1, b2 );    
    an = strlen( b1 );    
    bn = strlen( 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]);}    
    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;    
    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;
    }
    return;
}


void 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=bn;
    for(i=k;a[i]<=b[i]&&i>=0;i--)
    if(a[i]<b[i]) f=1;    
    }


    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    
    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("-");    
    for(i=k-1;i>=0;i--) printf("%d",c[i]);
    return;
    }
}


void multiplication( int a[], int b[])    
{
    int i, j, c[501] = {0},k;
    k = an + bn - 1;    
    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);
    getchar();
}



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';
  d = 0;
  for(i = k - 1; i >= 0 ; i--)
  {
    d = d * 10 + a[i];
    c[i] = d / b;
    d = d % b;    
  }  
  while(c[k - 1] == 0 && k > 1)  k--; 
  printf("商=");
  for(i = k - 1; i >= 0; i--)  printf("%d", c[i]);
  printf("\n余数=%d", d);   
}


2、高精度乘以高精度(要求用尽可能少的存储单元);
算法:用数组保存两个高精度数,然后逐位相乘,注意考虑进位和总位数。源程序如下:
#include  <stdio.h>
main()
{
  int  a[240] = {0}, b[240] = {0}, c[480] = {0};
  int  i, j, ka, kb, k;
  char  a1[240], b1[240];
  gets(a1);   
  ka = strlen(a1);
  gets(b1);   
  kb = strlen(b1);
  k = ka + kb;
  for(i = 0; i < ka; i++)  a[i] = a1[ka-i-1] - '0';
  for(i = 0; i < kb; i++)  b[i] = b1[kb-i-1] - '0';
  for(i = 0; i < ka; i++)
    for(j = 0; j < kb; j++)
    {
    c[i + j] = c[i + j] + a[i] * b[j];
    c[i + j +1] = c[i + j +1] + c[i + j]/10;
    c[i + j] = c[i + j] % 10;
    }
  if(!c[k])  k--;
  for(i = k-1; i >= 0; i--)  printf("%d", c[i]);    
}


3、高精度除以高精度(要求用尽可能少的存储单元);
算法:用计算机模拟手算除法,把除法试商转化为连减。
#include  <stdio.h>
#define   N  500
int  bj(int a[], int b[], int k1, int k2)  
{
   int i, t, flag;    
   if(k1 < k2) 
    flag = 0;    
   else if(k1 > k2) 
    flag = 1;    
    else
    {    
    i = k1;
    t = 0;
    while(t == 0 && i > 0)
    {
    if(a[i] > b[i]) {t = 1; flag = 1;}
    else if(a[i] == b[i])  i--;
    else  {t = 1; flag = 0;}    
    }
    if(i == 0 && t == 0)  flag = 2;    
    }
  return flag;    
}
int  jf(int a[], int b[], int k1, int k2)    
{
  int  i, k, d[N];
  for(i = 0; i < k2; i++)  d[i] = b[i];    
  for(i = k2; i < N; i++)  d[i] = 0;    
  k = k1 - k2 - 1;    
  if(k < 0)  k = 0;
  if(k > 0)
  {
    for(i = k2 - 1; i >= 0; i--)  d[i + k] = d[i]; 
    for(i = 0; i < k; i++)  d[i] = 0;    
  } 
  for(i = 0; i < k1; i++)
  {
    if(a[i] >= d[i])  a[i] -= d[i];
    else
    {
    a[i + 1] = a[i + 1] - 1;
    a[i] = 10 + a[i] - d[i]; 
    }    
  }  
  return k;
}
main()
{
  int  a[N] = {0}, b[N] = {0}, c[N] = {0}, d[N] = {0};
  int  i, ka, kb, m, t, t1, t2, k, x, kd, kk;
  char  a1[N], b1[N]; 
  printf("Input 被除数:");
  scanf("%s", a1);
  ka = strlen(a1);
  for(i = 0; i < ka; i++)  a[i] = a1[ka - i -1] - '0';
  printf("Input 除数:");
  scanf("%s", b1);
  kb = strlen(b1);
  for(i = 0; i < kb; i++)  b[i] = b1[kb - i -1] - '0';
  kd = ka;   
  t2 = bj(a, b, ka, kb);
  m = 0;
  do
  {
    while(a[ka - 1] == 0)  ka--;
    t = bj(a, b, ka, kb);   
    if(t >= 1)
    {
    k = jf(a, b, ka, kb);
    c[k]++;    
    if(k > m)  m = k;
    t1 = 0;
    for(i = k; i <= m; i++)
    {
    x = c[i] + t1;
    c[i] = x % 10;
    t1 = x / 10;    
    }
    if(t1 > 0)  {m++; c[m] = t1;  }    
    }   
  }while(t == 1);
  if(t2 == 0) 
  {
    printf("商=0"); 
    printf("\n余数=");
    for(i = kd - 1; i >= 0; i--)  printf("%d", a[i]);
    exit(1); 
  }
  if(t2 == 2)
  {
    printf("商 = 1"); 
    printf("\n余数 = 0");
    exit(1); 
  }
  kk = kd;
  while(!c[kd - 1])  kd--;
  printf("商 = ");
  for(i = kd - 1; i >= 0; i--)  printf("%d", c[i]);
  while(!a[kk])  kk--;
  printf("\n余数 = ");
  if(kk < 0) 
  {
    printf("0"); 
    exit(1);
  }
  for(i = kk; i >= 0; i--)  printf("%d", a[i]);
}
4、 N!,要求精确到P位(0〈P〈1000〉。
算法:结果用数组a保存,开始时a[0]=1,依次乘以数组中各位,注意进位和数组长度的变化。源程序如下:
#include   <stdio.h>
#define    M   1000
main()
{
  int a[M], i, n, j, flag = 1;
  printf("n=");
  scanf("%d",&n);
  printf("n!=");
  a[0] = 1;
  for(i = 1; i < M; i++) a[i] = 0;
   for(j = 2; j <= n; j++)
   {
    for(i = 0; i < flag; i++) a[i] *= j;
    for(i = 0; i < flag; i++)
    if(a[i] >= 10)
    {
    a[i+1] += a[i]/10;
    a[i] = a[i] % 10;
    if(i == flag-1)  flag++;
    }
    }
  for(j = flag - 1; j >= 0; j--)
    printf("%d", a[j]);
}

全部回答

这里

http://xianni.5d6d.com/thread-461-1-1.html

许多大学的C语言高清视频教程

花了我很多的时间收集..
http://www.aftit8.com/thread-3815-1-1.html] 上面有好多的 去学习吧 我也是菜鸟呵呵
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
辽宁锦州哪里有卖冬天的毯子?
除了开红钻,怎么样有免费的时尚的qq秀???
从通州北苑到大兴奔驰坐公交怎么走?
我的车怎么停不了啦
描写山水的古文言文
飞行印张到哪买
我的问题给个答复
对口升学补报
8月19号以后 光卡和火卡的价格会重新标高么?
满江红4破解版
反恐精英升级有没毁灭送?多少级才有?
DNF60魔神带 +12的战刃好还是 +10左右的CC巨
武陟县焦作中国移动手机连锁卖场在哪里啊,我
为什么杀了副本还接不了不干净的任务?
QQ爱墙的图标谁会点亮?(帮我点亮)
推荐资讯
电脑配置升级的问题
崇阳县咸宁湖北乾兴律师事务所在什么地方啊,
下半年河北英毛是什么价格?
为什么QQ聊天时数字和字母都打不出来了。。。
魅丽文化 怎样邮购魅丽的书?
济宁做铁艺的多吗
风湿病人缺钙吗
请问在常州,GT540和5530的最低价。仅限于常
求命令与征服将军1.7修改器
网上交友好不好
Q名取什么好
我的N82可以在升级吗
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?