| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 458 人关注过本帖
标题:做的课程设计:超大数的计算
只看楼主 加入收藏
树上月
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:114
专家分:154
注 册:2010-1-6
结帖率:87.5%
收藏
 问题点数:0 回复次数:1 
做的课程设计:超大数的计算
// 大数运算.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define size 1001
//--------大数除法-------

int comparebignumber(char a[],char b[])
{
 int A,B;
 //测出2个大数的长度
 A=strlen(a);
 B=strlen(b);
    //比较2个大数的大小
 if(A>B)
  return 1;
 if(A<B)
  return 0;
 if(strcmp(a,b)>0)  
  return 1;
 if(strcmp(a,b)<0)  
  return 0;
 if(strcmp(a,b)==0)
  return 2;
 
}

//比较2个整型数组的大小   数组最高为对应最大位置
int compare(int a[],int b[],int n,int m) //n m分别代表a b两数组的长度
{
 while(a[n-1]==0)
  n--;
 if(n>m)
  return 1;
 if(n==m)
  for(int i=n;i>0;i--)
  {
   if(a[i-1]>=b[i-1])//倒序比较
    return 1;
   else
    return 0;
  }
  if(n<m) return 0;
  return 0;
}
 

int value(char a[],char b[],int C[],int n,char AA[],FILE *fp)
{
 int c=0,B2[size],B[size],A1,B1,return1=0,j,sum[size],flag=0;
   
 
 //初始化数组
    for(int i=0;i<size;i++)
 {
  B2[i]=0;
        B[i]=0;
  sum[i]=0;
 }
    A1=strlen(a);
 B1=strlen(b);
    for(int q=(j=strlen(a))-1;q>=0;--q)
 {
  sum[j-q-1]+=(a[q]-'0');
  //  printf("sum的值啊%d\n",sum[j-q-1]);
 }
 for(int w=(j=strlen(b))-1;w>=0;--w)
 {
  B[j-w-1]+=(b[w]-'0');
  //       printf("B的值啊%d\n",B[j-w-1]);
 }
 
 
 
    //while 语句做减法   并起判断边界的作用
 while(compare(sum,B,A1,B1)==1)  
 {
  for(int e=0;e<size;e++)//正序比较
  {     
   sum[e]=sum[e]-B[e]+c;//0位是最低位
   if(sum[e]<0)
   {
    sum[e]+=10;
    c=-1;
   }
   else
    c=0;
  }  
  return1++;
 }
 
    printf("%d",return1);//输出的数字
 fprintf(fp,"%d",return1);
 
 
 //处理AA数组
 int t=0;
    for(int u=A1-1;u>=A1-n;u--)
 {
  AA[t]=sum[u]+'0';
  t++;
 }
 AA[t]='\0';
 while(AA[0]=='0')
 {
  for(int x=0;x<(strlen(AA));x++)
   AA[x]=AA[x+1];
 }
   
 
 //处理前面位数为零的项
    while(sum[A1-1]==0)
  A1--;
 //当sum数组的值全部为0时
 if(A1<=0)
  return 2;
 
    //用数组a存储余数
    for(int v=0;v<A1;v++)
 {
  a[v]=sum[A1-v-1]+'0';                      //a[0]代表最高位
 }
    a[v]='\0';
 return 1;
}
 
 
 
void  increasementb(char a[],char b[])
{
 int m,A,B,flag=1;
    A=strlen(a);
 B=strlen(b);
 m=A-B;
 
 
 //对b数组进行补零
 for(int i=0;i<B;i++)//判断边界条件
 {
  if(a[i]<b[i])
   flag=0;
 }
 if(flag!=0)
 {
  for(int j=0;j<m;j++)
  {
   b[B+j]='0';
  }
  b[B+j]='\0';
 }
 else
 {
  for(int j=0;j<m-1;j++)
  {
   b[B+j]='0';
  }
  b[B+j]='\0';
 }
}
 

int increasezero(char a[],char AA[],char b[],int count,FILE *fp)
{
 int n=0,m=strlen(AA),y=0;
 do
 {
        AA[m+n]=a[count+n];
  AA[m+n+1]='\0';
  n++;
  y=count+n;
 }
 while(comparebignumber(AA,b)==0&&y!=strlen(a));
 if(y==strlen(a)&&comparebignumber(AA,b)==0)      //控制零处最难之处
 {
  fprintf(fp,"%c",'0');
  printf("0");
 }
 for(int p=0;p<n-1;p++)
 {
  fprintf(fp,"%c",'0');
  printf("0");
 }
 return 1;
}
 
int divise(FILE *fp)
{
 char q[size],t[size],copyA[size],AA[size],a[size],b[size];
 int A,B,C[size],j,c=0,l=0,f,m,u=0,A1,flag=1;
 //初始化a和sum内的值
 for(int i=0;i<size;i++)
 {
  a[i]='0';
  b[i]='0';
  q[i]='0';
  C[i]=0;
 }
 scanf("%s",a);
 fprintf(fp,"%s\n",a);
 getchar();
 gets(b);
 fprintf(fp,"%s\n",b);
 t[0]='\0';
 strcpy(copyA,a);
 strcpy(q,b);
    if(comparebignumber(a,b)==2)
 {
  fprintf(fp,"%c",'1');
  printf("1");
  return 1;
 }
 if(comparebignumber(a,b)==0)
 {
  fprintf(fp,"%c",'0');
  printf("0");
  return 1;
 }
    A=strlen(a);
 B=strlen(b);
    m=A-B;
 int count=0; //计算算了多少位了
 do
 {
  increasementb(a,b);//对b数组进行补零      
  if(value(a,b,C,B,AA,fp)==2)//当sum数组全部为零时
   return 2;
  count=A-strlen(a);
  increasezero(copyA,AA,q,count,fp);
  strcpy(b,q);  //将b数组更改回原形
 }
 while(comparebignumber(a,b)==1||comparebignumber(a,b)==2);//当a数组小于b数组 结束循环
    return 1;
}
 
 

//------大数乘法------
//将数组初始化
void init(char *p)
{
 for(int i=0;i<=999;i++)
  p[i]='\0';
}
//处理负数
int deal(char *p)
{
 int i=0;
 if(p[0]=='-')
 {
  while(p[i]!='\0')
   i++;
  for(int j=0;j<i;j++)
   p[j]=p[j+1];
  return 1;
 }
 return 0;
}
 

//计算输入字符的个数
int cal(char *p)
{
 int i=0;
 while(p[i]!='\0')
  i++;
 return i-1;
}
//将输入的字符进行倒置
void fun(char *p,int n)
{
 int m;
 for(int i=0;i<=n/2;i++)
 {
  m=p[i];
  p[i]=p[n-i];
  p[n-i]=m;
 }
}
void change(char *p,int n)
{
 int i;
 for(i=0;i<=n;i++)
  p[i]=p[i]-'0';
}
//进位处理
void cha(char *p)
{
 int i=999;
 while(p[i]=='\0')
  i--;
 for(int j=0;j<=i;j++)
 {
  while(p[j]>=10||p[j]<0)
  {
   if(p[j]<0)
   {
    p[j+1]--;
    p[j]+=10;
   }
   else
   {
    p[j+1]++;
    p[j]-=10;
   }
  }
 }
}

int nulbipict(FILE *fp)
{
 char c[size],a[size],b[size];;
 int t,i,j,taga,tagb;
 
    init(a);   //初始化三数组
    init(b);
 init(c);
   
 scanf("%s",a);
 fprintf(fp,"%s\n",a);
 scanf("%s",b);
 fprintf(fp,"%s\n",b);
  
    taga=deal(a);  //标记是否为负数
    tagb=deal(b);
 
    int m=cal(a);  //计算字符的位数
    int n=cal(b);
 
 
 
    fun(a,m);  //进行倒置
 fun(b,n);
 
 
    change(a,m);  
    change(b,n);
 
   
 for(i=0;i<=m;i++)  //乘法运算
  for(j=0;j<=n;j++)
  {
   t=j+i;
   c[t]=c[t]+a[i]*b[j];
  }
  
  
  cha(c);    //进位处理
  
  i=999;
  while(c[i]=='\0')
   i--;
  
  if(taga!=tagb)   //判断结果是否为负
   printf("-");
  
 for(j=i;j>=0;j--)
  {
   printf("%d",c[j]);   //输出值
   fprintf(fp,"%d",c[j]);  //输到文件中
  }
      printf("\n");
  
  return 0;
  
}
 
 

//-------大数减法--------
int subtraction (FILE *fp)
{
 char a[size],b[size];
 int A[size],B[size],sum[size],j,c=0,k,l,flag=0;
 //初始化a和sum内的值
 for(int i=0;i<size;i++)
 {
  a[i]='0';
  b[i]='0';
  A[i]=0;
  B[i]=0;
 }
 scanf("%s",a);
 fprintf(fp,"%s\n",a);
 getchar();
 gets(b);
 fprintf(fp,"%s\n",b);
 //将字符串转换成整数型
 
 
 //二个大数相等的情形
    if(comparebignumber(a, b)==2)
 {
  printf("0");
  return 1;
 }
 
 //二个大数不相等的情形
 if(comparebignumber(a, b))
 {
  for(int q=(j=strlen(a))-1;q>=0;--q)
   A[j-q-1]+=(a[q]-'0');
  for(int w=(j=strlen(b))-1;w>=0;--w)
   B[j-w-1]+=(b[w]-'0');
 }
 else
 {
  for(int q=(j=strlen(b))-1;q>=0;--q)
   A[j-q-1]+=(b[q]-'0');
  for(int w=(j=strlen(a))-1;w>=0;--w)
   B[j-w-1]+=(a[w]-'0');
  flag=-1;             //做个标志
 }
 
 
 
    //二个大数之间的进位计算
 for(int e=0;e<size;e++)
 {     
  sum[e]=A[e]-B[e]+c;
  if(sum[e]<0)
  {
   sum[e]+=10;
   c=-1;
  }
  else
   c=0;  
 }
    k=size-1;
 
 
 
 //大数的输出
    while(!sum[k])
  k--;              //逆序输出去除零项
 
 
 //若第一个数小于第二个数则输出负数
 if(flag==-1)
 {
  fprintf(fp,"%c",'-');
  printf("-");
 }
 
 for(l=k;l>=0;l--)
 {
  printf("%d",sum[l]);
  fprintf(fp,"%d",sum[l]);
 }
    return 0;
}
 
//----------大数加法---------
int add (FILE *fp)
{
 int A[size],B[size],sum[size],j,c=0,k,l;
 char a[size],b[size];
 //初始化a和sum内的值
 for(int i=0;i<size;i++)
 {
  a[i]='0';
  b[i]='0';
  A[i]=0;
        B[i]=0;
 }
 scanf("%s",a);
 fprintf(fp,"%s\n",a);
 getchar();
 gets(b);
 fprintf(fp,"%s\n",b);
  //将字符串转换成整数型
 for(int q=(j=strlen(a))-1;q>=0;--q)
  A[j-q-1]+=(a[q]-'0');
 for(int w=(j=strlen(b))-1;w>=0;--w)
  B[j-w-1]+=(b[w]-'0');
 
 
 for(int e=0;e<size;e++)
 {   
  sum[e]=A[e]+B[e]+c;
  c=sum[e]/10;
  sum[e]=sum[e]%10;   
 }
 //大数的输出
    k=size-1;
    while(!sum[k])  k--;
 
 for(l=k;l>=0;l--)
 {
  printf("%d",sum[l]);
  fprintf(fp,"%d",sum[l]);
 }
    return 0;
}
 
//------主函数--------
int main()
{
 int choice;
 FILE *fp;
 if((fp=fopen("程序设计.txt","w"))==NULL)
 {
  printf("File open error!\n");
  exit (0);
 }
 //输出界面
 printf("///////////////////////////////////////////////\n");
    printf("-------------------------------------------\n");
    printf("|                                         |\n");
 printf("|                                         |\n");
 printf("|                                         |\n");
 printf("|                                         |\n");
 printf("|                                         |\n");
 printf("|           欢迎使用本计算器              |\n");
 printf("|                                         |\n");
 printf("|                                         |\n");
 printf("|                                         |\n");
 printf("|                                         |\n");
 printf("-------------------------------------------\n");
 printf("1:两个大数的加法运算\n2:两个大数的减法运算\n3:两个大数的乘法运算\n4:两个大数的除法运算\n");
 printf("请选择相应的操作:\n");
 fprintf(fp,"///////////////////////////////////////////////\n");
 fprintf(fp,"课程设计名称: 大数的运算\n");
 fprintf(fp,"参与课程设计的成员:胡腾腾    阳林   唐贵华\n");
 fprintf(fp,"-------------------------------------------\n");
    fprintf(fp,"|            欢迎使用本计算器             |\n");
 fprintf(fp,"|             1    2     3                |\n");
 fprintf(fp,"|                                         |\n");
 fprintf(fp,"|                                         |\n");
 fprintf(fp,"|             4    5     6                |\n");
 fprintf(fp,"|                                         |\n");
 fprintf(fp,"|                                         |\n");
 fprintf(fp,"|                                         |\n");
 fprintf(fp,"|             7    8     9                |\n");
 fprintf(fp,"|                                         |\n");
 fprintf(fp,"-------------------------------------------\n");
 fprintf(fp,"1:两个大数的加法运算\n2:两个大数的减法运算\n3:两个大数的乘法运算\n4:两个大数的除法运算\n");
 fprintf(fp,"请选择相应的操作:\n");
 scanf("%d",&choice);
 fprintf(fp,"%d\n",choice);
 
    switch(choice)
 {
 case 1:
  add(fp);
  break;
 case 2:
        subtraction (fp);
  break;
 case 3:
        nulbipict(fp);
  break;
 case 4:
  divise(fp);
  break;
 }
 if(fclose(fp))
 {
  printf("can not close the file\n");
  exit (0);
 }
 return 0;
}
搜索更多相关主题的帖子: 课程 设计 
2010-10-28 09:22
MrBluer
Rank: 4
等 级:业余侠客
威 望:1
帖 子:120
专家分:263
注 册:2010-10-23
收藏
得分:0 
人才……
2010-10-28 09:57
快速回复:做的课程设计:超大数的计算
数据加载中...
 
   



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

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