設計程式按從大到小的次序依次輸出函式f(a,b)=2*a*a+b*b的最小的100個函式值及相應的兩個引數的值,其中a和b均為自然數。
要求:(1)作為函式值的存盤結構應盡可能節省空間。
(2)所設計演算法及整個程式的時間復雜度應盡可能小。
uj5u.com熱心網友回復:
僅供參考:#include <stdio.h>
#include <stdlib.h>
struct data
{
int a;
int b;
};
int my_cmp(const void *i, const void *j)
{
struct data *d1 = (struct data *)i;
struct data *d2 = (struct data *)j;
int x = 2 * d1->a * d1->a + d1->b * d1->b;
int y = 2 * d2->a * d2->a + d2->b * d2->b;
return x - y;
}
int main(void)
{
int i, j, value, c = 0;
struct data d[200];
for(i=1; i<=10; i++)
{
for(j=1; j<=20; j++)
{
d[c].a = i;
d[c].b = j;
c++;
}
}
qsort(d, 200, sizeof(struct data), my_cmp);
for(c=0; c<100; c++)
{
value = 2 * d[c].a * d[c].a + d[c].b * d[c].b;
printf("%d:\t%d\t%d\t%d\n", c, d[c].a, d[c].b, value);
}
return 0;
}
運行結果:
E:\Workspace>tcc -run demo.c
0: 1 1 3
1: 1 2 6
2: 2 1 9
3: 1 3 11
4: 2 2 12
5: 2 3 17
6: 1 4 18
7: 3 1 19
8: 3 2 22
9: 2 4 24
10: 1 5 27
11: 3 3 27
12: 4 1 33
13: 2 5 33
14: 3 4 34
15: 4 2 36
16: 1 6 38
17: 4 3 41
18: 3 5 43
19: 2 6 44
20: 4 4 48
21: 5 1 51
22: 1 7 51
23: 3 6 54
24: 5 2 54
25: 2 7 57
26: 4 5 57
27: 5 3 59
28: 1 8 66
29: 5 4 66
30: 3 7 67
31: 4 6 68
32: 2 8 72
33: 6 1 73
34: 5 5 75
35: 6 2 76
36: 6 3 81
37: 4 7 81
38: 3 8 82
39: 1 9 83
40: 5 6 86
41: 6 4 88
42: 2 9 89
43: 4 8 96
44: 6 5 97
45: 3 9 99
46: 5 7 99
47: 7 1 99
48: 7 2 102
49: 1 10 102
50: 7 3 107
51: 6 6 108
52: 2 10 108
53: 4 9 113
54: 7 4 114
55: 5 8 114
56: 3 10 118
57: 6 7 121
58: 7 5 123
59: 1 11 123
60: 2 11 129
61: 8 1 129
62: 5 9 131
63: 8 2 132
64: 4 10 132
65: 7 6 134
66: 6 8 136
67: 8 3 137
68: 3 11 139
69: 8 4 144
70: 1 12 146
71: 7 7 147
72: 5 10 150
73: 2 12 152
74: 8 5 153
75: 6 9 153
76: 4 11 153
77: 7 8 162
78: 3 12 162
79: 9 1 163
80: 8 6 164
81: 9 2 166
82: 5 11 171
83: 9 3 171
84: 1 13 171
85: 6 10 172
86: 4 12 176
87: 2 13 177
88: 8 7 177
89: 9 4 178
90: 7 9 179
91: 3 13 187
92: 9 5 187
93: 8 8 192
94: 6 11 193
95: 5 12 194
96: 7 10 198
97: 1 14 198
98: 9 6 198
99: 10 1 201
uj5u.com熱心網友回復:
可以用插入排序的方法一邊遍歷a,b遞增的 f 的結果,一邊保存最小的100個值int main( )
{
int a, b, f[3][100], t, i, j;
for (i=0; i<100; i++) f[2][i]=3*100*100;
for (a=0; a<10; a++) {
for (b=0; b<15; b++) {
t = 2*a*a+b*b;
for (i=0; t>f[2][i]&&i<100; i++); //插入排序查找插入位置
if (i<100) {
for (j=99; j>i; j--) {
f[0][j]=f[0][j-1];
f[1][j]=f[1][j-1];
f[2][j]=f[2][j-1];
}
f[0][i] = a;
f[1][i] = b;
f[2][i] = t;
}
}
}
for (i=0; i<100; i++) {
printf("f(%d,%d)=%d\n", f[0][i], f[1][i], f[2][i]);
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/228184.html
標籤:C語言
上一篇:請教一下,如何把16進制報文中2byte的數值放大10倍
下一篇:順序查找,折半查找
