Craze.0&1

软件是计算机的灵魂-而我是灵魂的设计师

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  7 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks

常用链接

留言簿(1)

搜索

  •  

最新随笔

最新评论

阅读排行榜

评论排行榜


 地址:http://www.cppblog.com/0and1/     |   E-Mail:firenight@163.com     |   QQ:79688942   |




第一个思路没搞好,写的很烦琐……

#include <stdio.h>
#include 
<string.h>
#include 
<process.h>
#include 
<math.h>
#include 
<conio.h>
#define MAX 
50000 
void num_read(
int *a) 

    
int len,i,flag=0,err_msg; 
    char temp[MAX]; 
    
do 
    {
        err_msg
=0;
        scanf(
"%s",&temp); 
        
len=strlen(temp); 
        
if (temp[0]=='-') flag=1; 
        for(i=len-flag;i>=1;i--
        {
            
if ((temp[len-i]-'0')<0||(temp[len-i]-'0')>9) 
            {
                printf(
"你输入的第%d位不合法,请重新输入!!\n",len-i+1); 
                err_msg
=1
                break; 
            }
            
else 
                a[i]
=temp[len-i]-'0'; 
        }
        
    }
    
while (err_msg);
    
if (flag) 
        a[
0]=-(len-1); 
    
else 
        a[
0]=len


void num_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_add(
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; 


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_add(c); 


void format_sub(
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])
        
for (;i<=a[0];i++
            c[i]
=a[i]; 

    c[
0]=a[0]; 
    format_sub(c); 
    i
=c[0]; 
    
while(c[i]==0
        i
--;  
    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 a[MAX],b[MAX],c[MAX]; 
    
while(true)
    {
        system(
"cls");
        printf(
"\n**********************\n"); 
        printf(
"\n"); 
        printf(
"  1.大数的加法 \n"); 
        printf(
"  2.大数的减法 \n"); 
        printf(
"  3.退出 \n"); 
        printf(
"\n"); 
        printf(
"**********************\n"); 
        printf(
"\n请选择[1-3]:"); 
        switch(getch())
        {
        
case '1':    
            printf("\n");
            printf(
"请输入大数A:"); 
            num_read(a); 
            printf(
"请输入大数B:"); 
            num_read(b);
            
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];} 
            
if (a[0]>0 && b[0]<0) {b[0]=-b[0];sub(a,b,c);b[0]=-b[0];} 
            
if (a[0]>0 && b[0]>0) {add(a,b,c);} 
            
if (a[0]<0 && b[0]>0) {a[0]=-a[0];sub(b,a,c);a[0]=-a[0];} 
            printf(
"\n"); 
            printf(
"A="); 
            num_print(a); 
            printf(
"B="); 
            num_print(b); 
            printf(
"C=A+B="); 
            num_print(c); 
            printf(
"\n要继续计算吗?(y/n)"); 
            
if (getch()=='n') return; 
            break;
        
case '2':        
            printf("\n\n");
            printf(
"请输入大数A:"); 
            num_read(a); 
            printf(
"请输入大数B:"); 
            num_read(b);
            
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]>0sub(a,b,c); 
            printf(
"A="); 
            num_print(a); 
            printf(
"B="); 
            num_print(b); 
            printf(
"C=A-B="); 
            num_print(c); 
            printf(
"\n要继续计算吗?(y/n)"); 
            
if (getch()=='n') return; 
            break;
        
case '3':
            return;
        }
    }
}

下面的比较简洁…………

#include <stdio.h>
#include 
<string.h>
#define MAX 
10000
void num_read(
int *a) 

    
int len,i; 
    char temp[MAX]; 
    scanf(
"%s",&temp); 
    
len=strlen(temp); 
    
for(i=len;i>=1;i--
        a[i]
=temp[len-i]-'0'; 
    a[0]=len

int compare(int a[],int b[])          //比较大整数的大小 
{
    
int i;
    
if (a[0]>b[0])          //比较a,b的位数确定返回值 
        return 
1;          
    
else
        
if (a[0]<b[0])
            return 
-1;
        
else                             //位数相等时的比较 
        {
            i
=a[0];
            
while (a[i]==b[i])            //逐位比较 
                i
--;
            
if (i==0)
                return 
0;
            
else
                
if (a[i]>b[i])
                    return 
1;
                
else
                    return 
-1;
        }
}
void bigplus(
int a[],int b[],int c[])  //大整数加法 
{
    
int i,len;
    
len=(a[0]>b[0]?a[0]:b[0]);   
    
for(i=0;i<MAX;i++)       //将数组清0 
        c[i]
=0;
    
for (i=1;i<=len;i++)        //计算每一位的值 
    {
        c[i]
+=(a[i]+b[i]);
        
if (c[i]>=10)
        {
           c[i]
-=10;            //大于10的取个位 
           c[i
+1]++;            //高位加1 
        }
    }
    
if (c[i+1]>0
        
len++;
    c[
0]=len;                //c[0]保存结果数组实际长度 
    printf(
"Big integers add: "); 
    
for (i=len;i>=1;i--)
        printf(
"%d",c[i]); 
    printf(
"\n");
}
void bigsub(
int a[],int b[],int c[]) //大整数减法 
{
    
int i,len,com_flag;
    
len=(a[0]>b[0]?a[0]:b[0]);  
    
for(i=0;i<MAX;i++)       //将数组清0 
        c[i]
=0;
    com_flag
=compare(a,b);
    
if (com_flag==0)        //比较a,b大小 
         printf(
"Big integers sub=: 0");
    
else
        
if (com_flag>0)
            
for (i=1;i<=len;i++)        //计算每一位的值 
            {
                c[i]
+=(a[i]-b[i]); 
                
if (c[i]<0)
                {
                    c[i]
+=10;            //小于0的原位加10 
                    c[i
+1]--;            //高位减1 
                }
            }
            
else
                
for (i=1;i<=len;i++)        //计算每一位的值 
                {
                    c[i]
+=(b[i]-a[i]); 
                    
if (c[i]<0)
                    {
                        c[i]
+=10;            //小于0原位加10 
                        c[i
+1]--;            //高位减1 
                    }
                }
    
while (len>1 && c[len]==0)  //去掉高位的0 
        
len--;
    c[
0]=len;
    printf(
"Big integers sub= ");
    
if (a[0]<b[0] || com_flag<0)
        printf(
"-");
    
for(i=len;i>=1;i--)         
        printf(
"%d",c[i]);
    printf(
"\n");
}


int main()
{
  
int a[MAX],b[MAX],c[MAX];  
  num_read(a);
  num_read(b);
  bigplus(a,b,c); 
  bigsub(a,b,c); 
  return 
0;
}

觉得如果用文件记录结果,对无限位理论上成立,可没想好怎么实现……
每个数组元素只记录一位数字,有点浪费,改成逢千进一可能提高空间利用率;
猜想模仿CPU的数值运算,应该更有效……
posted on 2007-04-14 21:41 Craze.0&1 阅读(631) 评论(0)  编辑 收藏 引用 所属分类: 学习笔记

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理