Skip to content

Commit 1f2fc52

Browse files
author
wangzhijie01
committed
2020-4-27
1 parent 00e4efe commit 1f2fc52

File tree

2 files changed

+106
-0
lines changed

2 files changed

+106
-0
lines changed
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
/*************************************************************************
2+
> File Name: hugeint.c
3+
> Author: wangzhijie
4+
5+
> Created Time: 2020年04月27日 星期一 11时06分14秒
6+
************************************************************************/
7+
#include <stdio.h>
8+
#include <math.h>
9+
#include <string.h>
10+
#include <stdlib.h>
11+
12+
#define ARRSIZE 100
13+
14+
unsigned char num1[ARRSIZE] = {
15+
0
16+
};
17+
unsigned char num2[ARRSIZE] = {
18+
0
19+
};
20+
21+
22+
int *hugesum(unsigned char *an1, unsigned char *an2)
23+
{
24+
if(NULL == an1 || NULL == an2)
25+
return NULL;
26+
27+
int *sum = malloc(sizeof(int) * 2 * ARRSIZE);
28+
if(NULL == sum)
29+
return NULL;
30+
memset(sum, 0 , 2 * ARRSIZE * sizeof(int));
31+
32+
//计算出大整数的有效位
33+
int validnum1 = 0, validnum2 = 0, i, j, power;
34+
for(i = 0; i < ARRSIZE; i++){
35+
if(an1[i] != 0xff){
36+
validnum1++;
37+
}
38+
if(an2[i] != 0xff){
39+
validnum2++;
40+
}
41+
if(an1[i] == 0xff && an2[i] == 0xff)
42+
break;
43+
}
44+
printf("validnum1=%d, validnum2=%d\n",validnum1,validnum2);
45+
46+
//用乘数和被乘数每一位进行乘法运算
47+
for(i = 0; i < validnum1; i++){
48+
for(j = 0; j < validnum2; j++){
49+
power = (int)pow(10, i+j);
50+
sum[i+j] += an1[i] * an2[j];
51+
}
52+
}
53+
54+
//开始对sum进行进位
55+
for(i = 0; i < (2 * ARRSIZE); i++){
56+
if(sum[i] > 9){
57+
sum[i + 1] += sum[i] / 10;
58+
sum[i] = sum[i] % 10;
59+
}
60+
}
61+
62+
for(i = 2 * ARRSIZE - 1; i >= 0; i--){
63+
if(sum[i] != 0)
64+
break;
65+
}
66+
for(j = i; j >= 0; j--){
67+
printf("%d",sum[j]);
68+
}
69+
70+
printf("\n");
71+
return sum;
72+
}
73+
74+
int main()
75+
{
76+
char buf[101] = {
77+
0
78+
};
79+
memset(num1, 0xff, ARRSIZE);
80+
memset(num2, 0xff, ARRSIZE);
81+
int i, j;
82+
83+
while(scanf("%s", buf)){
84+
if(num1[0] == 0xff){
85+
int size = strlen(buf);
86+
for(i = size - 1, j = 0; i >= 0; i--,j++){
87+
num1[i] = buf[j] - 48;
88+
}
89+
}else if(num2[0] == 0xff){
90+
int size = strlen(buf);
91+
for(i = size - 1, j = 0; i >= 0; i--, j++){
92+
num2[i] = buf[j] - 48;
93+
}
94+
}
95+
memset(buf, 0, sizeof(buf));
96+
97+
if(num1[0] != 0xff && num2[0] != 0xff){
98+
int *sum = hugesum(num1, num2);
99+
}
100+
}
101+
102+
return 0;
103+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
1:输入的buf位置顺序需要调换
2+
2:核心思想,需要对两个数每个位置相乘存储在sum中,然后对每个位置的数字进行进位,类似方法
3+
就是笔算乘法的做法

0 commit comments

Comments
 (0)