把N拆分为若干个数的积

james_li85 2008-06-14 11:49:55
给定一个正整数250>=N>=2,求若干个数a1,a2...an(a1+…+an=N) 以便得到最大的lcm(a1*a2*…*an),lcm为最小公倍数
注:a1到an里的数不能为1,但可以等于N,此时lcm等于N
输入:
N
输出:
lcm
...全文
392 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
james_li85 2008-06-18
  • 打赏
  • 举报
回复
谢谢你们!!!!!!
tailzhou 2008-06-16
  • 打赏
  • 举报
回复
如果没有这个限制;

假设最优的拆分为a1,a2...an;
素数的序列为z1,z2...zn;

假如他们的公倍数有素因子zi^ni;

由于x*y>=x+y;从a1,a2...an都去掉素因子zi后得到新的拆分
a1',a2'.....an',zi^ni,s s>=0;

由于a1',a2'.....an',zi^ni的公倍数 等于a1,a2...an的公倍数;
并且a1',a2'.....an',zi^ni,s的公倍数不小于 a1',a2'.....an',zi^ni的公倍数;

所以新的拆分也是最优的;

一直进行下去。可得:
N=z1^n1+z2^n2+....zn^nn+s;
且z1^n1,z2^n2,....zn^nn+s的公倍数等于z1^n1,z2^n2,....zn^nn的公倍数;

但我对“也就是说xi必然是1,素数或素数的幂”有疑问;
觉得xi有可能 既不是1,也不是素数的幂;只是这不会影响到计算;













tailzhou 2008-06-16
  • 打赏
  • 举报
回复
“存在一种达到最大值的拆分方案,使得每个xi最多只有一个素因子(也就是说xi必然是1,素数或素数的幂),而且不同的xi之间互素(它们的素因子不同)。”

由于这个题目里面限制不能取1;
这个结论对这个题是不太正确的;


比如:
“4楼的答案在数33时可能会出现一些问题,如33的时候可以取4,5,6,7,11=4620,,而用您的算法得到的是3080”

4 与 6 就不互质;
  • 打赏
  • 举报
回复
“存在一种达到最大值的拆分方案,使得每个xi最多只有一个素因子(也就是说xi必然是1,素数或素数的幂),而且不同的xi之间互素(它们的素因子不同)。”
=====================================================

请教一下mathe,这是在你给出的链接里看到的,能简单证明一下吗?
mathe 2008-06-16
  • 打赏
  • 举报
回复
这个题目里面限制不能取1,这样的话代码要稍微修改一下.
mathe 2008-06-16
  • 打赏
  • 举报
回复
请看:
http://blog.csdn.net/mathe/archive/2006/11/27/1416907.aspx
前面部分结果,程序可以计算到n=40000以内
1,1 { }
2,2 { 2 }
3,3 { 3 }
4,4 { 2^2 }
5,6 { 2 3 }
7,12 { 2^2 3 }
8,15 { 3 5 }
9,20 { 2^2 5 }
10,30 { 2 3 5 }
12,60 { 2^2 3 5 }
14,84 { 2^2 3 7 }
15,105 { 3 5 7 }
16,140 { 2^2 5 7 }
17,210 { 2 3 5 7 }
19,420 { 2^2 3 5 7 }
23,840 { 2^3 3 5 7 }
25,1260 { 2^2 3^2 5 7 }
27,1540 { 2^2 5 7 11 }
28,2310 { 2 3 5 7 11 }
29,2520 { 2^3 3^2 5 7 }
30,4620 { 2^2 3 5 7 11 }
32,5460 { 2^2 3 5 7 13 }
34,9240 { 2^3 3 5 7 11 }
36,13860 { 2^2 3^2 5 7 11 }
38,16380 { 2^2 3^2 5 7 13 }
40,27720 { 2^3 3^2 5 7 11 }
41,30030 { 2 3 5 7 11 13 }
42,32760 { 2^3 3^2 5 7 13 }
43,60060 { 2^2 3 5 7 11 13 }
47,120120 { 2^3 3 5 7 11 13 }
49,180180 { 2^2 3^2 5 7 11 13 }
53,360360 { 2^3 3^2 5 7 11 13 }
57,471240 { 2^3 3^2 5 7 11 17 }
58,510510 { 2 3 5 7 11 13 17 }
59,556920 { 2^3 3^2 5 7 13 17 }
60,1021020 { 2^2 3 5 7 11 13 17 }
62,1141140 { 2^2 3 5 7 11 13 19 }
64,2042040 { 2^3 3 5 7 11 13 17 }
66,3063060 { 2^2 3^2 5 7 11 13 17 }
68,3423420 { 2^2 3^2 5 7 11 13 19 }
70,6126120 { 2^3 3^2 5 7 11 13 17 }
72,6846840 { 2^3 3^2 5 7 11 13 19 }
76,8953560 { 2^3 3^2 5 7 11 17 19 }
77,9699690 { 2 3 5 7 11 13 17 19 }
78,12252240 { 2^4 3^2 5 7 11 13 17 }
79,19399380 { 2^2 3 5 7 11 13 17 19 }
james_li85 2008-06-16
  • 打赏
  • 举报
回复
4楼的答案在数33时可能会出现一些问题,如33的时候可以取4,5,6,7,11=4620,,而用您的算法得到的是3080
下面是几组测试数据
2 2
3 3
4 4
5 6
6 6
7 12
8 15
9 20
10 30
11 30
12 60
17 210
18 210
19 420
20 280
21 420
33 4620
45 60060
51 180180
52 180180
53 360360
75 6846840
90 58198140
98 157477320
99 232792560
100 232792560
119 2677114440
mathe 2008-06-16
  • 打赏
  • 举报
回复
而计算结果表明,对于n>18,不会再出现使用单个数6的情况
mathe 2008-06-16
  • 打赏
  • 举报
回复
贴一下100以内结果:
2, 2 { 2 }
3, 3 { 3 }
4, 4 { 2^2 }
5, 6 { 2 3 }
6, 6 { 6 }
7, 12 { 2^2 3 }
8, 15 { 5 3 }
9, 20 { 5 2^2 }
10, 30 { 5 2 3 }
11, 30 { 5 6 }
12, 60 { 5 2^2 3 }
13, 42 { 7 6 }
14, 84 { 7 2^2 3 }
15, 105 { 5 7 3 }
16, 140 { 5 7 2^2 }
17, 210 { 5 7 2 3 }
18, 210 { 5 7 6 }
19, 420 { 5 7 2^2 3 }
20, 280 { 5 7 2^3 }
21, 330 { 5 11 2 3 }
22, 360 { 5 2^3 3^2 }
23, 840 { 5 7 2^3 3 }
24, 504 { 7 2^3 3^2 }
25, 1260 { 5 7 2^2 3^2 }
26, 1155 { 5 7 11 3 }
27, 1540 { 5 7 11 2^2 }
28, 2310 { 5 7 11 2 3 }
29, 2520 { 5 7 2^3 3^2 }
30, 4620 { 5 7 11 2^2 3 }
31, 3080 { 5 7 11 2^3 }
32, 5460 { 5 7 13 2^2 3 }
33, 3960 { 5 11 2^3 3^2 }
34, 9240 { 5 7 11 2^3 3 }
35, 5544 { 7 11 2^3 3^2 }
36, 13860 { 5 7 11 2^2 3^2 }
37, 6552 { 7 13 2^3 3^2 }
38, 16380 { 5 7 13 2^2 3^2 }
39, 15015 { 5 7 11 13 3 }
40, 27720 { 5 7 11 2^3 3^2 }
41, 30030 { 5 7 11 13 2 3 }
42, 32760 { 5 7 13 2^3 3^2 }
43, 60060 { 5 7 11 13 2^2 3 }
44, 40040 { 5 7 11 13 2^3 }
45, 45045 { 5 7 11 13 3^2 }
46, 51480 { 5 11 13 2^3 3^2 }
47, 120120 { 5 7 11 13 2^3 3 }
48, 72072 { 7 11 13 2^3 3^2 }
49, 180180 { 5 7 11 13 2^2 3^2 }
50, 67320 { 5 11 17 2^3 3^2 }
51, 157080 { 5 7 11 17 2^3 3 }
52, 94248 { 7 11 17 2^3 3^2 }
53, 360360 { 5 7 11 13 2^3 3^2 }
54, 111384 { 7 13 17 2^3 3^2 }
55, 278460 { 5 7 13 17 2^2 3^2 }
56, 255255 { 5 7 11 13 17 3 }
57, 471240 { 5 7 11 17 2^3 3^2 }
58, 510510 { 5 7 11 13 17 2 3 }
59, 556920 { 5 7 13 17 2^3 3^2 }
60, 1021020 { 5 7 11 13 17 2^2 3 }
61, 720720 { 5 7 11 13 2^4 3^2 }
62, 1141140 { 5 7 11 13 19 2^2 3 }
63, 875160 { 5 11 13 17 2^3 3^2 }
64, 2042040 { 5 7 11 13 17 2^3 3 }
65, 1225224 { 7 11 13 17 2^3 3^2 }
66, 3063060 { 5 7 11 13 17 2^2 3^2 }
67, 1369368 { 7 11 13 19 2^3 3^2 }
68, 3423420 { 5 7 11 13 19 2^2 3^2 }
69, 1361360 { 5 7 11 13 17 2^4 }
70, 6126120 { 5 7 11 13 17 2^3 3^2 }
71, 1790712 { 7 11 17 19 2^3 3^2 }
72, 6846840 { 5 7 11 13 19 2^3 3^2 }
73, 2450448 { 7 11 13 17 2^4 3^2 }
74, 5290740 { 5 7 13 17 19 2^2 3^2 }
75, 4849845 { 5 7 11 13 17 19 3 }
76, 8953560 { 5 7 11 17 19 2^3 3^2 }
77, 9699690 { 5 7 11 13 17 19 2 3 }
78, 12252240 { 5 7 11 13 17 2^4 3^2 }
79, 19399380 { 5 7 11 13 17 19 2^2 3 }
80, 13693680 { 5 7 11 13 19 2^4 3^2 }
81, 14549535 { 5 7 11 13 17 19 3^2 }
82, 16628040 { 5 11 13 17 19 2^3 3^2 }
83, 38798760 { 5 7 11 13 17 19 2^3 3 }
84, 23279256 { 7 11 13 17 19 2^3 3^2 }
85, 58198140 { 5 7 11 13 17 19 2^2 3^2 }
86, 21162960 { 5 7 13 17 19 2^4 3^2 }
87, 46966920 { 5 7 11 13 17 23 2^3 3 }
88, 28180152 { 7 11 13 17 23 2^3 3^2 }
89, 116396280 { 5 7 11 13 17 19 2^3 3^2 }
90, 33256080 { 5 11 13 17 19 2^4 3^2 }
91, 78738660 { 5 7 11 13 19 23 2^2 3^2 }
92, 46558512 { 7 11 13 17 19 2^4 3^2 }
93, 140900760 { 5 7 11 13 17 23 2^3 3^2 }
94, 41186376 { 7 11 17 19 23 2^3 3^2 }
95, 157477320 { 5 7 11 13 19 23 2^3 3^2 }
96, 56360304 { 7 11 13 17 23 2^4 3^2 }
97, 232792560 { 5 7 11 13 17 19 2^4 3^2 }
98, 111546435 { 5 7 11 13 17 19 23 3 }
99, 205931880 { 5 7 11 17 19 23 2^3 3^2 }
100, 223092870 { 5 7 11 13 17 19 23 2 3 }
mathe 2008-06-16
  • 打赏
  • 举报
回复
很容易证明6是唯一的例外的
mathe 2008-06-16
  • 打赏
  • 举报
回复
的确有问题,那么6是不是唯一的例外呢?如果这样,问题也不大
tailzhou 2008-06-16
  • 打赏
  • 举报
回复
这种错误在使用到dp[6][3]的时候就会出现;

因为6的最大的分解就是6自己;

但6
==3^1+3
==3^1+2^1+1;

6的最大分解表示成 标准格式时 出现了1,是一个不合法的分解,也就是;

“存在一种达到最大值的拆分方案,使得每个xi最多只有一个素因子(也就是说xi必然是1,素数或素数的幂),而且不同的xi之间互素(它们的素因子不同)。”

对6在有限制的情况下是不满足的;



tailzhou 2008-06-16
  • 打赏
  • 举报
回复
晕,只看大的数了,

8错是因为初始话的问题;

11确实是算法错误;

11应该分解成5+6;

我直接按照mathe的方法给分解成5+3+3,这样就比4+7小了;

看来确实有:
"分解成 n1*a,n2*a 跟 (n1+n2)*a 结果可能是不同的"
的情况出现
james_li85 2008-06-16
  • 打赏
  • 举报
回复
8的时候怎么是8呢?
11好像也不是28而是30吧
tailzhou 2008-06-16
  • 打赏
  • 举报
回复
输出:
D:\projects\cl>test
2:2
3:3
4:4
5:6
6:6
7:12
8:8
9:20
10:30
11:28
12:60
13:40
14:84
15:60
16:140
17:210
18:180
19:420
20:280
21:420
22:420
23:840
24:504
25:1260
26:840
27:1540
28:2310
29:2520
30:4620
31:3080
32:5460
33:4620
34:9240
35:5544
36:13860
37:9240
38:16380
39:13860
40:27720
41:30030
42:32760
43:60060
44:40040
45:60060
46:60060
47:120120
48:72072
49:180180
50:120120
51:180180
52:180180
53:360360
54:180180
55:360360
56:360360
57:471240
58:510510
59:556920
60:1021020
61:720720
62:1141140
63:1021020
64:2042040
65:1225224
66:3063060
67:2042040
68:3423420
69:3063060
70:6126120
71:3423420
72:6846840
73:6126120
74:6846840
75:6846840
76:8953560
77:9699690
78:12252240
79:19399380
80:13693680
81:19399380
82:19399380
83:38798760
84:23279256
85:58198140
86:38798760
87:58198140
88:58198140
89:116396280
90:58198140
91:116396280
92:116396280
93:140900760
94:116396280
95:157477320
96:140900760
97:232792560
98:157477320
99:232792560
100:232792560
101:281801520
102:446185740
103:314954640
104:446185740
105:446185740
106:892371480
107:535422888
108:1338557220
109:892371480
110:1338557220
111:1338557220
112:2677114440
113:1338557220
114:2677114440
115:2677114440
116:2677114440
117:2677114440
118:3375492120
119:2677114440
120:5354228880
121:3375492120
122:5354228880
123:5354228880
124:5354228880
125:5354228880
126:6750984240
127:5354228880
128:7216569360
129:6750984240
130:8172244080
131:12939386460
132:13385572200
133:13831757940
134:13385572200
135:25878772920
136:15527263752
137:38818159380
138:25878772920
139:41495273820
140:38818159380
141:77636318760
142:41495273820
143:82990547640
144:77636318760
145:82990547640
146:82990547640
147:82990547640
148:82990547640
149:155272637520
150:82990547640
151:165981095280
152:155272637520
153:165981095280
154:165981095280
155:165981095280
156:165981095280
157:209280511440
158:165981095280
159:232908956280
160:209280511440
161:388181593800
162:401120980260
163:414952738200
164:401120980260
165:414952738200
166:802241960520
167:481345176312
168:1203362940780
169:802241960520
170:1203362940780
171:1203362940780
172:2406725881560
173:1203362940780
174:2406725881560
175:2406725881560
176:2406725881560
177:2406725881560
178:2872543794120
179:2406725881560
180:4813451763120
181:2872543794120
182:4813451763120
183:4813451763120
184:4813451763120
185:4813451763120
186:5745087588240
187:4813451763120
188:6141300525360
189:5745087588240
190:7220177644680
191:6141300525360
192:12033629407800
193:7220177644680
194:12033629407800
195:12033629407800
196:12033629407800
197:12033629407800
198:14440355289360
199:14841476269620
200:24067258815600
201:14841476269620
202:24067258815600
203:29682952539240
204:24067258815600
205:44524428808860
206:29682952539240
207:44524428808860
208:44524428808860
209:89048857617720
210:44524428808860
211:89048857617720
212:89048857617720
213:98675761143960
214:89048857617720
215:103489212907080
216:98675761143960
217:178097715235440
218:103489212907080
219:178097715235440
220:178097715235440
221:197351522287920
222:178097715235440
223:206978425814160
224:197351522287920
225:222622144044300
226:206978425814160
227:267146572853160
228:222622144044300
229:445244288088600
230:267146572853160
231:445244288088600
232:445244288088600
233:493378805719800
234:445244288088600
235:534293145706320
236:493378805719800
237:890488576177200
238:534293145706320
239:890488576177200
240:890488576177200
241:986757611439600
242:890488576177200
243:1034892129070800
244:1217001054108840
245:1034892129070800
246:1825501581163260
247:1335732864265800
248:1914550438780980
249:1825501581163260
250:3651003162326520
tailzhou 2008-06-16
  • 打赏
  • 举报
回复
“不能取1,还是可以采用类似的算法,
比如上面n=33的情况,即可以取
4,5,6,7,11=4620
也可以取
3,3,4,5,7,11=4620
只是这个时候,需要允许重复出现的项 ”

想了想,mathe是对的;

验证了下:

#include <stdio.h>
#define N 251

__int64 dp[N][N];

int prime[] = {1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79,
83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191,
193, 197, 199, 211, 223, 227, 229, 233, 239, 241};

main()
{
int i,j,k,idx;
__int64 t;
j=2;
for (i=2;i<N ;i++ )
{
dp[i][1]=1;

if (i==j)
{
dp[i][2]=j;
j*=2;
}
else
{
dp[i][2]=j/2;
if (i==j/2+1)
{
dp[i][2]/=2;
}
}
}

idx=1;
for (i=2; i<N;i++ )
{
if (i==prime[idx+1])
{
idx++;
}

for (j=2; j<=idx; j++)
{
int power,count;
dp[i][prime[j]]= dp[i][prime[j-1]];
k= prime[j];
while (k<=i)
{
t=k*dp[i-k][prime[j-1]];
if (t>dp[i][prime[j]])
{
dp[i][prime[j]]=t;
}
k*= prime[j];
}
}
for (j=idx+1;j<sizeof(prime)/sizeof(int) ;j++ )
{
dp[i][prime[j]]=dp[i][prime[j-1]];
}
printf("%d:%I64d\n",i,dp[i][prime[idx]]>i?dp[i][prime[idx]]:i);
}
}

james_li85 2008-06-16
  • 打赏
  • 举报
回复
非常感谢大家的讨论,感觉还是蛮难比较的,虽然知道要尽可能用互质数,还是不知道具体怎么实现
tailzhou 2008-06-16
  • 打赏
  • 举报
回复
"3,3,4,5,7,11=4620"

分解成 n1*a,n2*a 跟 (n1+n2)*a 结果可能是不同的;

毕竟lcm((n1+n2)*a)的公倍数是(n1+n2)*a,lcm(n1*a,n2*a)的公倍数是a*lcm((n1,n2));















mathe 2008-06-16
  • 打赏
  • 举报
回复
不能取1,还是可以采用类似的算法,
比如上面n=33的情况,即可以取
4,5,6,7,11=4620
也可以取
3,3,4,5,7,11=4620
只是这个时候,需要允许重复出现的项
[Quote=引用 10 楼 tailzhou 的回复:]
如果没有这个限制;

假设最优的拆分为a1,a2...an;
素数的序列为z1,z2...zn;

假如他们的公倍数有素因子zi^ni;

由于x*y>=x+y;从a1,a2...an都去掉素因子zi后得到新的拆分
a1',a2'.....an',zi^ni,s s>=0;

由于a1',a2'.....an',zi^ni的公倍数 等于a1,a2...an的公倍数;
并且a1',a2'.....an',zi^ni,s的公倍数不小于 a1',a2'.....an',zi^ni的公倍数;

所以新的拆分也是最优的;

一直进行下去。可得:
N=…
[/Quote]
tailzhou 2008-06-16
  • 打赏
  • 举报
回复
但由于有“a1到an里的数不能为1”这个限制,情况就有点复杂;

比如33,有限制的话只能是:
33=2^2+2*3+5+7+11;

但如果没限制;
至少1+2^2+3+5+7+13更优;








加载更多回复(4)
解除C语言实训烦恼 “计算机能力强化实训”(C语言)任务书 一、实训目的 C语言程序设计是本科工科类各专业的重要基础课,主要学习程序设计的基本概念和方法,通过本门课程学习,使学生掌握C语言的基本原理,熟练掌握程序设计的基础知识、基本概念;掌握程序设计的思想和编程技巧。 实训是在学生已经具备了使用C语言编写简单的应用程序的能力,为使学生对C语言有更全面的理解,进一步提高运用C语言编程解决实际问题的能力,通过提出算法、指定输入输出来设计一个解决方案。并为参加计算机等级考试作准备。 二、实训的基本内容和要求 参加实训的学生,应当认真完成实训的全部内容。最终提交实训成果来证明其独立完成各种实际任务的能力。从而反映出理解和运用本课程知识的水平和能力。具体如下: 1、代码编写规范,形成良好的编程习惯; 2、程序须有一定的健壮性和必要的提示信息,考虑问题的多种可能和边界数据。 3、提交实训报告电子稿、装订的打印稿。实训报告内容包括以下几个方面:  程序的总体设计和算法分析。  程序流程图、函数说明  源程序代码清单  测试数据和测试过程记录  遇到的问题及解决方法分析  实训小结 4. 程序运行方式 构建一个简易菜单,形如: 用户通过输入数值选择所需运行的子程序,当一个子程序运行结束后回到菜单界面,直至用户输入0后退出程序。 5.实训选题 每人至少做6题,题目如下(每人的题目由任课老师安排) (1)编写一个程序实现如下功能:一个整型数组有10个元素,删除所有值为n的元素。要求: ① 主函数完成n的输入,数组元素输入以及删除后数组元素的输出。 ② 删除功能用子函数完成。 (2)编写一个程序实现如下功能:输入10个学生5门课程的成绩,分别用函数求:①每个学生的平均分;②每门课程的平均分;③找出最高的分数所对应的学生和课程。 若输入2个学生的成绩,其运行结果如下图所示。 (3)编写一个程序实现如下功能:找最长的单词。设输入的英文短文不超过一行(假设正文最后有“.”结束,以“,”或空格分隔,不出现其他符号),编程将所有单词输出,并求其中最长单词的长度,并将该单词输出。 (4)编写一个程序实现如下功能:有8位裁判为1个运动员打分,请计算并输出去掉一个最高分和一个最低分后这个运动员的平均得分以及所评分最接近平均分的裁判员号。裁判员号及其所打分数从键盘输入,假设裁判员号为整数,所打分数为实数。 (5)编写一个程序实现如下功能:从键盘输入字符(最多为80个),遇到回车键输入结束,将输入的字符串按奇偶位置拆分,奇数位上的字符在前,偶数位上的字符在后,重新组成新的字符串输出,例如输入: ab12cd3456fg,则经过程序处理后输出: a1c35fb2d46g 。 (6)功能说明:编写程序,实现以下成绩处理功能(输出格式参见示例): 1)输入n和n个成绩(成绩为浮点数类型,数组名记为a,假设1≤n≤50); 2)计算并输出成绩的累加和(记为sum)与平均成绩(记为ave),将≥ave的成绩归为A档,将<ave的成绩归为B档; 3)分别统计A、B两档的人数,计算在总人数中的比率; 4)求出A档学生的最低分和B档学生的最高分,它们与平均成绩的差值; 运行示例: 输入:9 55.5 99.5 50.0 90.0 88 59.5 48 60 78.0 输出: Sum=628.5, Ave=69.8 A: 4,44.4% B: 5,55.6% MinA: 78.0,+8.2 MaxB: 60.0,-9.8 说明:输入的第1个数表示学生人数(n=9),接着输入的9个成绩中,累加和为628.5(所有小数均保留一位小数输出),平均分为69.8分;平均分以上(A档)有4人,占44.4%,平均分以下(B档)有5人,占55.6%;A档的最低分为78分,超出平均分8.2分,B档的最高分为60分,距离平均分还有9.8分的差距。 (7)功能说明:编写程序,通过以下步骤验证一个正整数对是否符合特定的编码规则: 1)输入正整数a与b; 2)计算a的所有不同的质因子(包括1)之,记为s; 3)如果s等于b,则通过验证,输出“OK”,否则输出“Err”。 输出格式参见以下示例。 运行示例1: 输入:588 42 输出:588: 1*2*3*7=42, OK 说明:输入数为588(对应a)和42(对应b),588的质因子为1、2、3和7,其累乘结果为42(对应s),由s等于b(均为42),输出OK。 运行示例2: 输入:17 55 输出:17: 1*17=17, Err(17!=55) 说明:质因子为1和17,乘仍为17,不等于b(55),输出Err,及不通过原因“(17!=55)”。 (8)编写一个程序实现如下功能:从字符串中删除指定的字符。同一字母的大、小写按不同字符处理。 例:若程序执行时,输入字符串为:Shanghai Dianji University,从键盘上输入字符:s,则输出后变为:Shanghai Dianji Univerity,如果输入的字符串不存在,则字符串照原样输出。 (9)编写一个函数void fun(char a[],int k,int n),其功能是:删除字符串中指定下标开始的n 个字符。其中,a中放字符串,k中存放指定的下标。 例如,字符串内容为:Hellollo World!,k中值为:5,n中的值为:3,则调用该函数的结果为:Hello World!。 (10)编写一个程序实现如下功能:调用名为tj的函数,求一个二维数组中正数、负数的代数和,以及零的个数。 (11)编写一个程序实现如下功能:调用一个名为gm的函数,该函数实现简单的加密。加密方法如下:先定义一张字母加密对照表: 原字母 a b c d e i k , w 加密后字母 d w k , i a b c e 将需要加密的一行文字输入加密程序,程序根据加密表中的对应关系,可以简单地将输入的文字加密输出,对于表中未出现的字符则不加密。 运行示例: 输入:lajgdike,w 输出:ldjg,abice (12)编写程序验证以下说法:输入一个4位数,该数个、十、百、千位上的数互不相等,由个、十、百、千位上的数组成一个最大数和一个最小数,最大数-最小数,构成一个新的4位数。反复以上运算,使其最终结果为:6174。 要求如下(下面的函数名为建议函数名): ① 用函数 int IsNumberEqual(int number) 检查输入的整数number各数码是否互不相等,全相等返回值为1否则为0; ② 用函数(void ntos (int number, int c[]) )把四位数整数number各位数码分别存入数组c ③ 用函数( void sort (int a[ ] )对4个元素的数组a排序(升序或降序都可以); ④ 由输入整数分解排序后的数组得到最大值和最小值: int getmaxn(int a[ ]) 返回值为最大值 int getminn(int b[ ]) 返回值为最小值 (13)函数 fun 的功能是:计算正整数num的各位上的数字之。例如,若输入:252,则输出应该是:20。若输入:202,则输出应该是:0。 (14)函数 fun 的功能是:用插入排序法将n个字符进行排序(降序)。(提示: 插入法排序的思路是:先对数组的头两个元素进行排序, 然后根据前两个元素的情况插入第三个元素,再插入第四个元素…)。 (15)爱因斯坦数学题。爱因斯坦曾出过这样一道数学题:有一条长阶梯,若每步跨2阶,则最后剩下1阶,若每步跨3阶,则最后剩下2阶,若每步跨5阶,则最后剩下4阶,若每步跨6阶,则最后剩下5阶,只有每步跨7阶,最后才正好1阶不剩。请问,这条阶梯共有多少阶? (16)猜数游戏 在这个实验中,我们将尝试编写一个猜数游戏程序,这个程序看上去有些难度,但是如果按下列要求循序渐进地编程实现,会发现其实这个程序是很容易实现的。那么,现在就开始吧,先编写第1个程序,然后试着在第1个程序的基础上编写第2个程序,…… 程序1 编程先由计算机“想”一个1~100之间的数请人猜,如果人猜对了,则计算机给出提示“Right!”,否则提示“Wrong!”,并告诉人所猜的数是大(Too high)还是小(Too low),然后结束游戏。要求每次运行程序时机器所“想”的数不能都一样。 程序2 编程先由计算机“想”一个1~100之间的数请人猜,如果人猜对了,则结束游戏,并在屏幕上输出人猜了多少次才猜对此数,以此来反映猜数者“猜”的水平;否则计算机给出提示,告诉人所猜的数是太大还是太小,直到人猜对为止。 程序3 编程先由计算机“想”一个1~100之间的数请人猜,如果人猜对了,则结束游戏,并在屏幕上输出人猜了多少次才猜对此数,以此来反映猜数者“猜”的水平;否则计算机给出提示,告诉人所猜的数是太大还是太小,最多可以猜10次,如果猜了10次仍未猜中的话,结束游戏。 程序4 编程先由计算机“想”一个1~100之间的数请人猜,如果人猜对了,在屏幕上输出人猜了多少次才猜对此数,以此来反映猜数者“猜”的水平,则结束游戏;否则计算机给出提示,告诉人所猜的数是太大还是太小,最多可以猜10次,如果猜了10次仍未猜中的话,则停止本次猜数,然后继续猜下一个数。每次运行程序可以反复猜多个数,直到操作者想停止时才结束。 (17)给小学生出加法考试题 编写一个程序,给学生出一道加法运算题,然后判断学生输入的答案对错与否,按下列要求以循序渐进的方式编程。 程序1 通过输入两个加数给学生出一道加法运算题,如果输入答案正确,则显示“Right!”,否则显示“Not correct! Try again!”,程序结束。 程序2 通过输入两个加数给学生出一道加法运算题,如果输入答案正确,则显示“Right!”,否则显示“Not correct! Try again!”,直到做对为止。 程序3 通过输入两个加数给学生出一道加法运算题,如果输入答案正确,则显示“Right!”,否则提示重做,显示“Not correct! Try again!”,最多给三次机会,如果三次仍未做对,则显示“Not correct! You have tried three times! Test over!”,程序结束。 程序4 连续做10道题,通过计算机随机产生两个1~10之间的加数给学生出一道加法运算题,如果输入答案正确,则显示“Right!”,否则显示“Not correct!”,不给机会重做,10道题做完后,按每题10分统计总得分,然后打印出总分和做错的题数。 (18)学生成绩统计 从键盘输入一个班(全班最多不超过30人)学生某门课的成绩,当输入成绩为负值时,输入结束,分别实现下列功能: 1)统计不及格人数并打印不及格学生名单; 2)统计成绩在全班平均分及平均分之上的学生人数,并打印这些学生的名单; 3)统计各分数段的学生人数及所占的百分比。 提示:可考虑用两个一维数组实现学生成绩和学生信息的存储。 (19)歌手大赛评分 某歌手大赛,共有十个评委给选手打分,分数采用百分制,去掉一个最高分,去掉一个最低分,然后取平均分,得到歌手的最后成绩。 (20)统计 输入一行字符,以回车键作为结束标志,分别统计出大写字母、小写字母、空格、数字和其它字符的个数。 (21)求 的值,其中a是一个数字,如2+22+222+2222+22222(此时a=2,n=5),a和n均由键盘输入。 (22)读入一批正整数(以零或负数为结束标志),求其中的奇数和。 (23) 利用泰勒级数sin(x)≈ 计算sin(x) 的值。要求最后一项的绝对值小于10-5,并统计出此时累加了多少项(x由键盘输入)。 (24)最大值、最小值及其交换 输入一个正整数n (1个数交换,最大值与最后一个数交换,然后输出交换后的n 个数。 (25)抓住肇事者 一辆卡车违反交通规则,撞人后逃跑。现场共有三个目击者,但都没有记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是个数学家,他说,四位车号刚好是一个整数的平方。请根据以上线索帮助警方找到车号。 (26)百钱百鸡问题 中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱百鸡”问题:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问翁、母、雏各几何。 (27)有一堆鱼,由A、B、C、D、E五人先后进行分配。A第一个到来,他将鱼平分作5份,把多余的一条扔回湖中,拿走自己分好的一份回家去了;B第二个到来,也将鱼平分为5份,扔掉多余的一条,只拿走自己分好的一份;接着C、D、E依次到来,也按同样的方法分鱼。问这堆鱼共有多少条?每个人到来时看到的鱼数是多少条? (28)约瑟夫环问题:编号为1,2,3,...,n的n个人按顺时针方向围坐一圈,每人持有一个正整数密码。一开始任选一个正整数m作为报数上限值,从第一个人开始按顺时针报数,报到m时停止,报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计程序求出出列顺序。 (29)某公司在传输数据过程中为了安全要对数据进行加密,若传递的是四位的整数,对其进行加密的规则为:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。如:输入数字7659,则加密后的数字为4012 (30) 将十进制正整数用除n取余法转换为n进制数输出。(n从键盘输入) (31)从键盘输入一行字符,统计其中有多少单词,假设单词之间以逗号分隔。 (32)从键盘输入一字符串,放在字符数组a中,将字符数组a中下标值为偶数的元素按从小到大排序。 (33)编写程序输出以下杨辉三角形(要求输出10行)。 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 … … … … … … (34)编写程序查找数值18在以下二维数组中第一次出现的位置。 3 4 5 18 8 12 16 54 43 34 18 7 (35)设有4行4列的数组a,其元素a[i][j]=3*i+2*j-6。编写程序,实现如下功能: ① 求第二行4元素的累加和; ② 求第四列4元素的平均值; ③ 求主对角线4元素中负数的个数。 (36)编写程序输出100~1000内的可逆素数。可逆素数是指:一个素数将其各位数字的顺序倒过来构成的反序数也是素数。如157和751均为素数,它们是可逆素数。要求调用两个子函数实现。 (37)输入一行数字字符存入字符数组str[80]中,用num[10]中的数组元素作为计数器来统计每个数字字符的个数。用下标为0的元素统计字符“0”的个数,用下标为1的元素统计字符“1”出现的次数,……。输出每个奇数字符出现的次数。 (38)假设数组a有4行4列的随机整数,计算每行的平均值,保留两位小数,然后输出平均值和每行的最大值。 (39)输入一行字符串,分别统计字符串中各元音字母(AEIOU)的个数(不分大小写)。 (40)编写程序计算并输出:1 + 12 + 123 + 1234 + …… 的前n(设0个数,按升序排序,然后在其中查找数据k,若找到,显示查找成功的信息,并将该数据删除;若没有找到,则将数据k插入到这些数中,插入操作后数据仍然有序。 (43)编写一个程序实现如下功能:有4名学生,每个学生信息包含学号、姓名、数学成绩、英语成绩、C语言成绩和三门课程的总分,并对数据进行输入和输出。 (44) 编写一个程序实现如下功能:定义一个点的结构数据类型,实现下列功能:①为点输入坐标值。②求两个点中点坐标。③求两点间距离。 (45)编写一个程序实现如下功能:建立一个单链表,每个结点数据要有职工号、工资。用一个creat函数来建立链表,用list函数输出数据(数据自定)。 (46)编写一个程序实现如下功能:有5个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件“stud”中。 (47) 编写一个程序实现如下功能:将一个整形ASCII码文件FileA.txt复制到ASCII码文件FileB.txt。 FileA.txt FileB.txt 10 11 12 13 14 15 10 11 12 13 14 15 20 21 22 23 24 25 20 21 22 23 24 25 30 31 32 33 34 35 30 31 32 33 34 35 (48)编写一个程序实现如下功能:有一个整数文件(二进制文件),读取其中的数值,如果为奇数加一;如果为偶数,减一,存放到新的文件中去。 (49)从键盘输入若干行字符,将其存入“s8”磁盘文件中,再从文件中读取这些字符,将其中的大写字母转换成小写字母后输出到屏幕显示。 (50)以下程序从文件“student.txt”读取学生的学号、姓名、平时成绩和考试成绩,再从键盘上输入一个成绩,将所有考试成绩达到或超过该成绩的学生数据写到新的文本文件“studentD.txt”。文件的最后一行为0表示学生数据结束。 设文件student.txt的内容为 101 Zhao 95 58 103 Qian 75 81 105 Sun 99 91 107 Li 80 67 0 运行时键盘输入:80 则生成新文件studentD.txt的内容为: 103 Qian 75 81 105 Sun 99 91 0 例示说明:student.txt中考试成绩在80分以上的Qian与Sun信息写到studentD.txt 三、课程设计的进度安排 熟悉文件内容 1天 整体设计和详细设计、编代码 1天 编代码、调试和测试  1天 实训报告书写 1天 演示软件   1天 四、指导书、参考资料 谭浩强著 《C程序设计》(第四版) 清华大学出版社 夏耘 吉顺如主编 《大学程序设计(C)实践手册》 复旦大学出版社 六、其他 附件为实训报告封面样张
本书是《组合数学》第3版的修订版,全书共分8章,分别是:排列与组合、递推关系与母函数、容斥原理与鸽巢原理、burnside引理与polya定理、区组设计、线性规划、编码简介、组合算法简介。丰富的实例及理论和实际相结合是本书一大特点,有利于对问题的深入理解。. 本书是计算机系本科生和研究生的教学用书,也可作为数学专业师生的教学参考书。 目录回到顶部↑ 第1章 排列与组合. 1.1 加法法则与乘法法则 1.2 一一对应 1.3 排列与组合 1.3.1 排列与组合的模型 1.3.2 排列与组合问题的举伊 1.4 圆周排列 1.5 排列的生成算法 1.5.1 序数法 1.5.2 字典序法 1.5.3 换位法 1.6 允许重复的组合与不相邻的组合 1.6.1 允许重复的组合 1.6.2 不相邻的组合 1.6.3 线性方程的整数解的个数问题 1.6.4 组合的生成 1.7 组合意义的解释 1.8 应用举例 1.9 stirling公式 1.9.1 wallis公式 .1.9.2 stirling公式的证明 习题 第2章 递推关系与母函数 2.1 递推关系 2.2 母函数 2.3 fibonacci序列 2.3.1 fibonacci序列的递推关系 2.3.2 若干等式 2.4 优选法与fibonacci序列的应用 2.4.1 优选法 2.4.2 优选法的步骤 2.4.3 fibonacci的应用 2.5 母函数的性质 2.6 线性常系数齐次递推关系 2.7 关于线性常系数非齐次递推关系 2.8 整数的拆分 2.9 ferrers图像 2.10 拆分数估计 2.11 指数型母函数 2.11.1 问题的提出 2.11.2 指数型母函数的定义 2.12 广义二项式定理 2.13 应用举例 2.14 非线性递推关系举例 2.14.1 stirling数 2.14.2 catalan数 2.14.3 举例 2.15 递推关系解法的补充 习题 第3章 容斥原理与鸽巢原理 3.1 demorgan定理 3.2 容斥定理 3.3 容斥原理举例 3.4 棋盘多项式与有限制条件的排列 3.5 有禁区的排列 3.6 广义的容斥原理 3.6.1 容斥原理的推广 3.6.2 一般公式 3.7 广义容斥原理的应用 3.8 第二类stirling数的展开式 3.9 欧拉函数φ(n) 3.10 n对夫妻问题 3.11 mobius反演定理 3.12 鸽巢原理 3.13 鸽巢原理举例 3.14 鸽巢原理的推广 3.14.1 推广形式之一 3.14.2 应用举例 3.14.3 推广形式之二 3.15 ramsey数 3.15.1 ramsey问题 3.15.2 ramsey数 习题 第4章 burnside引理与polya定理 4.1 群的概念 4.1.1 定义 4.1.2 群的基本性质 4.2 置换群 4.3 循环、奇循环与偶循环 4.4 burnside引理 4.4.1 若干概念 4.4.2 重要定理 4.4.3 举例说明.. 4.5 polya定理 4.6 举例 4.7 母函数形式的polya定理 4.8 图的计数 4.9 polya定理的若干推广 习题 第5章 区组设计 5.1 问题的提出 5.2 拉丁方与正交的拉丁方 5.2.1 问题的引入 5.2.2 正交拉丁方及其性质 5.3 域的概念 5.4 galois域gf(pm) 5.5 正交拉丁方的构造 5.6 正交拉丁方的应用举例 5.7 均衡不完全的区组设计 5.7.1 基本概念 5.7.2 (b,u,r,k,λ)-设计 5.8 区组设计的构成方法 5.9 steiner三元素 5.10 kirkman女生问题 习题 第6章 线性规划 6.1 问题的提出 6.2 线性规划的问题 6.3 凸集 6.4 线性规划的几何意义 6.5 单纯形法的理论基础 6.5.1 松弛变量 6.5.2 解的充要条件 6.6 单纯形法与单纯形表格 6.7 改善的单纯形法 6.8 对偶概念 6.9 对偶单纯形法 习题 第7章 编码简介 7.1 基本概念 7.2 对称二元信道 7.3 纠错码 7.3.1 最近邻法则 7.3.2 hamming不等式 7.4 若干简单的编码 7.4.1 重复码 7.4.2 奇偶校验码 7.5 线性码 7.5.1 生成矩阵与校验矩阵 7.5.2 关于生成矩阵和校验矩阵的定理 7.5.3 译码步骤 7.6 hamming码 7.7 bch码 习题 第8章 组合算法简介 8.1 归并排序 8.1.1 算法 8.1.2 举例 8.1.3 复杂性分析 8.2 快速排序 8.2.1 算法的描述 8.2.2 复杂性分析 8.3 ford-johnson排序法 8.4 排序的复杂性下界 8.5 求第是个元素 8.6 排序网络 8.6.1 0-1原理 8.6.2 bn网络 8.6.3 复杂性分析 8.6.4 batcher奇偶归并网络 8.7 快速傅里叶变换 8.7.1 问题的提出 8.7.2 预备定理 8.7.3 快速算法 8.7.4 复杂性分析 8.8 dfs算法 8.9 bfs算法 8.10 αβ剪技术 8.11 状态与图 8.12 分支定界法 8.12.1 tsm问题 8.12.2 任务安排问题 8.13 最短树与kruskal算法 8.14 huffman树 8.15 多段判决 8.15.1 问题的提出 8.15.2 最佳原理 8.15.3 矩阵链问题 8.15.4 图的两点间最短路径

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧