(新手向)中国大学mooc高级语言程序设计相关OJ解答(七)

中国大学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;
}

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页