标签:
大数问题 基本都可以归结到大数相加上来
做大数问题 要返璞归真 回到小学里做加法
把数字读入到字符串数组中 每个位数一 一相加 主要考虑进位问题
如果整数的话 左边用零补齐
小数的话要左右分开补齐零 小数的零要补右边
HDOJ题目在1002 1753
下面给代码 整数相加
#include <stdio.h> #include <string.h> #define SIZE 1000 void convert(char a[],char newa[]) { memset(newa,‘0‘,SIZE); strcpy(newa+SIZE-strlen(a),a); } void calcul(char newa[],char newb[],char res[]) { memset(res,‘0‘,SIZE+1); int c=0,i; char temp; for(i=SIZE-1;i>=0;i--) { temp=newa[i]+newb[i]-‘0‘+c; if(temp>‘9‘) { temp=temp-10 ; c=1; } else c=0; res[i+1]=temp; } res[SIZE+1]=‘\0‘; } void printres(char a[],char b[],char res[]) { printf("%s + %s = ",a,b); int i; for(i=0;i<SIZE+2;i++) { if(res[i]!=‘0‘) { puts(res+i);break;} } } int main() { int n,i; scanf("%d",&n); char a[SIZE+1],b[SIZE+1]; char newa[SIZE+1],newb[SIZE+1],res[SIZE+2]; for(i=0;i<n;i++) { scanf("%s %s",a,b); convert(a,newa); convert(b,newb); calcul(newa,newb,res); printf("Case %d:\n",i+1); printres(a,b,res); if(i<n-1) printf("\n"); } }
小数相加 可能我写的比较繁琐
1 #include "stdio.h" 2 #include "string.h" 3 #define N 400 4 void convert(char ch[],char new1[]) 5 { 6 char temp[N+2]; 7 char ch1[2*N+1]; 8 int flag=0; 9 strcpy(ch1,ch); 10 int pos=0,i; 11 memset(temp,‘0‘,N+1); 12 memset(new1,‘0‘,2*N+1); 13 for(pos=0;pos<strlen(ch);pos++) 14 { 15 if(ch[pos]==‘.‘) 16 { 17 flag=1; 18 break; 19 } 20 } 21 if(flag==0) 22 { 23 strcat(ch1,".0") ; 24 } 25 ch[pos]=‘\0‘; 26 strcpy(new1+N-strlen(ch),ch); 27 ch[pos]=‘.‘; 28 for(pos,i=0;pos<strlen(ch1);pos++,i++) 29 { 30 temp[i]=ch1[pos]; 31 32 } 33 temp[N+1]=‘\0‘; 34 35 strcat(new1,temp); 36 } 37 void calcul(char newa[],char newb[],char res[]) 38 { 39 memset(res,‘0‘,N*2+2); 40 int c=0,i; 41 char temp; 42 for(i=N*2;i>=0;i--) 43 { 44 if(newa[i]!=‘0‘||newb[i]!=‘0‘||c==1) 45 { 46 temp=newa[i]+newb[i]-‘0‘+c; 47 if(newa[i]==‘.‘) 48 { res[i+1]=‘.‘; continue; } 49 50 if(temp>‘9‘) 51 { temp=temp-10 ; c=1; } 52 else 53 c=0; 54 res[i+1]=temp; 55 } 56 } 57 for(i=N*2+1;i>=0;i--) 58 { 59 if(res[i]!=‘0‘) 60 break; 61 } 62 res[i+1]=‘\0‘; 63 64 } 65 void printres(char a[],char b[],char res[]) 66 { 67 int i,pos,flag=0; 68 for(i=0;i<N*2+1;i++) 69 { 70 if(res[i]==‘.‘ ) 71 { break;} 72 } 73 pos=i; 74 res[pos]=‘\0‘; 75 for(i=0;i<strlen(res);i++) 76 { 77 if(res[i]!=‘0‘ ) 78 { flag=1; printf("%s",res+i); break;} 79 } 80 if(flag==0) 81 printf("0"); 82 res[pos]=‘.‘; 83 if(res[pos+1]!=‘\0‘) 84 printf("%s",res+pos); 85 printf("\n"); 86 } 87 main() 88 { 89 char a[2*N+1],b[2*N+1]; 90 char newa[2*N+1],newb[2*N+1],res[2*N+2]; 91 memset(a,‘0‘,2*N); 92 memset(b,‘0‘,2*N); 93 while(scanf("%s %s",a,b)!=EOF) 94 { 95 convert(a,newa); 96 convert(b,newb); 97 calcul(newa,newb,res); 98 if(res[0]!=‘\0‘) 99 printres(a,b,res); 100 else 101 printf("0\n"); 102 } 103 }
标签:
原文地址:http://www.cnblogs.com/threezj/p/4648897.html