大数是算法语言中的数据类型无法表示的数,其位数超过最大数据类型所能表示的范围,所以,在处理大数问题时首先要考虑的是怎样存储大数,然后是在这种存储方式下其处理的实现方法。
一般情况下大数的存储是采用字符数组来存储,即将大数当作一个字符串来存储,而对其处理是按其处理规则在数组中模拟实现。
?四 大数除法。
?
大数除法,应该算是四则运算里面最难的一种了。不同于一般的模拟,除法操作步数模仿手工除法,而是利用减法操作实现的。
其基本思想是反复做除法,看从被除数里面最多能减去多少个除数,商就是多少。
逐个减显然太慢,要判断一次最多能减少多少个整的10的n次方。
以7546除23为例。
先减去23的100倍,就是2300,可以减3次,余下646。?? 此时商就是300;
然后646减去23的10倍,就是230,可以减2次,余下186。此时商就是320;
然后186减去23,可以减8次,此时商就是328.
?
根据这个思想,不难写出下面的代码。
还是那句话,可能算法效率不是很高。但是常规解题思路一般就是这样了。
如果以后有能力,有时间了。? 我会试着去优化。
?
ps:大数系列学习资源来自 <c程序设计竞赛实训教程>一书和一些大牛的博客。
?
- #include<stdio.h>??
- #include<string.h>??
- #include<stdlib.h>??
- #define?MaxLen?200??
- ??
- ??
- //?结果存在p1中,返回值代表结果的长度??
- //不够减?返回-1?正好够?返回0??
- int?SubStract(?int?*p1,?int?*p2,87); background-color:inherit; font-weight:bold">int?len1,87); background-color:inherit; font-weight:bold">int?len2?)??
- {??
- ????int?i;??
- ????if(?len1?<?len2?)??
- ????????return?-1;??
- if(?len1?==?len2?)??
- ????{??????????????????????????
- ????????for(?i=len1-1;?i>=0;?i--?)??
- ????????{??
- ????????????if(?p1[i]?>?p2[i]?)?????
- ????????????????break;??
- else?if(?p1[i]?<?p2[i]?)???
- ????????}??
- ????}??
- for(?i=0;?i<=len1-1;?i++?)????
- ????{??
- ????????p1[i]?-=?p2[i];??
- if(?p1[i]?<?0?)????????????
- ????????{??
- ????????????p1[i]?+=?10;???????????
- ????????????p1[i+1]--;?????????????
- ????????}??
- ????}??
- ????for(?i=len1-1;?i>=0;?i--?)?????????
- if(?p1[i]?)????????????????????
- ????????????return?(i+1);?????????
- return?0;????????????????????
- }??
- int?main()??
- {??
- ????int?n,?k,?i,?j;???????????????
- //大数位数??
- int?nTimes;???????????????????
- int?nTemp;????????????????????
- int?num_a[MaxLen];????????????
- int?num_b[MaxLen];????????????
- int?num_c[MaxLen];????????????
- char?str1[MaxLen?+?1];????????
- char?str2[MaxLen?+?1];????????
- ??
- ????scanf("%d",&n);??
- while?(?n-->0?)??
- ????{??
- ????????scanf("%s",?str1);??????????
- ????????scanf("%s",?str2);??
- for?(?i=0;?i<MaxLen;?i++?)?????
- ????????????num_a[i]?=?0;??
- ????????????num_b[i]?=?0;??
- ????????????num_c[i]?=?0;??
- ??
- ????????len1?=?strlen(str1);????
- ????????len2?=?strlen(str2);??
- for(?j=0,?i=len1-1;?i>=0;?j++,?i--?)??
- ????????????num_a[j]?=?str1[i]?-?'0';????
- ????????????num_b[j]?=?str2[i]?-?'0';??
- if(?len1?<?len2?)?????
- ????????????printf("0n");??
- continue;?????
- ????????nTimes?=?len1?-?len2;??????
- for?(?i=len1-1;?i>=0;?i--?)??????
- if?(?i>=nTimes?)??
- ????????????????num_b[i]?=?num_b[i-nTimes];??
- else???????????????????????
- ????????????????num_b[i]?=?0;??
- ????????len2?=?len1;??
- for(?j=0;?j<=nTimes;?j++?)????????
- while((nTemp?=?SubStract(num_a,num_b?+?j,len1,len2?-?j))?>=?0)??
- ????????????{??
- ????????????????len1?=?nTemp;????????
- ????????????????num_c[nTimes-j]++;??
- ????????????}??
- ??????????
- for(?i=MaxLen-1;?num_c[i]==0?&&?i>=0;?i--?);??
- if(?i>=0?)??
- for(?;?i>=0;?i--?)??
- ????????????????printf("%d",?num_c[i]);??
- else??
- ????????????printf("0");??
- ????????printf("n");??
- return?0;??
- }??