简单的大数运算: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 }

 

posted on 2013-01-12 20:47  行者1992  阅读(806)  评论(0编辑  收藏  举报