以下为2023年c语言本科组的模拟题的7~10题以及我自己写的部分程序,由于水平有限,程序中还有很多错误与不足,恳请大家指教。
7.**设计(满分5分)
625这个数字很特别,625的平方等于390625,刚好其末3位是625本身。除了625,还有其它的3位数有这个特征吗?
请编写程序,寻找所有这样的3位数:它的平方的末3位是这个数字本身。
输出结果中,从小到大,每个找到的数字占一行。比如那个625就输出为:
解题思路:对所有的三位数从小到大进行穷举,判断是否符合条件,若符合则输出。
实现方法:先求出当前三位数的平方,用平方数减去该三位数,再用平方数对1000求余,若余数为0则该三位数符合条件,将该三位数输出。
程序**:#include
using namespace std;
int main()
for(int i = 100; i <=999; +i)
return 0;运行结果:
9.**设计(满分18分)
整数的分划问题。
如,对于正整数n=6,可以分划为:
现在的问题是,对于给定的正整数n,编写算法打印所有划分。
用户从键盘输入n(范围1~10)
程序输出该整数得所有划分。
解题思路:从n到1进行循环,将n分解,分解得到的数中的最大的数是当前的循环变量,然后在分解得到的数中从后往前依次将大于1的数进行分解,为便于实现这一过程我们将分解完的数存放到链表中。
实现方法:将将要被分解的数存放到链表第一个结点的位置,然后将其分解,将分解得到的数再存入到链表中,然后在从后往前遍历分解得到的数,依次对大于1的数调用分解函数进行分解。每分解一次便输出一次。
程序**:#include
#define null 0
using namespace std;
typedef struct mynum
调用fun()函数对第一个数以后的数进行分解。
fun(head->next);
cout< }
return 0;
/将pot的x域中的数分解成最大值为i的n个数的和,并连接到链表中的原来位置。
nump s(nump pot,int i)
nump q,p,temp;
p = pot;
q = pot;
temp = p->next;
int a = p->x - i;
p->x = i;
while(a >=1)
else q->next = null;
p->next = q;
p = q;
q->next = temp;
return pot;
/使用该函数对链表中除第一个以外的所有大于1的数调用是s()函数,自后向前进行分解。
void fun(nump px)
if(px ==null) return;
nump q,p;
q = px;
fun(q->next);
if(q->x > 1 &&q->next ==null ||q->next->x ==1))
对刚得到的结点中的数进行分解。
fun(q);
运行结果:please input a integer(1~10):
现在开始分解:
10.**设计(满分20分)
一个n位的十进制正整数,如果它的每个位上的数字的n次方的和等于这个数本身,则称其为花朵数。
例如:当n=3时,153就满足条件,因为1^3+5^3+3^3=153,这样的数字也被称为水仙花数(其中,“^表示乘方,5^3表示5的3次方,也就是立方)。
当n=4时,1634满足条件,因为1^4+6^4+3^4+4^4=1634.
当n=5时,92727满足条件。
实际上,对n的每个取值,可能有多个数字满足条件。
程序的任务是:求当n=21时,所有满足条件的水仙花数。注意:这个整数有21位,它的各个位数字的21次方之和正好等于这个数本身。
如果满足条件的数字不只有一个,请从小到大输出所有符合条件的数字,每个数字占一行。因为这个数字很大,请注意解法时间上的可行性。要求程序在3分钟内运行完毕。
解题思路:这是一个组合问题。这个21位的数字是由0~9这十个数字组成的,先统计出该数字中每个数字出现的个数,然后求出各个位上数字的21次方之和(可用查表法),并统计出和中每个数字出现的个数,将每个数字在这个21位数中和在和**现的次数进行比较,若所有的数字出现的次数均相同,则此时的21位数就是一个水仙花数,将其输出。
通过计算我们容易知道,9的21次方为一个21位数(109418989131512359209),因此,在这个21位数当中9最多只能出现9次。
实现方法:使用循环穷举出0~9这十个数字所有可能出现的次数的组合,并进行验证。(由于采用了递归这样比较低效的方法穷举这些组合,导致了最开始程序在运行的时候运行时间远远超过了题目要求,因此本程序中穷举组合数时使用的算法是借鉴于他人的,其源程序另附在**文件夹中,请大家参阅)。
程序**:#include
#define n 21
using namespace std;
void fang(int x);
int arr[10][21];
int main()
int cot[10];
for(int i = 0;i < 10; +i)
* for(int h = 0;h <=9;++h)
max[h] =j;
cout< }
//生成一个n位数并计数该数中每个数字出现的次数。
for(cot[9] =0;cot[9] <9; +cot[9])
for(cot[8] =0;cot[8] for(cot[7] =0;cot[7] for(cot[6] =0;cot[6] for(cot[5] =0;cot[5] for(cot[4] =0;cot[4] for(cot[3] =0;cot[3] for(cot[2] =0;cot[2] 参 一 填空题。注意 逗号表达式的值只取决于最后一个逗号后面的表达式,但前面的表达式也是依次执行的。int a b c 4 是不允许的,但是int a,b,c a b c 4 是允许的,a b c 4 相当于a b c 4 注意c 4不是赋值语句,而是赋值表达式,相当于先把4的值赋给c再执行后面的运... 说明 务必请在d 盘 或e 考试完毕及时在机器上批改打分,并按学院要求上报成绩。一 windows操作题。1 在ks目录有一个 windows题 文件夹,按以下要求完成操作 1 在 windows题 下建立 1 和 user1 文件夹。2 在 windows题 下查找 或搜索 所有的扩展名为rar文... 一 单选题。1.以下正确的语句是。a.long b 2 3 b.int a 1 4 c.float x 3 d.double y 3 2.循环语句中,break的作用是 a.结束本次循环。b.从本循环体内跳出。c.跳出子函数。d.终止程序运行。3.有如下函数调用语句,则可以判断该函数的参数个数是 f...2019C语言模拟题答案
2019夏考机考模拟题 本科
上海2023年计算机二级C语言考试模拟题