学习c语言的第十七天

求一批整数中出现最多的个位数字

给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。

输入:整数的个数n,各个整数的值num。

输出:出现次数最多的个位数字的次数以及该个位数字。

优化目标:可能没有优化目标。

这道题的有一个部分很巧妙,最开始我在想到底要怎么把一个不知道是几位数的一个整数的每一位都放入数组,然后发现这一段代码:

        while(num>0){//找出每位上的数字 
        	a[num%10]++;
        	num=num/10;
		}

是很巧妙的方法,设置一个a[10],使用这段代码可以使得每个数的各个位置上的数都能被找出,并且在a[10]上体现,如122就会使得a[0]=1,a[1]=2,最后只要找出在a[10]上哪个值最大就能知道到底是哪个值出现最多。 

#include<stdio.h>
#include<stdlib.h>
int main(){
    int a[10]={0};
    int n, num;
    int x=0;
    int i;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%d",&num);
        while(num>0){//找出每位上的数字 
        	a[num%10]++;
        	num=num/10;
		}
    }
    int max=a[0];
    for(i=0;i<10;i++){
    	if(a[i]>max){
    		max=a[i];
		}
    }
    printf("%d:",max);
    for(i=0;i<10;i++){
    	if(a[i]==max){
    		printf("%d ",i);
		}
	} 
    return 0;
}

方阵循环右移 

本题要求编写程序,将给定n×n方阵中的每个元素循环向右移m个位置,即将第0、1、⋯、n−1列变换为第n−m、n−m+1、⋯、n−1、0、1、⋯、n−m−1列。

输入:n阶方阵,右移m个位置以及n×n方阵中的每个元素。

输出:每个元素循环向右移m个位置后的结果

优化目标:可能没有优化目标。

使用了两个二维数组,当m为n的倍数时,相当于直接输出n维数组,当m>n时,m=m%n;取余数,m<n时,可以直接用嵌套循环将右移后的方阵放入b数组中。

#include<stdio.h>
int main(){
    int m,n;
    int i,j;
    scanf("%d %d",&m,&n);
    int a[n][n];
    int b[n][n];
    for (i=0;i<n;i++){
        for(j=0;j<n;j++){
            scanf("%d", &a[i][j]);
        }
   }

    if(m%n==0){//若右移位数和方阵的n相同,则直接输出即可
        for (i=0;i<n;i++){
            for(j=0;j<n;j++){
                printf("%d ",a[i][j]);
            }
            printf("\n");
        }
        return 0;
    }
    if(m>n){
    	m=m%n;//右移位数大于n,则取余数
	}

	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			b[i][(j+m)%n]=a[i][j];
		}
	}

	for (i=0;i<n;i++){
        for(j=0;j<n;j++){
            printf("%d ",b[i][j]);
        }
        printf("\n");
    }
    
}

 

查找书籍 

给定n本书的名称和定价,本题要求编写程序,查找并输出其中定价最高和最低的书的名称和定价

输入:书的数量n,书的名称name和定价price。

输出:其中定价最高和最低的书的名称和定价。

优化目标:可能没有优化目标。
 

#include<stdio.h>
#include<string.h>
typedef struct book{
    char name[30];
    double price;
}book;
int main(){
	int n;
	int i;
	char c;
	int max=0 ,min=0;
	scanf("%d",&n);//书的数量n 
	book a[n];

	for(i=0;i<n;i++){
		scanf("%c",&c);
		gets(a[i].name);
		scanf("%lf",&a[i].price);
	}

	for(i=0;i<n;i++){

		if(a[i].price>a[max].price){
			max=i;
		}

		if(a[i].price<a[min].price){
			min=i;
		}
	}

	printf("%.2lf, %s\n",a[max].price,a[max].name);
    printf("%.2lf, %s\n",a[min].price,a[min].name);
    return 0;
}

 

数列求和-加强版 

给定某数字A(1≤A≤9)以及非负整数N(0≤N≤100000),求数列之和S=A+AA+AAA+⋯+AA⋯A(N个A)。例如A=1, N=3时,S=1+11+111=123。

 

输入:数字A以及非负整数N

输出:数列之和S=A+AA+AAA+⋯+AA⋯A(N个A)。

优化目标:可能没有优化目标。

#include<stdio.h>
#include <math.h>
int main(){
	int a;
	int n;
	scanf("%d%d",&a,&n);
	int num[100000]; 
	int i,k=1,t=1,count;//t=1表示默认num[0]上无数字 
	int c=0;
	if(n==0){
		printf("0");
		return 0;
	}
	for(i=n;i>=1;i--){
		num[i]=(i*a+c)%10;
		c=i*a/10;
		k++;
		if(c&&i==1){
			num[0]=c;
			t=0;//表示num[0]上有数字 
		}
	}
	for(i=t;i<k;i++){
		printf("%d",num[i]);
	} 
}

 

从尾到头打印链表

输入:链表的从头到尾各个结点的值num。

输出:从尾到头打印出链表的值。

优化目标:可能没有优化目标。

因为单链表是有指向的,为了实现从尾到头打印链表就可以使用递归。

#include<stdio.h>
#include<stdlib.h>
typedef struct LNode * linklist;
struct LNode{
	int data;
	linklist next;
};
linklist initlist(){
	int num;
	linklist l=(linklist)malloc(sizeof(struct LNode));
	l->next=NULL; 
	linklist L1=l;
	linklist q;
	scanf("%d",&num);
	while(num!=-1){
		q=(linklist)malloc(sizeof(struct LNode));
		q->next=NULL;
		q->data=num;
		L1->next=q;
		L1=q;
		scanf("%d",&num);
	}
	return l;
}
void reverse(linklist L){
	if(L==NULL){
		return 0;
	}
	if(L->next!=NULL){
		reverse(L->next);
	}
	printf("%d ",L->data);
}
int main (){
	linklist L=initlist();
	L=L->next;
	linklist L1=L;
	printf("从尾至头打印:");
	reverse(L);
	printf("\n");
	printf("从头至尾打印:");
	while (L1!=NULL){
		printf("%d ",L1->data);
		L1=L1->next;
	}
}

 查找单链表倒数第k个节点(要求只能遍历一遍链表)

输入:链表的从头到尾各个结点的值num,以及倒数第k个节点的k的值。

输出:倒数第k个节点的值。

优化目标:可能没有优化目标。

#include<stdio.h>
#include<stdlib.h>
typedef struct LNode * linklist;
struct LNode{
	int data;
	linklist next;
};

linklist initlist(){
	int num;
	linklist l=(linklist)malloc(sizeof(struct LNode));
	l->next=NULL; 
	linklist L1=l;
	linklist q;
	scanf("%d",&num);
	while(num!=-1){
		q=(linklist)malloc(sizeof(struct LNode));
		q->next=NULL;
		q->data=num;
		L1->next=q;
		L1=q;
		scanf("%d",&num);
	}
	return l;
}

linklist find(linklist L,int k){
	linklist fast=L,slow=L;
    int i;
	for(i=0;i<k;i++){
		fast=fast->next;
	}
	while(fast!=NULL){
		fast=fast->next;
		slow=slow->next;
	}
	return slow;
}

int main (){
	linklist L=initlist();
	int k;
	printf("请输入要找到倒数第几个数字"); 
	scanf("%d",&k);
	linklist L1=L->next;
	linklist k1=find(L,k);
	printf("从头至尾打印:");
	while (L1!=NULL){
		printf("%d ",L1->data);
		L1=L1->next;
	}
	printf("\n");
	printf("倒数第%d个数字的值为:",k);
	printf("%d",k1->data);
}

今天复习了一些c语言的例题和链表的一部分内容,明天也会继续复习链表和栈的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值