参考:《剑指offer》以及网络相关博客。
对于大数超过我们所有数据类型所能表达的范围时,我们将其称为大数。对此我们的统一处理方法就是将其转换数组来处理,下面我们将通过两个实例展示此类问题的处理方法。
1,大数相乘:
/* 1,大数相乘的主要思想是将两个大数以字符串的形式表示 按照字符串的形式相乘; 2,将其存放在数组中; -----------------------同时回顾一下字符转换成数----------num+= num*10+ a[i] - '0'; Ok let's begin our fun; 存在问题该算法没有考虑符号问题 */ #include<stdio.h> #include <string.h> #define Max 100 void getdigit(int a[],//用数组来存放字符串转换过来的数 char s[] //存放字符串的数组 ) { int temp; int len = strlen(s); for(int i = 0; i < len; i++) a[i] = s[i] - '0'; //减去'0'?????不见去得到的是ASSIC码 //数字反转 int n1 = 0; int n2 = len - 1; while(n1 < n2) { temp = a[n1]; a[n1] = a[n2]; a[n2] = temp; n2--; n1++; } } void Multi(int a[],int len1,//存放其中一个大数 int b[],int len2,//存放另一个大数 int c[] //存放最终的结果 ) { for(int i = 0; i < len1; i++) { for(int j=0; j< len2; j++) { c[i+j]+= a[i] * b[j]; // printf("%d",c[j]); } // printf("\n"); } //下面处理进位问题 for(i = 0; i< 2*Max; i++) { c[i+1] += c[i]/10; c[i] = c[i] % 10; } } void main() { char s1[Max]; //第一个字符串 char s2[Max]; //第二个字符串 int a1[Max] = {0}; // 转换后的第1个整数!!!!开始时没有注意到初始化导致程序乱码,以后要注意开辟空间后记住:::立即初始化 int a2[Max] = {0}; // 转换后的第二整数 int c[3*Max] = {0}; // 相乘后的总和 printf("输入第一个字符串"); scanf("%s",s1); printf("输入第二个字符串"); scanf("%s",s2); printf("\n"); int len1 = strlen(s1); int len2 = strlen(s2); getdigit(a1,s1); getdigit(a2,s2); Multi(a1,len1,a2,len2,c); int j = 2*Max -1; while(c[j] == 0) j--; //找到第一个不是0的数输出注意我们的输出顺序 while(j >= 0) { printf("%d",c[j--]); } }
2,输出从1到n位的所有数:假如输入3则输出为1 2...... 999的所有数;直接上代码:
// the computation of Big Num #include<stdio.h> #include<stdlib.h> #include<string.h> //enum bool {false=0,true}; //我的linux下gcc没有bool型想通过enum定义一个可是老是报错 void BigNum(int n) //大数处理 { char *String = (char *)malloc(sizeof(char)*n+1); 开辟能够容纳n位的空间 memset(String,0+'0',sizeof(char)*n); //赋值为‘0’,由于‘\0’ASSIC码就是0所以不能赋值为0 String[sizeof(char)*n + 1] = '\0'; while(Compute(String)) { printf("%s\n",String); } } int Compute(char *String) //每次加一 { unsigned int len = strlen(String); int j=0; int n1 = 0; int n = 1; int Isvalid = 1; //判断有没有溢出0表示溢出 int sum; for(j=len -1; j>=0; j--) { sum = String[j] - '0' + n+ n1; if(10==sum) { sum = 0; n1 = 1; if(0==j) { Isvalid = 0; break; } String[j] = sum + '0'; } else { String[j] = sum + '0'; break; } n = 0; } return Isvalid; } int main() { int n = 10; BigNum(n); return 0; }