参考:《剑指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;
}