admin管理员组

文章数量:1567915

2024年7月17日发(作者:)

*********************************************************************

1、过滤出1--10000之间所有相邻两位数相同的,比如12336等过滤掉,

剩下的数据输出并计算个数。

2、一辆卡车违反交通规则,撞人后逃跑。现场有三人目击事件,但都没记

住车号,只记下车号的一些特征。甲说:拍照的前两位数字是相同的;乙说:牌

照的后两位数字是相同的,但与前两位不同;并使数学家,他说:四位的车号刚

好是一个整数的平方。请根据以上线索编程求出车号。

3、一辆汽车加满油后,可行使n千米。旅途中有若干个加油站。若要使沿

途加油次数最少,设计一个有效算法,对于给定的n和k个加油站位置,指出应

在那些加油站停靠加油才能使加油次数最少。输入数据中,第一行有2个正整数,

分别表示汽车加满油后可行使n千米,且旅途中有k个加油站。接下来的1行中,

有k+1个整数,表示第k个加油站与第k-1个加油站之间的距离。第0个加油站

表示出发地,汽车已加满油。第k+1个加油站表示目地地。输出为最少的加油次

数,如果无法到达目的地,则输出“No Solution”。

提示:

把两加油站的距离放在数组中,a[1..k]表示从起始位置开始跑,经过k个加

油站,a[i]表示第i-1个加油站到第i个加油站的距离。汽车在运行的过程中如果

能跑到下一个站则不加油,否则要加油。

输入数据示例

7 7

1 2 3 4 5 1 6 6

输出数据

4

4、在一个黑袋中共有m个白球和n个黑球(m,n>0),袋外还有一些白球。

每次随机从袋中取出两球,若取出的球颜色相同,则放回一白球;若取出两球颜

色不同,则放回一黑球,直到取完(取出最后两球不放回)。请编程求多少种取

法,并说明最后两球的颜色。(用递归方法求解)

5、一个长1000单元的数组,每单元按序列放数据,(从0单元开始一次放

入1,2,3,...,1000),输入m,n,m表示从m单元开始取出长度n的数据,插

入到0单元前面,0到m-1单元一次后移到取出数据位置,经过连续k次操作后,

每次m,n数据不同,最后输出这1000单元数组中的数据。

输入数据示例(3表示k=3,以下三行是m,n的值)。

3

9,8

18,9

100,89

*********************************************************************

**********

第二题:

用迭代法求2的平方根

double n=2; double a=0; double b=n;

while(fabs(a-b)>1E-15)

{

a=(a+b)/2; b=________;

}

printf("%fn",a);

第五题:轮转数(每个字符依次向右移)

例:

字符串abcd 经过一次轮转后为dabc 此时位移记作1

字符串abcd 进过两次轮转后为 cdab 此时位移记作2

以下代码为求字符串S,经过n次位移后的新字符串

void shift(char *s,int n)

{

char *p;

char *q;

int len=strlen(s);

if(len==0) return;

char *s2=(char *)malloc(_______);

p=s;

q=s2+n%len;

while(*p)

{

*q++=*p++;

if((q-s2)=len)

{

*q=_____;

q=s2;

}

}

strcpy(s,s2);

free(s2);

}

第六题:

金字塔数

space 为塔底边距离左边的空白长度

x 塔底中心字母

例:当space=0,x='C'

输出:

A

ABA

ABCBA

当space=2,x='E'

A

ABA

ABCBA

ABCDCBA

ABCDEDCBA

void h(int space,char x)

{

int i;

if(x<'A'||x>'Z') return;

_________________;

for(i=0;i

for(i=0;i

for(i=0;i<=x-'A';i++) printf("%c"____);

printf("n");

}

第七题:中奖计算 函数返回所中的最大连续数字的个数

int g(int a,int b)

{

char sa[]="00000000";

char sb[]="00000000";

int n;

int i,j;

sprintf(sa,"%8d",a);

sprintf(sb,"%8d",b);

for(i=0;i<8;i++)

{

for(j=1;j<=8-i;j++)

{

char t=______;

sa[i+j]=0;

if(strstr(sb,sa+i))

{

if(j>n) ________;

}

sa[i+j]=t;

}

}

return n;

}

*********************************************************************

**********

一、 倒序数是将一个阿拉伯数的各位上的数字以逆序的形式写成的数。该阿拉

伯数的第一位变成最后位,最后位变成第一位。例如数1245被写成5421。

注意产生的新数字前边所有的数字0是被略去的。倒序数的尾部无多余的

数字0。请将阿拉伯数转变为倒序数。

输入

输入的第一行仅有一个正整数n,表示有n组测试数据。接下来有n行,每

一行是一组测试数据,长度不超过100。每一行上的字符串表示一个非负整

数,它是你需要转换的数。

输出

对每一组测试数据在一行上输出倒序数,该倒序数中前导的数字0被略去了。

输入样例 输出样例

3

24 42

43400 434

305 503 (25分)

二、 对一个正整数n,求出n!中末尾0的个数。

输入

输入有若干行。每一行上有一个整数T,是测试数据组数,接着有T行,每

一行包含一个确定的正整数n(n≤1000000000)。

输出

对输入行中的每一个数据n,输出一行,其内容是n!中末尾0的个数。

输入样例 输出样例

3

3 0

100 24

1024 253 (25分)

三、 给定两个字符串a和b,定义式子a*b表示两个字符串的连接。例如a=

“abc”,b=“def”,则a*b=“abcdef”。如果将连接看成乘法,则按照普遍

的方法,一个非负整数的幂表示为:a0=“”(the empty string),

a(n+1)=a*(an)。

输入

输入字符串s,每组样例一行,s为可打印字符。s的长度在1—1000000之

间。最后一组数据后为句号(.)。

输出

每个字符串s输出最大的n满足s=an,其中a为任意字符串。

输入样例 输出样例

abcd 1

aaaa 4

ababab 3 (25分)

四、 若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如2和5、

6和13,它们能应用于通信加密。现在密码学会请你设计一个程序,从已

有的N(N为偶数)个正整数中挑选出若干对组成“素数伴侣”,挑选方案

多种多样,例如有4个正整数:2,5,6,13,如果将5和6分为一组中只

能得到一组“素数伴侣”,而将2和5、6和13编组将得到两组“素数伴侣”,

能组成“素数伴侣”最多的方案称为“最佳方案”,当然密码学会希望你寻

找出“最佳方案”。

输入

输入文件的第一行有一个正偶数N(N≤200),表示待挑选的自然数的个数。第

二行给出N个不超过30000的正整数,相邻的两个数之间用一个空格分开。

输出

对每个正整数,输出一个整数K,表示你求得的“最佳方案”组成“素数伴侣”

的对数。

输入样例 输出样例

4 2

2 5 6 13

*********************************************************************

**********

蛇行矩阵

【问题描述】

蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。

【要求】

【数据输入】本题有多组数据,每组数据由一个正整数N组成。(N不大于100)

【数据输出】对于每一组数据,输出一个N行的蛇形矩阵。两组输出之间不要

额外的空行。矩阵三角中同一行的数字用一个空格分开。行尾不要多余的空格。

【样例输入】

5

【样例输出】

1 3 6 10 15

2 5 9 14

4 8 13

7 12

11

敲七

【问题描述】

输出7和7的倍数,还有包含7的数字例如(17,27,37...70,71,72,73...)

【要求】

【数据输入】一个整数N。(N不大于30000)

【数据输出】从小到大排列的不大于N的与7有关的数字,每行一个。

【样例输入】

20

【样例输出】

7

14

17

小希的数表

【问题描述】

Gardon 昨天给小希布置了一道作业,即根据一张由不超过5000的N(3<=N<=100)

个正整数组成的数表两两相加得到N*(N-1)/2个和,然后再将它们排序。例如,

如果数表里含有四个数1,3,4,9,那么正确答案是4,5,7,10,12,13。小

希做完作业以后出去玩了一阵,可是下午回家时发现原来的那张数表不见了,好

在她做出的答案还在,你能帮助她根据她的答案计算出原来的数表么?

【要求】

【数据输入】包含多组数据,每组数据以一个N开头,接下来的一行有按照大

小顺序排列的N*(N-1)/2个数,是小希完成的答案。文件最后以一个0结束。

假设输入保证解的存在性和唯一性。

【数据输出】对于每组数据,输出原来的数表。它们也应当是按照顺序排列的。

【样例输入】

4

4 5 7 10 12 13

4

5 6 7 8 9 10

0

【样例输出】

1 3 4 9

2 3 4 6

士兵队列训练问题

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K

(Java/Others)

Total Submission(s): 462 Accepted Submission(s): 185

【问题描述】

某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,

训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向

靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,

继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三

报数直到剩下的人数不超过三人为止。

【要求】

【数据输入】本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,

新兵人数不超过5000。

【数据输出】共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初

的编号,编号之间有一个空格。

【样例输入】

2

20

40

【样例输出】

1 7 19

1 19 37

最简单的计算机

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K

(Java/Others)

Total Submission(s): 287 Accepted Submission(s): 192

【问题描述】

一个名叫是PigHeadThree的研究组织设计了一台实验用的计算机,命名为

PpMm。PpMm只能执行简单的六种命令A,B,C,D,E,F;只有二个内存

M1,M2;三个寄存器R1,R2,R3。六种命令的含义如下:

命令A:将内存M1的数据装到寄存器R1中;

命令B:将内存M2的数据装到寄存器R2中;

命令C:将寄存器R3的数据装到内存M1中;

命令D:将寄存器R3的数据装到内存M2中;

命令E:将寄存器R1中的数据和寄存器R2中的数据相加,结果放到寄存器R3

中;

命令F:将寄存器R1中的数据和寄存器R2中的数据相减,结果放到寄存器R3

中。

你的任务是:设计一个程序模拟PpMm的运行。

【要求】

【数据输入】有若干组,每组有2行,第一行是2个整数,分别表示M1和M2

中的初始内容;第二行是一串长度不超过200的由大写字母A到F组成的命令

串,命令串的含义如上所述。

【数据输出】对应每一组的输入,输出只有一行,二个整数,分别表示M1,M2

的内容;其中M1和M2之间用逗号隔开。

其他说明:

R1,R2,R3的初始值为0,所有中间结果都在-2^31和2^31之间。

【样例输入】

100 288

ABECED

876356 321456

ABECAEDBECAF

【数据输出】

388,388

2717080,1519268

整数对

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K

(Java/Others)

Total Submission(s): 111 Accepted Submission(s): 29

【问题描述】

Gardon 和小希玩了一个游戏,Gardon随便想了一个数A(首位不能为0),把它

去掉一个数字以后得到另外一个数B,他把A和B的和N告诉了小希,让小希

猜想他原来想的数字。不过为了公平起见,如果小希回答的数虽然不是A,但同

样能达到那个条件(去掉其中的一个数字得到B,A和B之和是N),一样算小

希胜利。而且小希如果能答出多个符合条件的数字,就可以得到额外的糖果。

所以现在小希希望你编写一个程序,来帮助她找到尽可能多的解。

例如,Gardon想的是A=31,B=3 告诉小希N=34,

小希除了回答31以外还可以回答27(27+7=34)所以小希可以因此而得到一个

额外的糖果。

【要求】

【数据输入】输入包含多组数据,每组数据一行,包含一个数N(1<=N<=10^9),

文件以0结尾。

【数据输出】对于每个输入的N,输出所有符合要求的解(按照大小顺序排列)

如果没有这样的解,输出"No solution."

【样例输入】

34

152

21

0

【样例输出】

27 31 32

126 136 139 141

No solution.

3n+1数链问题

Time limit: 1s Memory limit: 32768K

Total Submit : 471 Accepted Submit : 325

【问题描述】

在计算机科学上,有很多类问题是无法解决的,我们称之为不可解决问题。然而,

在很多情况我们并不知道哪一类问题可以解决,那一类问题不可解决。现在我们

就有这样一个问题,问题如下:

1. 输入一个正整数n;

2. 把n显示出来;

3. 如果n=1则结束;

4. 如果n是奇数则n变为 ,否则n变为n/2;

5. 转入第2步。

例如对于输入的正整数22,应该有如下数列被显示出来:

22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

我们推测:对于任意一个正整数,经过以上算法最终会推到1。尽管这个算法很

简单,但我们仍然无法确定我们的推断是否正确。不过好在我们有计算机,我们

验证了对于小于1,000,000的正整数都满足以上推断。对于给定的正整数n,我

们把显示出来的数的个数定义为n的链长,例如22的链长为16。

你的任务是编写一个程序,对于任意一对正整数i和j,给出i、j之间的最长链

长,当然这个最长链长是由i、j之间的其中一个正整数产生的。我们这里的i、j

之间即包括i也包括j。

【要求】

【数据输入】输入文件只有一行,即为正整数i和j,i和j之间以一个空格隔开。

0 < i ≤ j < 10,000。

【数据输出】文件只能有一行,即为i、j之间的最长链长。

【样例输入】

1 10

【样例输出】

20

数制转换

Time limit: 1s Memory limit: 32768K

Total Submit : 479 Accepted Submit : 190

【问题描述】

有一种数制的基数是3,权值可以取-1,0,1,并分别用符号-,0,1表示,如这种数

制的101表示十进制数的10,即1*(3^2)+0*(3^1)+1*(3^0)=10,又如这种数制的

-0 表示十进制数的-3,即-1*(3^1)+0*(3^0)=-3。编程要求把给定的有符号整数转

换为新数制的数,该数的前面不能有多余的0,如10的新数制表示是101,则不

要输出成0101。

【要求】

【数据输入】文件有一行或多行,每行有一个整数N (-2,147,483,647≤N≤

2,147,483,647),整数内不会有其他分隔符。

【数据输出】对输入文件的每一行输出一行,该行是输入行的整数的新数制表示,

不能有多余空行,每行之前不能有前导空格。

【样例输入】

10

-3

【样例输出】

101

-0

矩阵取数游戏

Time limit: 1s Memory limit: 32768K

Total Submit : 150 Accepted Submit : 27

【问题描述】

帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的

每个元素aij均为非负整数。游戏规则如下:

1. 每次取数时须从每行各取走一个元素,共n个。m次后取完矩阵所有元素;

2. 每次取走的各个元素只能是该元素所在行的行首或行尾;

3. 每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分 = 被

取走的元素值*2i,其中i表示第i次取数(从1开始编号);

4. 游戏结束总得分为m次取数得分之和。

帅帅想请你帮忙写一个程序,对于任意矩阵,可以求出取数后的最大得分。

【要求】

【数据输入】输入有多个测试数据,每个包括n+1行:

第1行为两个用空格隔开的整数n和m。

第2~n+1行为n*m矩阵,其中每行有m个用单个空格隔开的非负整数。

1<=n, m<=80, 0<=aij<=1000

【数据输出】对每个数据,输出一行,为一个整数,即输入矩阵取数后的最大得

分。相邻两个输出间用一个空行隔开。

【样例输入】

1 4

4 5 0 5

2 10

96 56 54 46 86 12 23 88 80 43

16 95 18 29 30 53 88 83 64 67

【样例输出】

122

316994

埃及分数

【问题描述】

在古埃及,人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数。

如:2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为加数中有相同的。

对于一个分数a/b,表示方法有很多种,但是哪种最好呢?

首先,加数少的比加数多的好,其次,加数个数相同的,最小的分数越大越好。

如:

19/45=1/3 + 1/12 + 1/180

19/45=1/3 + 1/15 + 1/45

19/45=1/3 + 1/18 + 1/30,

19/45=1/4 + 1/6 + 1/180

19/45=1/5 + 1/6 + 1/18.

最好的是最后一种,因为1/18比1/180,1/45,1/30,1/180都大。

给出a,b(0〈a〈b〈1000),编程计算最好的表达方式。

【要求】

【数据输入】第一行:N 表示有N组测试数据,每组测试数据为一行包含a,b(0

〈a〈b〈1000)。

【数据输出】每组测试数据若干个数,自小到大排列,依次是单位分数的分母。

【样例输入】

1

19 45

【样例输出】

5 6 18

H数

timelimit:1 seconds

memlimit:32768 K

Prev |Next

【问题描述】

让我们来做做David Hilbert的一个练习题.

定义H数为4的正整数倍加1,比如: 1, 5, 9, 13, 17, 21, 25... 都是H数.可以证明两

个H数相乘结果还是H数.类似于整数,我们也可以把H数分为1, H素数和H合

数.一个H数为H素数,当且仅当,它除了1和自己之外,没有其他的H数整除它.

除了1和H素数外,其他的H数都是H合数.比如9是H素数,因为除了1和9之

外没有其他的H数整除9; 17和21也是H素数; 45是H合数,45=5×9,25也

是H合数,因为 25=5×5.

你的任务是计算H半素数的个数. 一个H数是H半素数,当且仅当,它能分解成两

个H素数的乘积.

这两个H素数可以是同一个数.比如25是H半素数,25=5×5。45也是H半素数,

45 = 5×9,而125不是H半

素数,125 = 5 × 5 × 5,它可以分解成3个H素数的乘积.

给你一个H数n,要求你输出有多少个不大于n的H半素数.

【要求】

【数据输入】输入包括多组数据,每组数据输出一行,包括一个整数n,(n ≤

1,000,001 )

最后一行为一个0,表示输入结束.

【数据输出】每个输入数据输出一行,先输出n,然后输出小于等于n的H数中有

几个是H半素数,这两个数用一个空格隔开

【样例输入】

21

85

789

0

【样例输出】

21 0

85 5

789 62

数列找数

Time Limit:1000MS Memory Limit:65536K

Total Submit:635 Accepted:263

【问题描述】

在一个数组A(N)各下标变量中存储N个互不相等的数,键盘输入正整数M(M≤

N),要求打印出数组中第M大的下标变量的值。

例如:数组A(10)的数据为:

A(1), A(2), A(3), A(4), A(5), A(6), A(7), A(8), A(9), A(10)

16, 57, 20, 19, 38, 41, 6, 13, 25, 32

M=3时的运行结果为: A(5)=38 (即第3大的数是A(5)=38)

【要求】

【数据输入】第一行为测试的数据的组数k,说明共有K组数据,每一组有两行。

每组中第一行为N,M,第二行为N个下标变量的值。

【数据输出】输出每一组数据中符合要求的下标值和下标变量值。

【样例输入】

2

5 1

6 8 3 4 5

3 2

1 2 3

【样例输出】

A(2)=8

A(2)=2

绝对值排序

Time Limit:1000MS Memory Limit:65536K

Total Submit:79 Accepted:50

【问题描述】

输入n(n<=100)个整数,按照绝对值从大到小排序后输出。题目保证对于每一个

测试实例,所有的数的绝对值都不相等。

【要求】

【数据输入】输入数据有多组,每组占一行,每行的第一个数字为n,接着是n

个整数,n=0表示输入数据的结束,不做处理。

【数据输出】对于每个测试实例,输出排序后的结果,两个数之间用一个空格隔

开。每个测试实例占一行。

【样例输入】

3 3 -4 2

4 0 1 2 -3

0

【样例输出】

-4 3 2

-3 2 1 0

求逆序对个数

Time Limit:1000MS Memory Limit:65536K

Total Submit:64 Accepted:28

【问题描述】

有一实数或者字母序列A[1]、A[2] 、A[3] 、……A[n-1] 、A[n],若i<j,并且

A[i]>A[j],则称A[i]与A[j]构成了一个逆序对,求字符串A中逆序对的个数。

【要求】

【数据输入】输入包括多个测试数据,每一行为一个,每个测试数据长度不超过

50000。

【数据输出】输出每个数据的逆序对。

【样例输入】

52462326

AEDCB

kfeFES54saW

【样例输出】

12

6

35

阶乘的和

Time Limit:1000MS Memory Limit:65536K

Total Submit:10 Accepted:4

【问题描述】

给一个非负整数,判断这个数是不是相互不同的非负整数的阶乘的和。

如6=3!;7=3!+ 1!;但5不是相互不同的非负整数的阶乘的和。

【要求】

【数据输入】有多组测试数据,输入为负数时结束。

【数据输出】如n是相互不同的非负整数的阶乘的和,输出YES,否则输出NO,

每个一行。

【样例输入】

5

6

【样例输出】

NO

YES

亲和数

Time Limit:1000MS Memory Limit:65536K

Total Submit:35 Accepted:26

【问题描述】

古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的

约数)之和为: 1+2+4+5+10+11+20+22+44+55+110=284。

而284的所有真约数为1、2、4、71、 142,加起来恰好为220。人们对这样的

数感到很惊奇,并称之为亲和数。一般地讲,如果两个数中任何一个数都是另一

个数的真约数之和,则这两个数就是亲和数。

你的任务就编写一个程序,判断给定的两个数是否是亲和数

【要求】

【数据输入】输入数据第一行包含一个数M,接下有M行,每行一个实例,包含

两个整数A,B; 其中 0 <= A,B <= 600000 ;

【数据输出】对于每个测试实例,如果A和B是亲和数的话输出YES,否则输

出NO。

【样例输入】

2

220 284

100 200

【样例输出】

YES

NO

麦森数

Time Limit:5s Memory limit:32M

Accepted Submit:114 Total Submit:585

【问题描述】

麦森数在数论中有着非常重要的地位,应用极广。形如2 ^ p – 1并且为质数的

数字即为麦森数。可以证明当2^p-1 为一质数的时候,p为质数。

你的任务是对于给出的整数,判断他能不能表示成2^p-1的形式,且p为质数。

【要求】

【数据输入】输入包含多组测试数据。每行一组数据,包含一个不超过10^10000

的整数。

【数据输出】

对于每组数据,如果该数字可以表示成2^p-1的形式,且p为质数,输出 “It may

be a Mason number.” 否则,输出“It must not be a Mason number.”

【样例输入】

3

4

15

【样例输出】

It may be a Mason number.

It must not be a Mason number.

It must not be a Mason number.

*********************************************************************

******

题目一:(7分)

1.

问题描述

正整数x 的约数是能整除x 的正整数。正整数x 的约数个数记为

div(x)。例如,1,2,5,10 都是正整数10 的约数,且div(10)=4。设a 和

b 是2 个正整数,a≤b,找出a 和b之间约数个数最多的数x。

2.

要求:

对于给定的2 个正整数a≤b,编程计算a 和b 之间约数个数最多的数。

3.

输入:

输入数据由文件名为的文本文件提供。文件的第1 行有2 个正

整数a和b。

4.

输出:

程序运行结束时,若找到的a 和b 之间约数个数最多的数是x,将div(x)

输出到文件中。

5.

输入输出文件样例:

1 36

题目二:(7分)

9

1.

问题描述:

给定一个整数序列,求出子段序列的最大和,也就是一段连续和元素的

和,使其和最大,(如果和为负数则返回0)。

2.

要求:

对于给定的n个数字的序列,编程计算最大子段和。

3.

输入:

由文件给出输入数据。文件第一行为n,第二行为n个整数序

列。

4.

输出:

将编程计算出的最大子段和输出到文件。

5.

输入输出文件样例:

9

3 4 -3 -6 8 -3 4 -2 -3

题目三:(9分)

9

1.

问题描述

实现将N进制到M进制数的转换(1 < N,M <= 36)。对于11到36进制

数,其基数使用从A到Z的英文字母(全部为大写)代替。例如对于11进

制,其基数10(十进制)使用"A"表示;对于36进制,其基数35(十进制)

使用"Z"表示。被转换的数全部为正数且小于2147483647(long型的最大

值)。下表为十进制数100对应的各进制数:

进制

数值

10

100

11

91

16

64

27

3J

35

2U

2.

要求:

(1). 实现10进制数到M进制数的转换。

(2). 程序具有较强的容错能力(例如对错误的输入数字串的处理)。

(3). N进制到M进制数(1 < N,M < 36)的转换(扩展要求,选做)。

3.

输入:

输入文件名为,文件内容格式为第一列为被转换数的进制数,

第二列为被转换数, 第三列为转换后的进制。这三列内容均为字符串形式。

每列之间使用一个空格隔开。

4.

输出:

输出文件名为,文件内容为转换后的数。对于一切错误,则

输出“error”字符串。

5.

输入输出文件样例:

样例1

10 100 27

样例2

3 140 27

error

3J

题目四:(9分)

1.

问题描述:

大于1 的正整数n可以分解为:n=x

1

*x

2

*…*x

m

。例如,当n=12 时,

共有8 种不同的分解式:

12=12;

12=6*2;

12=4*3;

12=3*4;

12=3*2*2;

12=2*6;

12=2*3*2;

12=2*2*3。

2.

要求: 对于给定的正整数n,编程计算n共有多少种不同的分解式。

3.

输入:文件给出输入数据。第一行有1 个正整数n (1≤n≤

2000000000)。

4.

输出:

将计算出的不同的分解式数输出到文件。

5.

输入输出文件样例:

12

*********************************************************************

*******

8

1、将一整数逆序后放入一数组中(要求递归实现)

void convert(int *result, int n) {

if(n>=10)

convert(result+1, n/10);

*result = n%10;

}

3、递归实现回文判断(如:abcdedbca就是回文,判断一个面试者对递归理解

的简单程序)

int find(char *str, int n) {

if(n<=1) return 1;

else if(str[0]==str[n-1]) return find(str+1, n-2);

else return 0;

}

组合问题(从M个不同字符中任取N个字符的所有组合)

void find(char *source, char *result, int n) {

if(n==1) {

while(*source)

printf("%s%cn", result, *source++);

} else {

int i, j;

for(i=0; source[i] != 0; i++);

for(j=0; result[j] != 0; j++);

for(; i>=n; i--) {

result[j] = *source++;

result[j+1] = '0';

find(source, result, n-1);

}

}

}

5、分解成质因数(如435234=251*17*17*3*2,据说是华为笔试题)

void prim(int m, int n) {

if(m>n) {

while(m%n != 0) n++;

m /= n;

prim(m, n);

printf("%d*", n);

}

}

9、有4种面值的邮票很多枚,这4种邮票面值分别1, 4, 12, 21,现从多张中最

多任取5张进行组合,求取出这些邮票的最大连续组合值。(据说是华为2003

年校园招聘笔试题)

#define N 5

#define M 5

int k, Found, Flag[N];

int Stamp[M] = {0, 1, 4, 12, 21};

// 在剩余张数n中组合出面值和Value

int Combine(int n, int Value) {

if(n >= 0 && Value == 0) {

Found = 1;

int Sum = 0;

for(int i=0; i

Sum += Stamp[Flag[i]];

printf("%d ", Stamp[Flag[i]]);

}

printf("tSum=%dnn", Sum);

}else for(int i=1; i0; i++)

if(Value-Stamp[i] >= 0) {

Flag[k++] = i;

Combine(n-1, Value-Stamp[i]);

Flag[--k] = 0;

}

return Found;

}

int main(int argc, char* argv[]) {

for(int i=1; Combine(N, i); i++, Found=0);

}

10、大整数数相乘的问题。(这是2002年在一考研班上遇到的算法题)

void Multiple(char A[], char B[], char C[]) {

int TMP, In=0, LenA=-1, LenB=-1;

while(A[++LenA] != '0');

while(B[++LenB] != '0');

int Index, Start = LenA + LenB - 1;

for(int i=LenB-1; i>=0; i--) {

Index = Start--;

if(B[i] != '0') {

for(int In=0, j=LenA-1; j>=0; j--) {

TMP = (C[Index]-'0') + (A[j]-'0') * (B[i] - '0') + In;

C[Index--] = TMP % 10 + '0';

In = TMP / 10;

}

C[Index] = In + '0';

}

}

}

11、求最大连续递增数字串(如“ads3sl456789DF3456ld345AA”中的“456789)”

int GetSubString(char *strSource, char *strResult) {

int iTmp=0, iHead=0, iMax=0;

for(int Index=0, iLen=0; strSource[Index]; Index++) {

if(strSource[Index] >= '0' && strSource[Index] <= '9' &&

strSource[Index-1] > '0' && strSource[Index] == strSource[Index-1]+1)

{

iLen++; // 连续数字的长度增1

} else { // 出现字符或不连续数字

if(iLen > iMax) {

iMax = iLen; iHead = iTmp;

}

// 该字符是数字,但数字不连续

if(strSource[Index] >= '0' && strSource[Index] <= '9') {

iTmp = Index;

iLen = 1;

}

}

}

for(iTmp=0 ; iTmp < iMax; iTmp++) // 将原字符串中最长的连续数字串赋值

给结果串

strResult[iTmp] = strSource[iHead++];

strResult[iTmp]='0';

return iMax; // 返回连续数字的最大长度

}

14、实现strstr功能,即在父串中寻找子串首次出现的位置。(笔试中常让面试

者实现标准库中的一些函数)

char * strstring(char *ParentString, char *SubString) {

char *pSubString, *pPareString;

for(char *pTmp=ParentString; *pTmp; pTmp++) {

pSubString = SubString;

pPareString = pTmp;

while(*pSubString == *pPareString && *pSubString != '0') {

pSubString++;

pPareString++;

}

if(*pSubString == '0') return pTmp;

}

return NULL;

}

16、2005年11月金山笔试题。编码完成下面的处理函数。函数将字符串中的

字符'*'移到串的前部分,前面的非'*'字符后移,但不能改变非'*'字符的先后顺序,

函数返回串中字符'*'的数量。如原始串为:ab**cd**e*12,处理后为*****abcde12,

函数并返回值为5。(要求使用尽量少的时间和辅助空间)

int change(char *str) { /* 这个算法并不高效,从后向前搜索效率要高

些 */

int count = 0; /* 记录串中字符'*'的个数 */

for(int i=0, j=0; str[i]; i++) { /* 重串首开始遍历 */

if(str[i]=='*') { /* 遇到字符'*' */

for(j=i-1; str[j]!='*'&&j>=0; j--) /* 采用类似插入排序的思想,将*前面 */

str[j+1]=str[j]; /* 的非*字符逐个后移,直到遇到*字符 */

str[j+1] = '*';

count++;

}

}

return count;

}

int change(char *str) {

int i,j=strlen(str)-1;

for(i=j; j>=0; j--) {

if(str[i]!='*') {

i--;

} else if(str[j]!='*') {

str[i] = str[j];

str[j] = '*';

i--;

}

}

return i+1;

}

22、删除字符串中的数字并压缩字符串(神州数码以前笔试题),如字符

串”abc123de4fg56”处理后变为”abcdefg”。注意空间和效率。(下面的算法只需

要一次遍历,不需要开辟新空间,时间复杂度为O(N))

#include "stdafx.h"

void delNum(char *str) {

int i, j=0;

// 找到串中第一个数字的位子

for(i=j=0; str[i] && (str[i]<'0' || str[i]>'9'); j=++i);

// 从串中第一个数字的位置开始,逐个放入后面的非数字字符

for(; str[i]; i++)

if(str[i]<'0' || str[i]>'9')

str[j++] = str[i];

str[j] = '0';

}

23、求两个串中的第一个最长子串(神州数码以前试题)。如

"abractyeyt","dgdsaeactyey"的最大子串为"actyet"。

char *MaxSubString(char *str1, char *str2) {

int i, j, k, index, max=0;

for(i=0; str1[i]; i++)

for(j=0; str2[j]; j++) {

for(k=0; str1[i+k]==str2[j+k] && (str2[i+k] || str1[i+k]); k++);

if(k>max) { // 出现大于当前子串长度的子串,则替换子串位置和程

index = j; max = k;

}

}

char *strResult = (char *)calloc(sizeof(char), max+1);

for(i=0; i

strResult[i] = str2[index++];

return strResult;

}

24、不开辟用于交换数据的临时空间,如何完成字符串的逆序(在技术一轮面试

中,有些面试官会这样问)

void change(char *str) {

for(int i=0,j=strlen(str)-1; i

str[i] ^= str[j] ^= str[i] ^= str[j];

}

}

25、删除串中指定的字符(做此题时,千万不要开辟新空间,否则面试官可能

认为你不适合做嵌入式开发)

#include "stdafx.h"

void delChar(char *str, char c) {

int i, j=0;

for(i=0; str[i]; i++)

if(str[i]!=c) str[j++]=str[i];

str[j] = '0';}

本文标签: 数据输入输出数字正整数