1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188 | #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
/*选择排序——元素p[a]~p[b]升序排序*/
void selesort(int p[], int a, int b);
/*冒泡排序——整体升序排序*/
void bubsort(int p[], int n);
/*求余矩阵——输入矩阵A,求删掉第0列第i行的矩阵B,其中B是一个空的地址,用来存放矩阵元素*/
void smallermatrix(int a[], int b[], int n, int i);
/*求n阶方阵A行列式——A以一维数组形式输入*/
int det(int a[], int n);
/* 判断素数——输入一个正整数n,是素数返回1,不是返回0 */
int sushu(int n);
/* 矩阵相乘——输入一维数组A m*n, B n*p, 空的已经申请好的数组C m*p,将A*B放在C中 */
void matrixmul(int a[], int b[], int c[], int m, int n, int p);
/* 矩阵转置——输入一维数组A m*n,空的已经申请好的数组C n*m,将A转置放在C中 */
void matrixtran(int a[], int c[], int m, int n);
/*选择排序——元素p[a]~p[b]升序排序*/
void selesort(int p[], int a, int b)
{
int i, j, k;
int d; //用来交换的变量
for (i = a; i <= b - 1; i++) //对最后一个元素p[n-1]不用操作
{
k = i; //记录现在到哪里了
for (j = i + 1; j <= b; j++)
if (p[j] < p[k])
k = j; //从i的下一个开始找,如果有比i小元素(第j个)的就让k为j
//本质目的是找出i后面最小的一个
if (k != i) //如果i项不是最小的,那么换!
{
d = p[i];
p[i] = p[k];
p[k] = d;
}
}
}
/*冒泡排序——整体升序排序*/
void bubsort(int p[], int n)
{
int m, k; //m记录最右边的项,k记录最左边的项
int j, i;
int d; //用来交换元素
k = 0;
m = n - 1;
while (k < m)
{
j = m - 1;
m = 0;
for (i = k; i <= j; i++) //让最大的跑到右边去
if (p[i] > p[i + 1])
{
d = p[i];
p[i] = p[i + 1];
p[i + 1] = d;
m = i; //相当于m在原来的基础上减一
}
/*倒着再排*/
j = k + 1;
k = 0;
for (i = m; i >= j; i--) //让最小的跑到左边去
if (p[i - 1] > p[i])
{
d = p[i];
p[i] = p[i - 1];
p[i - 1] = d;
k = i; //相当于k在原来的基础上加一
}
}
}
/*求余矩阵——输入矩阵A,求删掉第0列第i行的矩阵B,其中B是一个空的地址,用来存放矩阵元素*/
void smallermatrix(int a[], int b[], int n, int i)
{
int p, q; //p是A的行数,q是B的列数
for (p = 0; p <= n - 1; p++)
{
if (p < i) //在第i行之前,直接赋值
for (q = 0; q <= n - 2; q++)
b[p * (n - 1) + q] = a[p * n + q + 1];
if (p > i) //在第i行之后,b那里不能往下跳,减个1就行了
for (q = 0; q <= n - 2; q++)
b[(p - 1) * (n - 1) + q] = a[p * n + q + 1];
}
}
/*求n阶方阵A行列式——A以一维数组形式输入*/
int det(int a[], int n) //需要使用上面的smallermatrix函数
{
int i = 0, j = 0;
int sum = 0;
int *b;
int flag = 1;
if (n == 2)
return ((a[0] * a[3]) - (a[1] * a[2])); //针对二阶行列式直接上公式
else
{
for (sum = 0, flag = 1, i = 0; i <= n - 1; i++)
{
b = (int *)malloc((n - 1) * (n - 1) * sizeof(int)); //申请B的内存
smallermatrix(a, b, n, i); //求删掉A第0列第i行元素的矩阵,给B
sum += flag * (a[i * n] * det(b, n - 1)); //累加
flag *= -1; //每往下一行都要变号,相当于-1的某次方
free(b);
}
return sum;
}
}
/* 判断素数——输入一个正整数n,是素数返回1,不是返回0 */
int sushu(int n)
{
int i, flag;
if (n == 1)
return 0;
if (n == 2)
return 1;
for (i = 2, flag = 1; i <= sqrt(n) && flag == 1; i++)
{
if (n % i == 0)
flag = 0; //有一个能整除n,n就不是素数了
}
return flag;
}
/* 矩阵相乘——输入一维数组A m*n, B n*p, 空的已经申请好的数组C m*p,将A*B放在C中 */
void matrixmul(int a[], int b[], int c[], int m, int n, int p)
{
int i, j, k, sum;
for (i = 0; i <= m - 1; i++)
{
for (j = 0, sum = 0; j <= p - 1; j++)
{
for (sum = 0, k = 0; k <= n - 1; k++)
{
sum += a[i * n + k] * b[k * p + j];
}
c[i * p + j] = sum;
}
}
}
/* 矩阵转置——输入一维数组A m*n,空的已经申请好的数组C n*m,将A转置放在C中 */
void matrixtran(int a[], int c[], int m, int n)
{
int i, j;
for (i = 0; i <= n - 1; i++)
{
for (j = 0; j <= m - 1; j++)
{
c[i * m + j] = a[j * n + i];
}
}
}
/* 大型整数相乘 */
int main()
{
char num1[1000], num2[1000];
int a[2000] = {0};
int n, i, j, k, l1, l2;
printf("please input two integers:\n");
scanf("%s%s", num1, num2);
printf("%s*%s=", num1, num2); //为了之后的输出
l1 = strlen(num1);
l2 = strlen(num2);
/* 将字符转化为数字 */
for (n = 0; n < l1; n++)
num1[n] -= '0';
for (n = 0; n < l2; n++)
num2[n] -= '0';
/* 第l1-1位*第l2-1位放在第0位(乘积最小的一位),第0位*第0位放在第l1-1+l2-1位(乘积最大的一位) */
for (i = 0; i <= l1 - 1; i++)
for (j = 0; j <= l2 - 1; j++)
a[l1 - 1 - i + l2 - 1 - j] += num1[i] * num2[j];
/* 从最小的一位开始——低位置为单位数,并将十位进到高位 */
for (n = 0; n <= l1 + l2; n++)
{
a[n + 1] += a[n] / 10;
a[n] %= 10;
}
/* 从最后往前找第一个非零位 */
for (n = l1 + l2 + 1; a[n] == 0; n--)
k = n;
/* 从非零位的前一位开始打印 */
for (n = k - 1; n >= 0; n--)
printf("%d", a[n]);
printf("\n");
system("pause");
}
|