第四周周报

本周是结构体一题和一个算法题。

第一:选票的统计

设有三个班长fu,lu,shou,全班共80个人,每个人只能选一位班长候选人名字,再按得票数从高到低的顺序输出各候选人的票数。

代码如下:

#include<stdio.h>
#include<string.h>
	struct person
	{
		char name[20];
		int count;
	 } ;
	void main()
	{
	 	struct person leader[3]={"fu",0,"lu",0"shou",0},t;
	 	int i,j,k;
	 	int n=3,m;
	 	char name[20];
	 	printf("please inputn count of votes:");
		scanf("%d",&m);
		printf("please input the election's name:\n");
		for(i=1;i<=m;i++)
		{
			printf("No.%d:",i);
			scanf("%s",name);
			for(j=0;j<3;j++)
				if(strcmp(name,leader[j].name)==0)
					leader[j].count++;
		}
		for(i=0;i<n-1;i++)
		{
			k=i;
			for(j=i+1;j<n;j++)
				if(leader[k].count<leader[j].count)
					k=j;
				if(k!=i)
				{
					t=leader[i];
					leader[i]=leader[k];
					leader[k]=t;
				}
		}
		printf("the vote of leader is:\n");
		for(i=0;i<n;i++)
			printf("%s\t%d\n",leader[j].name,leader[i].count);
		return 0;
	}










运行结果:

please inputn count of votes:10
please input the election's name:
No.1:fu
No.2:lu
No.3:shou
No.4:fu
No.5:shou
No.6:lu
No.7:lu
No.8:shou
No.9:fu
No.10:lu
the vote of leader is:
        4
        3
        3

第二:约瑟夫环问题

编号为 1,2,3,…,n 的 n 个人围坐一圈,任选一个正整数 m 作为报数上限值,从第一个人开始按顺时针方向报数,报数到 m 时停止,报数为 m 的人出列。从出列人的顺时针方向的下一个人开始又从 1 重新报数,如此下去,直到所有人都全部出列为止。
算法思想
每个人的编号存放在一个数组 a 中,主函数中决定人数的个数以及报数的上限值 m,设计一个函数实现对应的操作。函数的形参有整型数组 a、整数 n 和 m,n 用来接收传递的人数,m 用来接收报数上限,函数的返回值为空;函数体中输出出列人的顺序。

函数中利用循环访问数组中 n 个元素,每次访问元素,设定内循环连续访问 m 个元素,元素访问的下标为 k,访问到第 m 个元素时,如果元素不是 0,此时输出元素 a[k],再设定 a[k] 为 0,继续访问后面的元素。

主函数中设定数组 a,从键盘输入 n 和 m,利用循环产生 n 的位置序号存放到数组 a 中,调用函数实现相应的操作。

输入:

input n and m:15 4

 
#include <stdio.h>
#define N 100
int josef(int a[],int n,int m)
{
    int i,j,k=0;
    for(i=0;i<n;i++)
    {
        j=1;
        while(j<m)
        {
            while(a[k]==0)
            k=(k+1)%n;
            j++;
            k=(k+1)%n;
        }
        while(a[k]==0)
        k=(k+1)%n;
        printf("%d ",a[k]);
        a[k]=0;
    }
    return 0;
}

int main()
{
    int a[100];
    int i,j,m,n;
    printf("input n and m:");
    scanf("%d%d",&n,&m);
    for(i=0;i<n;i++)
        a[i]=i+1;
    printf("\n output:\n");
    josef(a,n,m);
    printf("\n");
    return 0;
}

运行结果:

input n and m:15 4

output:
4 8 12 1 6 11 2 9 15 10 5 3 7 14 13

本周分享就到这里,谢谢大家阅读!

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值