中国大学mooc高级语言程序设计地址:https://www.icourse163.org/course/JLU-62001
第十一讲:结构化程序开发 & 动态数据组织初步–编程题
1自守数(10分)
问题描述:若一个整数a满足条件a*a的尾数等于a则称a为自守数,例如
25* 25=625,76* 76=5776, 9376* 9376=87909376
都是自守数。编写程序,求n以内所有自守数。
输入:从键盘随机输入一个非负整数作为n值。
输出:输出小于n的所有自守数,每行一个。
样例1:输入
10
输出
1
5
6
#include<stdio.h>
#include<math.h>
void cal(int n){
int sum=0,r=1;
int i,t=n;
int mul=n*n;
while(n>9){/*求位数*/
n/=10;
r++;
}
for(i=0;i<r;i++){/*取平方数后r位*/
sum=sum+mul%10*pow(10,i);
mul/=10;
}
if(sum==t)printf("%d\n",t);//输出自守数
}
int main(){
int n,i;
scanf("%d",&n);
for(i=1;i<=n;i++)cal(i);
return 0;
}
2正整数分解(10分)
问题描述:对于正整数n(n<=20),输出其和等于n的所有不增的正整数和式。
输入:从键盘随机输入一个正整数n。
输出:所有和为n的正整数和式,每个和式占一行。
样例1:输入
4
输出
4=3+1
4=2+2
4=2+1+1
4=1+1+1+1
样例2:输入
5
输出
5=4+1
5=3+2
5=3+1+1
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1
#include <stdio.h>
#include <math.h>
int ans[100],cnt;
void dfs(int m,int c,int n){
//printf("%d %d\n",m,n);
if(!m) {
//printf("%d\n",cnt);
printf("%d=",n);
for(int i=0;i<cnt-1;i++){
printf("%d+",ans[i]);
}
printf("%d\n",ans[cnt-1]);
return;
}
for(int i=c;i;i--){
ans[cnt++]=i;
if(m-i>=0) dfs(m-i,i,n);
cnt--;
}
return;
}
int main(void){
int n;
scanf("%d",&n);
dfs(n,n-1,n);
return 0;
}
关于深度搜索DFS,概念在这:https://blog.csdn.net/qq_40763929/article/details/81629800
建议仔细了解后再做题。
第十二讲:动态数据结构应用–编程题
1创建单向链表(10分)
问题描述:根据随机输入的若干非零整数,以数字0结束;建立一个新链表。
输入:随机输入若干个整数,以数字0结束
输出:新建链表中个节点的值,数字间没有间隔字符。
样例:输入 5 4 2 1 3 0 输出 54213
#include<stdio.h>
#include<stdlib.h>
struct num{
int number;
struct num* next;
};
struct num*create(void){
struct num*p=NULL,*p0,*head;
head=(struct num*)malloc(sizeof(struct num));
p0=head;
p0->next=NULL;
do{
p=(struct num*)malloc(sizeof(struct num));
scanf("%d",&p->number);
p0->next=p;
p0=p;
p0->next=NULL;
}while(p->number!=0);
return head->next;
}
void ouput(struct num*head){
struct num*a;
a=head;
while(a->number!=0){
printf("%d",a->number);
a=a->next;
}
}
int main(){
struct num*t;
t=create();
ouput(t);
return 0;
}
2删除单向链表中指定节点(10分)
问题描述:删除非零整数链表中包含的指定整数值节点。
输入:第一行,以数字0结束的若干非零整数作为新建链表的各节点值;
第二行,一个整数作为删除节点值。
输出:删除后的链表中各节点值。
样例:输入 4 2 1 3 3 2 0
3
输出 4212
#include<stdio.h>
#include<stdlib.h>
struct num{
int number;
struct num* next;
};
struct num*create(void){
struct num*head,*p0,*p=NULL;
head=(struct num*)malloc(sizeof(struct num));
p0=head;
p0->next=NULL;
do{
p=(struct num*)malloc(sizeof(struct num));
scanf("%d",&p->number);
p0->next=p;
p0=p;
p0->next=NULL;
}while(p->number!=0);
return head->next;//修改头指针,head->next才为链表头
}
int input(){
int key;
scanf("%d",&key);
return key;
}
void output(struct num*head){
struct num*p0=head;
while(p0->number!=0){
printf("%d",p0->number);
p0=p0->next;
}
}
void del(struct num*head,int key){
struct num*p0=head,*p=NULL;
while(p0->number==key)//修改头指针
p0=p0->next;
p=head=p0;
//printf("%d\n",head->number);
while(p->number!=0){
p=p0->next;
while(p->number==key){
p0->next=p->next;
p=p0->next;
}
if(p->number==0)break;
p0=p0->next;
}
output(head);
}
int main(){
struct num*head;
head=create();
del(head,input());
return 0;
}