c语言程序设计:大整数的加减法

c语言程序设计:大整数的加减法,第1张

用rand()产生随机数,rand()会产生从0到一个很大的数,我记不清了,反正很大。如果想出现100以内的,就用rand()%100。你可以定义三个int型整数,两个表示加或者减的对象,另一个标示加或者减,因为只要出现两种情况之一,所以可以用rand()%2,这样只会有0,1两种情况来标示加或者减。下面的就很容易了inta,b,i,c;for(i=0;i<10;i++){a=rand()%100;b=rand()%100;c=rand()%2;if(c==0)//标示加法{printf("%d+%d=%d\n",a,b,a+b);}else{printf("%d-%d=%d\n",a,b,a-b);}}大致就这样,希望给你点帮助

用高精度算法来实现,即用数组或指针来储存数字,例如A〔20〕来储存a ,用B〔20〕来储存b,这样a 和b就可以是很大的数,再用一个C〔21〕来储存结果,为什么C要21呢,你知道,加法是要近位的,呵呵。这里给出相加的伪代码,d =0/用来存储近位/,for i=0到19{c=A〔i〕+B〔i〕+d ,d =c/10,c=c%10,C〔i〕=c}if d 不等于0 C〔i+1〕=d ,再逆的输出C就可以了!编程要学会思考,现在你可以试试编下高精度乘法,例如可以输出100的阶乘

C语言中,一般而言整型数是双字节,所以:
有符号型:最大 32767,最小 -32768
无符号型:最大 65535,最小 0
但对于C++,面对32位机时,整型数变成了双字,所以:
有符号型:最大 2147483647,最小 -2147483648
无符号型:最大 4294967295,最小 0

最大的数据类型是字符串
string
运用字符串可以进行100~150位数字甚至以上的的加减乘除
除了字符串
其他的任何数据类型都不可能输入100几位的数字!
但是输入和输入的时候也很讲究
毕竟字符串与其他数据类型不同
我这里有一个高精度加法
你可以输入任意两个数进行加法
这两个数的长度限制在150个数字以内
不是150以内
而是150个数字以内!
var s1,s2:string;
a,b,c:array[01000]of integer;{0单元记录的是该数的长度}
i,len,jin,t:integer;{jin表示进位}
begin
readln(s1);
readln(s2);
a[0]:=length(s1);
for i:=1 to a[0] do a[i]:=ord(s1[a[0]+1-i])-ord('0');
b[0]:=length(s2);
for i:=1 to b[0] do b[i]:=ord(s2[b[0]+1-i])-ord('0');{把字符串中的每个数字转到数组中去,注意倒过来,这样保证对齐}
if a[0]>b[0] then len:=a[0] else len:=b[0];
jin:=0;
for i:=1 to len do begin
t:=a[i]+b[i]+jin;
c[i]:=t mod 10;
jin:=t div 10;
end;
if jin>0 then begin
inc(len);
c[len]:=jin;
end;
c[0]:=len;
for i:=c[0] downto 1 do write(c[i]);
writeln;
end
你也试一试普通的加法程序:
var a,b:int64;
begin
readln(a);
readln(b);
writeln(a+b);
end
int64绝对不能输入150个数字组成的数!
所以字符串是最大的数据类型

你可以找一下加密库的源文件来研究下,里面就有大数四则运算,曾经试着写2048位的大数四则运算,结果就写了加法,减法,和简单的没有优化的乘法就没信心写了。。。大数是用数组表示的,没有用结构体,复制来的,不知能不能运行。。

#define MAX 400
void my_read(int a)
{
int len,i,flag=0;
char s[MAX];
aa:
while(1)
{
  scanf("%s",&s);
  len=strlen(s);
  if (s[0]=='-') flag=1;
  for(i=len-flag;i>=1;i--)
  {
   if ((s[len-i]-'0')<0||(s[len-i]-'0')>9)
    {
      printf("\t\t\t你输入的第%d位不合法,按任意键重新输!!",len-i+1);
      getch();
      goto aa;
    }
    else
     a[i]=s[len-i]-'0';
   }
   if (flag)
       a[0]=-(len-1);
    else
       a[0]=len;
   break;
  }
return;
}
void my_print(int a)
{
int i;
if (a[0]<0) printf("-");
if (a[0]==0)
   {
    printf("0");
    return;
    }
for(i=abs(a[0]);i>=1;i--)
  printf("%d",a[i]);
printf("\n");
}
void format(int a)
{
int p;
for(p=1;p<a[0]||a[p]>=10;p++)
{
  if (p>=a[0]) a[p+1]=0;
     a[p+1]+=a[p]/10;
  a[p]=a[p]%10;
  }
if (p>=a[0]) a[0]=p;
return;
}
void add(int a,int b,int c)
{
int len,i;
if (a[0]<b[0]) len=a[0];
   else len=b[0];
for(i=1;i<=len;i++)
   c[i]=a[i]+b[i];
if (len<a[0])
{
  for (;i<=a[0];i++)
    c[i]=a[i];
  c[0]=a[0];
  }
  else
  {
  for(;i<=b[0];i++)
  {
   c[i]=b[i];
   }
  c[0]=b[0];
  }
  format (c);
}
void commaltiply (int a,int x,int b)
{
int i;
for(i=1;i<=a[0];i++)
   b[i]=a[i]x;
b[0]=a[0];
format(b);
return;
}
void matiply(int a,int b,int c)
{
int i,temp[MAX],j;
commaltiply(a,b[1],c);
for(i=2;i<=b[0];i++)
{
  if (b[i]==0)
   {
    c[0]++;
    for (j=c[0];j>1;j--)
     c[1]=0;
    }
    else
    {
    commaltiply(a,b[i],temp);
    for(j=1;j<i;j++)
     commaltiply(temp,10,temp);
    add(c,temp,c);
  }
}
}
void dectobin(int a,int b)
{
int p;
b[0]=0;
while(a[0]>0)
{
  b[0]++;
  b[b[0]]=a[1]%2;
  p=a[0];
  while(p>0)
  {
   if (a[p]%2 && p>1) a[p-1]+=10;
    a[p]/=2;
   if (a[a[0]]==0) a[0]--;
     p--;
   }
}
}
format1(int a)
{
int i;
for (i=1;i<=a[0];i++)
   if (a[i]<0)
   { a[i]+=10;
     a[i+1]-=1;
   }
}
void sub_1(int a,int b,int c)
{
  int i;
  for (i=1;i<=b[0];i++)
    c[i]=a[i]-b[i];
  if (a[0]==b[0]) goto loop;
  for (;i<=a[0];i++)
    c[i]=a[i];
  loop:
  c[0]=a[0];
  format1(c);
  i=c[0];
  while(1)
   if (c[i]==0) i--;
     else break;
  c[0]=i;
  return;
}
void sub(int a,int b,int c)
{
int i,flag=0;
for (i=1;i<=a[0];i++)
     if (a[i]!=b[i]) {flag=1;break;}
if (flag==0)
  {
   c[0]=0;
   return;
   }
flag=0;
if (a[0]==b[0])
   {
    i=a[0];
    while(i>0)
    {
     if (a[i]>b[i])
{
 sub_1(a,b,c);
 break;
 }
     if (a[i]<b[i])
{
 flag=1;
 sub_1(b,a,c);
 break;
}
     i--;
    }
  }
if (a[0]>b[0])
    sub_1(a,b,c);
  else
   if (a[0]<b[0])
     {
      flag=1;
      sub_1(b,a,c);
     }
if (flag)
   c[0]=-c[0];
  else
   c[0]=c[0];
}
void main()
{
int i,a[MAX],b[MAX],c[MAX];
char yn;
strat:
while(1)
{
  clrscr();
  printf("\n\n\n");
  printf("\t\t\t\n");
  printf("\t\t\t        \n");
  printf("\t\t\t           1大整数的加法          \n");
  printf("\t\t\t           2大整数的减法          \n");
  printf("\t\t\t           3大整数的乘法          \n");
  printf("\t\t\t           4大整数进制转换   \n");
  printf("\t\t\t           5帮助\n");
  printf("\t\t\t           6退出                  \n");
  printf("\t\t\t                                   \n");
  printf("\t\t\t\n");
  printf("\n\n\t\t\t      请选择(1-6):");
  yn=getch();
  if (yn=='1'||yn=='2'||yn=='3'||yn=='4'||yn=='5'||yn=='6') break;
    else
    {
     printf("\n\t\t\t输入不合法!按任意键重新输入!!!!");     getch();
    }
  }
  clrscr();
  if (yn=='6') return;
  if (yn=='4')
   {
    printf("请输入待转换的大整数:");
    printf("\n");
    my_read(a);
    for (i=1;i<=abs(a[0]);i++)
      b[i]=a[i];
    b[0]=a[0];
    if (a[0]<0) {a[0]=-a[0];dectobin(a,c);a[0]=-a[0];c[0]=-c[0];goto e;}
    dectobin(a,c);
    e:
    printf("十进制:");
    my_print(b);
    printf("二进制:");
    my_print(c);
    goto loop;
   }
  printf("请输入大整数A:");
  my_read(a);
  printf("请输入大整数B:");
  my_read(b);
  if (yn=='1')
   {
    if (a[0]<0 && b[0]<0) {a[0]=-a[0];b[0]=-b[0];add(a,b,c);c[0]=-c[0];a[0]=-a[0];b[0]=-b[0];goto c;}
    if (a[0]>0 && b[0]<0) {b[0]=-b[0];sub(a,b,c);b[0]=-b[0];goto c;}
    if (a[0]>0 && b[0]>0) {add(a,b,c);goto c;}
    if (a[0]<0 && b[0]>0) {a[0]=-a[0];sub(b,a,c);a[0]=-a[0];goto c;}
    c:
    printf("\n\t\t\t");
    printf("A=");
    my_print(a);
    printf("\n\t\t\t");
    printf("B=");
    my_print(b);
    printf("\n\t\t\t");
    printf("C=A+B=");
    my_print(c);
    goto loop;
   }
  if (yn=='2')
   {
    if (a[0]<0 && b[0]<0) {a[0]=-a[0];b[0]=-b[0];sub(b,a,c);a[0]=-a[0];b[0]=-b[0];}
    if (a[0]<0 && b[0]>0) {a[0]=-a[0];add(a,b,c);a[0]=-a[0];c[0]=-c[0];}
    if (a[0]>0 && b[0]<0) {b[0]=-b[0];add(a,b,c);b[0]=-b[0];}
    if (a[0]>0 && b[0]>0) sub(a,b,c);
    printf("A=");
    my_print(a);
    printf("\nB=");
    my_print(b);
    printf("\nC=A-B=");
    my_print(c);
    goto loop;
   }
  if (yn=='3')
   {
    if (a[0]<0 && b[0]>0) {a[0]=-a[0];matiply(a,b,c);a[0]=-a[0];c[0]=-c[0];goto d;}
    if (a[0]>0 && b[0]<0) {b[0]=-b[0];matiply(a,b,c);b[0]=-b[0];c[0]=-c[0];goto d;}
    if (a[0]<0 && b[0]<0) {a[0]=-a[0];b[0]=-b[0];matiply(a,b,c);a[0]=-a[0];b[0]=-b[0];goto d;}
    matiply(a,b,c);
    d:
    printf("\n\t\t\tA=");
    my_print(a);
    printf("\n\t\t\tB=");
    my_print(b);
    printf("\n\t\t\tC=AB=");
    my_print(c);
    goto loop;
   }
  loop:
  while(1)
  {
   printf("\n\t\t\t继续计算吗?(y/n)");
   yn=getch();
   if (yn=='y') goto strat;
   if (yn=='n') return;
  }
}

两个int型数据可以用%取余
两个double型小数,乘以相应的倍数转成整形,取余,再除以相应的倍数,转为double型
两个double型大整数(int型放不下),可以自己编写。先判断两数大小,用大数不断减小数,直到差小于小数,此时差就是余数。当两数差距较大(如10倍以上),可以一开始直接减小数的10倍加快速度,具体方法你自己想一想吧

C语言利用数组计算超大整数的阶乘代码
#include <stdioh>
int main()
{
int n;
int a[9000]; //确保保存最终运算结果的数组足够大
int digit = 1; //位数
int temp; //阶乘的任一元素与临时结果的某位的乘积结果
int i, j, carry; //carry:进位

printf("please in put n:\n");
scanf("%d",&n);
a[0] = 1; //将结果先初始化为1

for ( i=2; i<=n; i++ ) //开始阶乘,阶乘元素从2开始依次"登场"
{ //按最基本的乘法运算思想来考虑,将临时结果的每位与阶乘元素相乘
for( j=1, carry=0; j<=digit; j++ )
{
temp = a[j-1] i + carry; //相应阶乘中的一项与当前所得临时结果的某位相乘(加上进位)
a[j-1] = temp % 10; //更新临时结果的位上信息
carry = temp / 10; //看是否有进位
}
while(carry)
{ //如果有进位
a[++digit-1] = carry % 10; //新加一位,添加信息。位数增1
carry = carry / 10; //看还能不能进位
}
}
printf("n ! = "); //显示结果
for(j = digit; j >=1;j--)
{
printf("%d",a[j-1]);
}
printf("\n");
return 0;
}
#include <stdioh>
int main()
{
int n;
int a[9000]; //确保保存最终运算结果的数组足够大
int digit = 1; //位数
int temp; //阶乘的任一元素与临时结果的某位的乘积结果
int i, j, carry; //carry:进位

printf("please in put n:\n");
scanf("%d",&n);
a[0] = 1; //将结果先初始化为1

for ( i=2; i<=n; i++ ) //开始阶乘,阶乘元素从2开始依次"登场"
{ //按最基本的乘法运算思想来考虑,将临时结果的每位与阶乘元素相乘
for( j=1, carry=0; j<=digit; j++ )
{
temp = a[j-1] i + carry; //相应阶乘中的一项与当前所得临时结果的某位相乘(加上进位)
a[j-1] = temp % 10; //更新临时结果的位上信息
carry = temp / 10; //看是否有进位
}
while(carry)
{ //如果有进位
a[++digit-1] = carry % 10; //新加一位,添加信息。位数增1
carry = carry / 10; //看还能不能进位
}
}
printf("n ! = "); //显示结果
for(j = digit; j >=1;j--)
{
printf("%d",a[j-1]);
}
printf("\n");
return 0;
}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13357586.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-21
下一篇 2023-07-21

发表评论

登录后才能评论

评论列表(0条)

保存