大数是算法语言中的数据类型无法表示的数,其位数超过最大数据类型所能表示的范围,所以,在处理大数问题时首先要考虑的是怎样存储大数,然后是在这种存储方式下其处理的实现方法。
一般情况下大数的存储是采用字符数组来存储,即将大数当作一个字符串来存储,而对其处理是按其处理规则在数组中模拟实现。
一 ?大数减法。
大数减法的处理思路和加法差不多。先判断a,b两数的大小,然后按条件进行逐位计算,并且处理借位。此时借位的条件是某位的值小于0,则往前借位。
思路很常规,也不难,直接上代码。
水平有限,现在只能写出这样比较麻烦的算法。?? 希望。以后有能力了,有时间了再去优化。
?
- #include<stdio.h>??
- #include<string.h>??
- ??
- int?compare(char?*str_a,char?*str_b)??
- {??
- ????int?len_a,?len_b;??
- ????len_a?=?strlen(str_a);????????????
- ????len_b?=?strlen(str_b);??
- ????if?(?strcmp(str_a,?str_b)?==?0?)??????
- ????????return?0;??
- if?(?len_a?>?len_b?)??
- return?1;??
- else?if(?len_a?==?len_b?)??
- return?strcmp(str_a,?str_b);??
- else??
- return?-1;??
- }??
- int?main()??
- int?f,?n;??
- ????int?i,?k,?len_a,?len_b;??
- char?str_a[1000],?str_b[1000];??
- int?num_a[1000]?=?{0};????????????
- int?num_b[1000]?=?{0};??
- int?num_c[1000];??
- ??
- ????while?(scanf("%s%s",str_a,str_b)!=?EOF)???
- ????{??
- ????????len_a?=?strlen(str_a);???????????
- ????????len_b?=?strlen(str_b);??
- ????????k?=?len_a?>?len_b??len_a:len_b;??????????????????????
- ????????num_c[0]?=?0;??
- ????????f?=?0;??
- ????????n?=?compare(str_a,str_b);??
- for?(i=0;i<len_a;i++)?????????????????????
- ????????????num_a[i]?=?str_a[len_a-i-1]?-?'0';??
- for?(i=0;i<len_b;i++)??
- ????????????num_b[i]?=?str_b[len_b-i-1]?-?'0';??
- ????????for?(i=0;i<k;i++)???????????
- ????????{??
- ????????????if?(n>=0)??
- ????????????{??
- ????????????????if?(num_a[i]?>=?num_b[i])??
- ????????????????????num_c[i]?=?num_a[i]?-?num_b[i];??
- ????????????????{??
- ????????????????????num_c[i]?=?num_a[i]?-?num_b[i]?+?10;??
- ????????????????????num_a[i+1]--;??
- ????????????????}??
- ????????????}??
- if?(?num_b[i]?>=?num_a[i])??
- ????????????????????num_c[i]?=?num_b[i]?-?num_a[i];??
- ????????????????????num_c[i]?=?num_b[i]?-?num_a[i]?+?10;??
- ????????????????????num_b[i+1]--;??
- ????????}??
- if?(n<0)??????????????
- ????????????printf("-");??
- for?(i=k-1;?i>=0;?i--)??
- ????????{??
- ????????????if?(num_c[i])??
- ????????????????f?=?1;??
- if?(f?||?i?==?0?)??
- ????????????????printf("%d",num_c[i]);??
- ????????printf("n");??
- for?(i=0;i<k;i++)?????????????????
- ????????????num_a[i]?=?0;??
- ????????????num_b[i]?=?0;??
- ????}??
- return?0;??
- }??
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|