长整数相加减

  1 #include<stdio.h>
  2 #include<string>
  3 using namespace std;
  4 
  5 const int N=30;
  6 int  min(int n,int m)//返回两个数中的最小一个数
  7 {
  8     return (n<m) ? n : m;
  9 }
 10 
 11 int  max(int n,int m)//返回两个数中的最大一个数
 12 {
 13     return (n>m) ? n : m;
 14 }
 15 
 16 void Add()//两个长整数相加
 17 {
 18     int i,carry;
 19     char num1[N],char num2[N];//数字1,数字2
 20     int strlen_num1,strlen_num2;//数字1的长度,数字2的长度
 21     int Num1[N],Num2[N],Result[N];
 22     int minnum,maxnum;//两个数中长度最大的一个
 23     printf("        ---------Add----------\n");
 24     printf("请输入整数1:");
 25     scanf("%s",&num1);
 26     printf("请输入整数2:");
 27     scanf("%s",&num2);
 28     
 29     strlen_num1 = strlen(num1);//获得num1的长度
 30     strlen_num2 = strlen(num2);//获得num2的长度
 31     //printf("%d",strlen_num1);
 32     
 33     for(i=0;i<strlen_num1;i++)
 34     {
 35         Num1[i] = num1[strlen_num1-1-i] - '0';//字符转化为整数
 36     //    printf("%d\n",Num1[i]);
 37         
 38     }
 39 
 40     for(i=0;i<strlen_num2;i++)
 41     {
 42         Num2[i] = num2[strlen_num2-1-i] - '0';//字符转化为整数
 43     }
 44     
 45     
 46     minnum = min(strlen_num1,strlen_num2);
 47     maxnum = max(strlen_num1,strlen_num2);
 48 
 49     carry = 0;//进位初始为0
 50     for(i=0;i<minnum;i++)
 51     {
 52         Result[i] = (Num1[i] + Num2[i] + carry) % 10;
 53         carry = (Num1[i] + Num2[i] + carry)/10;
 54     }
 55      
 56 
 57     if(strlen_num1>minnum)
 58     {
 59         for(i=minnum;i<strlen_num1;i++)
 60         {
 61             Result[i] = (Num1[i]+ carry) % 10;
 62             carry = (Num1[i]+ carry)/10;
 63 
 64         }
 65     }
 66 
 67     if(strlen_num2>minnum)
 68     {
 69         for(i=minnum;i<strlen_num2;i++)
 70         {
 71             Result[i] = (Num2[i]+ carry) % 10;
 72             carry = (Num2[i]+ carry)/10;
 73         }
 74     }
 75 
 76     if(carry>0)//最后一位有进位
 77     {
 78         Result[maxnum] = 1;
 79         maxnum++;
 80     }
 81     printf("结果:");
 82     printf("%s+%s=",num1,num2);
 83     for(i=maxnum-1;i>=0;i--)
 84     {
 85         printf("%d",Result[i]);
 86     }
 87     printf("\n\n");
 88 }
 89 
 90 void Sub()//两个长整数相减
 91 {
 92     int i,j,carry;
 93     char num1[N],char num2[N];//数字1,数字2
 94     int strlen_num1,strlen_num2;//数字1的长度,数字2的长度
 95     int Num1[N],Num2[N],Result[N];
 96     int minnum,maxnum;//两个数中长度最大的一个
 97     printf("        ---------Sub----------\n");
 98     printf("请输入整数1:");
 99     scanf("%s",&num1);
100     printf("请输入整数2:");
101     scanf("%s",&num2);
102     
103     strlen_num1 = strlen(num1);//获得num1的长度
104     strlen_num2 = strlen(num2);//获得num2的长度
105     
106     for(i=0;i<strlen_num1;i++)
107     {
108         Num1[i] = num1[strlen_num1-1-i] - '0';//字符转化为整数
109     }
110 
111     for(i=0;i<strlen_num2;i++)
112     {
113         Num2[i] = num2[strlen_num2-1-i] - '0';//字符转化为整数
114     }
115     
116     minnum = min(strlen_num1,strlen_num2);
117     maxnum = max(strlen_num1,strlen_num2);
118 
119     if(minnum==strlen_num1)//被减数小
120     {
121         for(i=minnum;i<maxnum;i++)Num1[i] = 0;//补0
122         for(i=0;i<maxnum;i++)
123         {
124             if(Num2[i]<Num1[i])//需要借位
125             {
126                 j = i +1;
127                 while(j==0)
128                 {
129                     Num2[j] += 9;
130                     j++;
131                 }
132                 Num2[j]--;
133                 Result[i] = Num2[i] + 10 - Num1[i] ;
134             }else Result[i] = Num2[i] - Num1[i] ;    
135             //printf("%d %d\n",Result[i],carry);
136         }
137     
138         printf("结果:");
139         printf("%s-%s=",num1,num2);
140         printf("-");
141         for(i=maxnum-1;i>=0;i--)
142         {
143             if(Result[i]!=0)printf("%d",Result[i]);
144         }
145         printf("\n");
146     }else{//被减数大
147         for(i=minnum;i<maxnum;i++)Num2[i] = 0;//补0
148         for(i=0;i<maxnum;i++)
149         {
150             if(Num1[i]<Num2[i])//需要借位
151             {
152                 j = i +1;
153                 while(j==0)
154                 {
155                     Num1[j] += 9;
156                     j++;
157                 }
158                 Num1[j]--;
159                 Result[i] = Num1[i] + 10 - Num2[i] ;
160             }else Result[i] = Num1[i] - Num2[i] ;    
161             //printf("%d %d\n",Result[i],carry);
162         }
163     
164         printf("结果:");
165         printf("%s-%s=",num1,num2);
166         for(i=maxnum-1;i>=0;i--)
167         {
168             if(Result[i]!=0)printf("%d",Result[i]);
169         }
170         printf("\n");
171     }
172 }
173 int main()
174 {
175     int select,con;
176     printf("-----------两个长整数相加减------------\n");
177     do{
178         printf("        -----------------------\n");
179         printf("       |--------1::加法-------|\n");
180         printf("       |--------0::加法-------|\n");
181         printf("        -----------------------\n");
182         printf("你的选择:");
183         scanf("%d",&select);
184         if(select==1)
185         {
186             Add();
187         }else {
188             Sub();
189         }
190         printf("        -----------------------\n");
191         printf("       |--------1::继续-------|\n");
192         printf("       |--------0::退出-------|\n");
193         printf("        -----------------------\n");
194         printf("你的选择:");
195         scanf("%d",&con);
196     }while(con==1);
197     return 0;
198 }

 

posted @ 2015-12-27 06:09  指间ゝ繁华初逝的格调  阅读(221)  评论(0编辑  收藏  举报