本周是结构体一题和一个算法题。
第一:选票的统计
设有三个班长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
本周分享就到这里,谢谢大家阅读!