码迷,mamicode.com
首页 > 其他好文 > 详细

高精度整数计算

时间:2018-02-12 13:59:16      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:初始化   数字   数组下标   转换   turn   har   color   下标   desc   

        这部分主要是学习一下计算  无法用内置整数类型来保存它的值(即位数多到long long都表示不了)  的整数的加法和乘法

        这里使用的方法是首先读入到一个char的数组里,然后初始化转换到int数组里,这样一位就对应数组的一项。

 下面这道题是加法计算,思路就是将对应两个数组位置的数与前一位的进位相加

 

题目描述

 

实现一个加法器,使其能够输出a+b的值。

输入描述:

输入包括两个数a和b,其中a和b的位数不超过1000位。

输出描述:

可能有多组测试数据,对于每组数据,
输出a+b的值。
示例1

输入

2 6
10000000000000000000 10000000000000000000000000000000

输出

8
10000000000010000000000000000000

 

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 
 5 char a[1001];
 6 char b[1001];
 7 int ansa[1001];  //转换后的a
 8 int ansb[1001];  //转换后的b
 9 int ans[1002];   //输出目标
10 
11 int main()
12 {
13     int i;
14     int lena,lenb;
15     int temp,fd;
16     while( scanf("%s%s",a,b)!=EOF)
17     {
18         lena = strlen(a);
19         lenb = strlen(b);
20         memset(ansa,0,1001);
21         memset(ansb,0,1001);
22         memset(ans,0,1002);
23         fd = 0;  //进位
24         for( i=0; i<lena; i++)
25             ansa[i] = a[lena-1-i]-0;  //注意这里是从后往前
26         for( i=0; i<lenb; i++)
27             ansb[i] = b[lenb-1-i]-0;
28 
29         if( lena<lenb ) lena = lenb;   //选择两个中较大数
30 
31         for( i=0; i<lena; i++)
32         {
33             temp = ansa[i]+ansb[i]+fd;
34             fd = temp/10;
35             ans[i] = temp%10;
36         }
37         if( fd ) printf("%d",fd);  //如果最后一次进位不为0则先输出
38         for( i=lena-1; i>=0; i--) printf("%d",ans[i]);
39         printf("\n");
40     }
41     return 0;
42 }

 

下面这道题是高精度的乘法,这个问题主要就是一个大数乘一个小数(两个大数相乘数字就很大了)

用小乘数乘大乘数的每一位数并加上来自低位的进位,从而得到该位的结果以及向高位的进位。

 

题目描述

 

 输入一个正整数N,输出N的阶乘。

输入描述:

正整数N(0<=N<=1000)

输出描述:

 输入可能包括多组数据,对于每一组输入数据,输出N的阶乘
示例1

输入

4
5
15

输出

24
120
1307674368000
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 
 5 int ans[10000];   //输出目标
 6 
 7 int main()
 8 {
 9     int n;
10     int i,j;
11     int temp,fd;
12     int index;
13     while( scanf("%d",&n)!=EOF)
14     {
15         memset(ans,0,10000);
16         index=0;  //数组下标,统计个数
17         ans[index++] = 1;  //阶乘第一位为1
18 
19         for( i=2; i<=n; i++)
20         {
21             fd=0;  //进位置0
22             for( j=0; j<index; j++)
23             {
24                 temp = ans[j]*i+fd;
25                 ans[j] = temp%10;
26                 fd = temp/10;
27             }
28             while( fd )
29             {
30                 //这里要小心最高位进位可能有多位
31                 ans[index++] = fd%10;
32                 fd /= 10;
33             }
34         }
35         for( i=index-1; i>=0; i--)
36         {
37             printf("%d",ans[i]);
38         }
39     }
40 
41     return 0;
42 }

 

 

高精度整数计算

标签:初始化   数字   数组下标   转换   turn   har   color   下标   desc   

原文地址:https://www.cnblogs.com/yuxiaoba/p/8443984.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!