——————————————
时隔已久,来水一篇。呜呜呜,干活了干活了。这个题是要C语言来写。有无简化的方法,请不要大意地提出来!
做的是高精度的整型加减法,我愿称之为 A+B 问题。
→关于这个题要注意的点写在下面辽:D
——————————————
问题描述:
高精度计算
涉及知识点:
数组、流程控制、函数等
要求:
用整型数组表示10进制大整数(超过2^32的整数),数组的每个元素存储大整数的一位数字,实现大整数的加减法。
要点:
- 由字符型数组读取、转化为整型数组。
- 加法进位、减法借位。
- A、B本身带有符号。
- A、B大小对比
输出样例:
代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int a[1000]={
0},b[1000]={
0},c[1000]={
0};
char symbol_a,symbol_b,symbol_c;
int change_numA(char num1[],int length){
int i,j;
if(num1[0]=='+'||num1[0]=='-'){
symbol_a=num1[0];
for(i=length-1,j=0;i>0;i--,j++)a[j]=num1[i]-'0';
}
else {
for(i=length-1,j=0;i>=0;i--,j++)a[j]=num1[i]-'0';
}
return *a;
}
int change_numB(char num1[],int length){
int i,j;
if(num1[0]=='+'||num1[0]=='-'){
symbol_b=num1[0];
for(i=length-1,j=0;i>0;i--,j++)b[j]=num1[i]-'0';
}
else {
for(i=length-1,j=0;i>=0;i--,j++)b[j]=num1[i]-'0';
}
return *b;
}
int add_num(int a[],int b[],int len_c){
int i;
for(i=0;i<(len_c+1);i++){
c[i]+=a[i]+b[i];
c[i+1]=c[i]/10;
c[i]=c[i]%10;
}
return *c;
}
int minus_num(int a[],int b[],int len_c){
int i;
for(i=0;i<len_c;i++){
if(a[i]<b[i]){
a[i+1]--;
a[i]=a[i]+10;
}
c[i]=a[i]-b[i];
}
return *c;
}
int main(){
char num1[1000],num2[1000],order[10];
int i,j,length_c,cn=0;
printf("Tell me add'+' or minus'-':\n");
scanf("%c",&symbol_c);
printf("Please give me two numbers:\n");
scanf("%s%*c%s",num1,num2);
int length_a=strlen(num1);
int length_b=strlen(num2);
//first:turn into numbrs
change_numA(num1,length_a);
change_numB(num2,length_b);
//change the length of it
if(symbol_a!='\0')length_a--;
if(symbol_b!='\0')length_b--;
//compare a & b
if(length_a>=length_b)length_c=length_a;
else length_c=length_b;
//think about symbol &size of number
if(symbol_a=='+'||symbol_a=='\0'){
if(symbol_b==symbol_c||symbol_b=='\0'&&symbol_c=='+'){
add_num(a,b,length_c);
length_c++;
}
else if(symbol_b=='\0'&&symbol_c=='-'){
if(length_a<length_b)cn=1;
for(j=length_c-1,cn=0;length_a==length_b&&j>=0;j--){
if(strcmp(order,"add")==0)break;
if(a[j]<b[j]){
//judge b>a
cn=1;
break;
}
}
if(cn==1){
printf("-");
minus_num(b,a,length_c);
}
else minus_num(a,b,length_c);
}
else {
if(length_a<length_b)cn=1;
for(j=length_c-1,cn=0;length_a==length_b&&j>=0;j--){
if(strcmp(order,"add")==0)break;
if(a[j]<b[j]){
//judge b>a
cn=1;
break;
}
}
if(cn==1){
printf("-");
minus_num(b,a,length_c);
}
else minus_num(a,b,length_c);
}
}
else{
if(symbol_b==symbol_c||symbol_b=='\0'&&symbol_c=='+'){
if(length_a>length_b)cn=1;
for(j=length_c-1,cn=0;length_a==length_b&&j>=0;j--){
if(a[j]>b[j]){
//judge a>b好了
cn=1;
break;
}
}
if(cn==1){
printf("-");
minus_num(a,b,length_c);
}
else minus_num(b,a,length_c);
}
else if(symbol_b=='\0'&&symbol_c=='-'){
printf("-");
add_num(a,b,length_c);
}
else {
printf("-");
add_num(a,b,length_c);
length_c++;
}
}
//关于结果c的行数问题
for(i=length_c-1;c[i]==0&&i!=0;i--);
for(;i>=0;i--)printf("%d",c[i]);
system("pause");
return 0;
}
文章评论