简单的大数运算:HDU1042,1047
在32位机器里,int型数据的表示范围为9位以内的整数,超过这个范围可用double,但浮点型数据与整数类型不同,无法实现取余运算,此外也还有double无法表示的数据,比如超过1000为的整数。这些数据都无法用常规方法处理,这些精度很高的度通称为高精度数或大数。处理这种问题时,一般会用数组(int或char型)的元素模拟每一位并进行运算。
HDU1047 首先输入数n,接下来输入n组数据,每组数据至多100行,由0结束,求这些数据的和
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 using namespace std; 5 int answer[105];//存放计算结果 6 char buffer[105];//存放输入的代码 7 int arr[105][105];//存放有字符转换过来的初始数据 8 int main() 9 { 10 int n,m;//数据组数,每组数据行数 11 int max,len;//存放最长数据长度,测量每次输入的数据长度 12 scanf("%d",&n); 13 while(n--) 14 { 15 int carry=0; 16 int sum;//每位数据的加和 17 max=-1; 18 m=0; 19 memset(answer,0,sizeof(answer)); 20 memset(arr,0,sizeof(arr)); 21 for(int i=0;i<100;i++) 22 { 23 24 scanf("%s",buffer); 25 if(strcmp(buffer,"0")==0) 26 break; 27 len=strlen(buffer); 28 m++; 29 if(len>max) max=len; 30 for(int j=0;j<len;j++)//将各行数据存储到arr中,以后加和 31 { 32 arr[i][j]=buffer[len-1-j]-'0'; 33 } 34 } 35 sum=0;//负责进位 36 for(int i=0;i<max+2;i++) 37 { 38 sum=sum/10; 39 for(int j=0;j<m;j++) 40 sum+=arr[j][i]; 41 answer[i]=sum%10; 42 } 43 for(int i=max+2;i>=0;i--) 44 if(answer[i]!=0) 45 { 46 carry=i;//找到第一个非零数据 47 break; 48 } 49 for(;carry>=0;carry--) 50 printf("%d",answer[carry]); 51 printf("\n"); 52 if(n>0) 53 printf("\n"); 54 } 55 return 0; 56 }
HDU1042 给一整数 N(0 ≤ N ≤ 10000),求阶乘
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <math.h> 5 #include <time.h> 6 using namespace std; 7 long long start,end; 8 int data[20001];//需要知道10000的阶乘的范围int main() 9 { 10 int n; 11 int c;//处理进位 12 while(scanf("%d",&n)!=EOF) 13 { 14 //start=clock(); 15 memset(data,0,sizeof(data)); 16 data[0]=1; 17 for(int i=2;i<=n;i++) 18 { 19 c=0; 20 for(int j=0;j<20000;j++) 21 { 22 data[j]=data[j]*i+c; 23 c=data[j]/100000;//对10进位超时 24 data[j]%=100000; 25 } 26 } 27 int k; 28 for(k=20000;k>=0;k--)//找到第一个非零数 29 if(data[k]!=0) 30 break; 31 printf("%d",data[k]); 32 k--; 33 for(;k>=0;k--) 34 printf("%05d",data[k]); 35 printf("\n"); 36 //end=clock(); 37 //printf("s=%lld\n",end-start); 38 39 } 40 return 0; 41 }