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; 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';}
版权声明:本文标题:c语言竞赛题目精选 内容由热心网友自发贡献,该文观点仅代表作者本人,
转载请联系作者并注明出处:https://www.elefans.com/dongtai/1721220058a866605.html,
本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论