C语言算法训练题 下载本文

0 1

题29: 算法训练 寂寞的数

道德经曰:一生二,二生三,三生万物。

对于任意正整数n,我们定义d(n)的值为为n加上组成n的各个数字的和。例如,d(23)=23+2+3=28, d(1481)=1481+1+4+8+1=1495。

因此,给定了任意一个n作为起点,你可以构造如下一个递增序列:n,d(n),d(d(n)),d(d(d(n)))....例如,从33开始的递增序列为: 33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ...

我们把n叫做d(n)的生成元,在上面的数列中,33是39的生成元,39是51的生成元,等等。有一些数字甚至可以有两个生成元,比如101,可以由91和100生成。但也有一些数字没有任何生成元,如42。我们把这样的数字称为寂寞的数字。

输入格式

一行,一个正整数n。

输出格式

按照升序输出小于n的所有寂寞的数字,每行一个。

样例输入

40

样例输出

1 3 5 7 9 20 31

数据规模和约定

n<=10000

题30:算法训练 连续正整数的和

78这个数可以表示为连续正整数的和,1+2+3,18+19+20+21,25+26+27。 输入一个正整数 n(<=10000)

输出 m 行(n有m种表示法),每行是两个正整数a,b,表示a+(a+1)+...+b=n。 对于多种表示法,a小的方案先输出。

样例输入

78

样例输出

1 12 18 21 25 27

题31:算法训练 友好数

有两个整数,如果每个整数的约数和(除了它本身以外)等于对方,我们就称这对数是友好的。例如:

9的约数和有:1+3=4 4的约数和有:1+2=3 所以9和4不是友好的。

220的约数和有:1 2 4 5 10 11 20 22 44 55 110=284 284的约数和有:1 2 4 71 142=220 所以220和284是友好的。

编写程序,判断两个数是否是友好数。

输入格式

一行,两个整数,由空格分隔

输出格式

如果是友好数,输出\,否则输出\,注意不包含引号。

样例输入

220 284

样例输出

yes

数据规模和约定

两个整数都小于10000

题32:算法训练 和为T

从一个大小为n的整数集中选取一些元素,使得它们的和等于给定的值T。每个元素限选一次,不能一个都不选。

输入格式

第一行一个正整数n,表示整数集内元素的个数。 第二行n个整数,用空格隔开。 第三行一个整数T,表示要达到的和。

输出格式

输出有若干行,每行输出一组解,即所选取的数字,按照输入中的顺序排列。

若有多组解,优先输出不包含第n个整数的;若都包含或都不包含,优先输出不包含第n-1个整数的,依次类推。

最后一行输出总方案数。

样例输入

5

-7 -3 -2 5 9 0

样例输出

-3 -2 5 -7 -2 9 2

数据规模和约定

1<=n<=22 T<=maxlongint

集合中任意元素的和都不超过long的范围

题33:算法训练 黑白无常

某寝室的同学们在学术完之后准备玩一个游戏:游戏是这样的,每个人头上都被贴了一张白色或者黑色的纸,现在每个人都会说一句话“我看到x张白色纸条和y张黑色的纸条”,又已知每个头上贴着白色纸的人说的是真话、每个头上贴着黑色纸的人说的是谎话,现在要求你判断哪些人头上贴着的是白色的纸条,如果无解输出“NoSolution.”;如果有多组解,则把每个答案中贴白条的人的编号按照大小排列后组成一个数(比如第一个人和第三个人头上贴着的是白纸条,那么这个数就是13;如果第6、7、8个人都贴的是白纸条,那么这个数就是678)输出最小的那个数(如果全部都是黑纸条也满足情况的话,那么输出0)

输入格式

第一行为一个整数n,接下来n行中的第i行有两个整数x和y,分别表示第i个人说“我看到x张白色纸条和y张黑色的纸条”。

输出格式

一行。如果无解输出“NoSolution.”。否则输出答案中数值(具体见问题描述)最小的那个,如果全部都是黑纸条也满足情况的话,那么输出0

样例输入

2 1 0 1 0

样例输出

0

样例输入

5 3 1 0 4 1 3 4 0 1 3

样例输出

35

数据规模和约定

n<=8

题34:算法训练 数的统计

在一个有限的正整数序列中,有些数会多次重复出现在这个序列中。

如序列:3,1,2,1,5,1,2。其中1就出现3次,2出现2次,3出现1 次,5出现1次。 你的任务是对于给定的正整数序列,从小到大依次输出序列中出现的数及出现的次数。

输入格式

第一行正整数n,表示给定序列中正整数的个数。 第二行是n 个用空格隔开的正整数x,代表给定的序列。

输出格式

若干行,每行两个用一个空格隔开的数,第一个是数列中出现的数,第二个是该数在序列中出现的次数。

样例输入

12

8 2 8 2 2 11 1 1 8 1 13 13

样例输出

1 3 2 3 8 3 11 1 13 2

数据规模和约定

数据:n<=1000;0