第一行输入一个整数
代表候选人数。
第二行输入
个长度为
、仅由大写字母构成的字符串
,代表候选人的名字。保证候选人的名字互不相同。
第三行输入一个整数
代表投票人数。
第四行输入
个长度为
、仅由大写字母构成的字符串
,代表投票内容。
对于每一位候选人,新起一行。先输出其名字,随后输出一个空格、一个冒号、一个空格作为间隔,最后输出其获得的票数。形如
,其中
是候选人的名字,
是候选人的票数。
最后一行以相同的格式输出无效票的数量。形如
,其中
是无效票的数量。
4 A B C D 8 A D E CF A GG A B
A : 3 B : 1 C : 0 D : 1 Invalid : 3
在这个样例中,
三张票是无效的。
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 100 typedef struct statistic { char name[20]; int votes; } statistic ; void function(int candidates, statistic name_votes[], int people, char ticket[]); int main() { int candidates = 0, people = 0, i = 0; //candidates候选人数量,people投票人人数 char ticket[1000]; //存储所有投票结果,未单独存储每一种票选结果,故计票数组长度设置尽可能长 statistic name_votes[MAX]; //定义候选人+票数的结构体数组 scanf("%d", &candidates); //第一行输入candidates候选人数 //初始化结构体数组 for (i = 0; i < MAX; i++) { memset(name_votes[i].name, '\0', sizeof(name_votes[i].name)); name_votes[i].votes = 0; } //第二行输入n个候选人的名字(均为大写字母的字符串) for (i = 0; i < candidates; i++) { scanf("%s", name_votes[i].name); name_votes[i].votes = 0; } scanf("%d", &people); //第三行输入投票人数 scanf(" %[^\n]s", ticket); //第四行输入投票 function(candidates, name_votes, people, ticket); return 0; } /* * 功能:统计票选结果 * 参数:candidates候选人数量, name:n个候选人的名字, people投票人数, ticket投票具体情况 */ void function(int candidates, statistic name_votes[], int people, char ticket[]) { if(candidates < 1 || candidates > 100) exit(-1); if(strlen(ticket) < 1 || strlen(ticket) > 1000) exit(-1); int i = 0, j = 0, invalid_votes = 0; char *token = NULL; token = strtok(ticket, " "); while(token != NULL){ int flag = 0; for (j = 0; j < candidates; j++) { // 若候选人名字在每一个具体投票里,则计数+1 if (strcmp(token, name_votes[j].name) == 0) { name_votes[j].votes++; flag = 1; break; } } if (!flag) { invalid_votes++; // 无效投票 } token = strtok(NULL, " "); // 获取下一个投票 } for(i=0; i < candidates; i++){ printf("%s : %d\n", name_votes[i].name, name_votes[i].votes); } printf("Invalid : %d", invalid_votes); }
#include <stdio.h> #include <string.h> int main() { int n=0; scanf("%d", &n); char name[100][50]={0}; for(int i=0; i<n; i++) scanf("%s", name[i]); int votenum=0; scanf("%d", &votenum); char temp[50]; int num[100]={0},invalid=0,flag = 0; for(int i=0; i<votenum; i++) { memset(temp, 0, 50*sizeof(char)); scanf("%s", temp); for(int j=0; j<n; j++) { if(!strcmp(temp, name[j])){ num[j]++; flag = 1; break; } } if(flag == 0) invalid++; flag = 0; } for(int i=0; i<n; i++) { printf("%s : %d\n", name[i], num[i]); } printf("Invalid : %d", invalid); return 0; }
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int a, b; int invalidcnt=0; scanf("%d",&a); int cnt[a]; char *A[a+1]; for(int i=0;i<a;i++) { cnt[i]=0; A[i]=(char*)malloc(sizeof(char)*100); scanf("%s",A[i]); } scanf("%d",&b); char *B[b+1]; for(int i=0;i<b;i++) { B[i]=(char*)malloc(sizeof(char)*100); scanf("%s",B[i]); } for(int i=0;i<b;i++) { int valid=0; for(int j=0;j<a;j++) { if(!strcmp(B[i], A[j])) { //printf("%s 有效\n",B[i]); valid=1; cnt[j]++; break; } } if(valid==0) invalidcnt++; } for(int i=0;i<a;i++) { printf("%s : %d\n",A[i],cnt[i]); } printf("Invalid : %d",invalidcnt); return 0; }
#include <stdio.h> #include <stdlib.h> typedef struct candidate{ char name[15]; } cdd; int trans(char *a){ int sum=0,i; for(i=0;a[i]!='\0';i++){ sum+=a[i]; } return sum; } int main() { int n,i,m,invalid=0; //n个候选人,m张票 scanf("%d",&n); cdd a[100]; int hash[1000]={0}; for(i=0;i<n;i++){ scanf("%s",a[i].name); hash[trans(a[i].name)]=1; } scanf("%d",&m); char vote[13]; for(i=0;i<m;i++){ scanf("%s",vote); int s=trans(vote); if(hash[s]==0) invalid++; else hash[s]++; } for(i=0;i<n;i++){ printf("%s : %d\n",a[i].name,hash[trans(a[i].name)]-1); } printf("Invalid : %d\n",invalid); return 0; } 使用哈希函数,时间复杂度O(n)。
#include <stdio.h> #include <stdlib.h> #include <string.h> struct people{ char* name; int ticket; struct people* next; }; //使用链表的形式存储候选人 int main() { int n, m, invaild = 0; struct people head; //创建链表头 char name[100]; struct people* cur = &head; //链表当前指针 scanf("%d", &n); for(int i=0; i<n; i++){ scanf("%s", name); //获取候选人名字 struct people *tmp = (struct people*)malloc(sizeof(struct people)); //动态申请节点 tmp->name = (char*)malloc(sizeof(char)*100); //为节点的候选人名称申请空间 strcpy(tmp->name, name); //候选人名称赋值 tmp->ticket = 0, tmp->next = NULL; //初始节点 cur->next = tmp; //将新节点加入链表 cur = cur->next; } scanf("%d", &m); for(int i=0; i<m; i++){ scanf("%s", name); //获取投票信息 cur = head.next; //cur指向链表第一个节点 while(cur){ //遍历链表 if(strcmp(name, cur->name) == 0){//找到对应的候选人, cur->ticket++; //票数加1 break; //跳出循环 } cur = cur->next; } if(!cur)invaild++; //找不到对应候选人,不合法票数+1 } cur = head.next; for(int i=0; i<n; i++){ printf("%s : %d\n", cur->name, cur->ticket); cur = cur->next; } printf("Invalid : %d", invaild); return 0; }
#include <stdio.h> #include <string.h> #define N 100 int main() { char str[N][N],temp[N]; int peo,vote,i,j,arr[N]={0}; scanf("%d",&peo); for(i=0;i<peo;i++) { scanf("%s",str[i]); } scanf("%d",&vote); for(i=0;i<vote;i++) { scanf("%s",temp); for(j=0;j<peo;j++) { if(!strcmp(str[j],temp)) { arr[j]++; break; } } if(j==peo) arr[peo]++; } for(i=0;i<peo;i++) { printf("%s : %d\n",str[i],arr[i]); } printf("Invalid : %d\n",arr[peo]); return 0; }
#include<stdio.h> #include<string.h> typedef struct table { char name[10]; int count; }name; int main(){ int candidate_number; while(scanf("%d",&candidate_number)!=EOF){ name candidate[candidate_number]; for(int i=0;i<candidate_number;i++){ scanf("%s",candidate[i].name); candidate[i].count=0; } int vote_number; scanf("%d",&vote_number); name vote[vote_number]; for(int i=0;i<vote_number;i++){ scanf("%s",vote[i].name); vote[i].count=0; } int Invalid=vote_number; for(int i=0;i<candidate_number;i++){ for(int j=0;j<vote_number;j++){ if(strcmp(candidate[i].name,vote[j].name)==0){ candidate[i].count++; Invalid--; } } } for(int i=0;i<candidate_number;i++){ printf("%s : %d\n",candidate[i].name,candidate[i].count); } printf("Invalid : %d\n",Invalid); } return 0; }
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct { char name[30]; int cnt; }ele; ele arr[100] = {0}; int num = 0; void add_ele(char* n) { strcpy(arr[num++].name,n); } int add_cnt(char* name) { int i; for(i=0;i<num;i++) { if(!strcmp(name,arr[i].name)) { arr[i].cnt++; return 0; } } return 1; } void reset_all() { num = 0; memset(arr,0,sizeof(arr)); } void print_cnt(int e) { int i; for(i=0;i<num;i++) { printf("%s : %d\n",arr[i].name,arr[i].cnt); } printf("Invalid : %d\n",e); reset_all(); return; } int main() { char name[30]={0}; int n,i,e; reset_all(); while(scanf("%d",&n)!=EOF) { e = 0; for(i=0;i<n;i++) { scanf("%s\n", name); add_ele(name); } scanf("%d",&n); for(i=0;i<n;i++) { scanf("%s\n", name); e+=add_cnt(name); } print_cnt(e); } }
// hash #include <stdio.h> typedef struct { char *name; int count; } Vote; Vote g_vote[100]; int g_index; int GetIndex(char *name) { for (int i = 0; i < sizeof(g_vote) / sizeof(Vote); i++) { if (g_vote[i].name != NULL && strcmp(name, g_vote[i].name) == 0) { return i; } } return -1; } int InsertVote(char *name) { int i = GetIndex(name); if (i >= 0) { g_vote[i].count++; return 0; } return -1; } void InsertName(char *name) { g_vote[g_index].name = name; g_vote[g_index].count = 0; g_index++; } int main(void) { int n = 0; while (scanf("%d", &n) != EOF) { g_index = 0; memset(g_vote, 0, sizeof(g_vote)); char name[50] = {'\0'}; for (int i = 0; i < n; i++) { scanf("%s", name); char *tmp = (char *)malloc(sizeof(char) * (strlen(name) + 1)); strncpy(tmp, name, strlen(name) + 1); InsertName(tmp); } int can = 0; int invalid = 0; scanf("%d", &can); for (int i = 0; i < can; i++) { scanf("%s", name); if (InsertVote(name) != 0) { invalid++; } } for (int i = 0; i < g_index; i++) { printf("%s : %d\n", g_vote[i].name, g_vote[i].count); } printf("Invalid : %d\n", invalid); } }
#include "stdio.h" #include "string.h" int main() { int n,N,k; char str1[1000] = {0}; int MatchFlag = 0; while(scanf("%d", &n) != EOF) { char str_temp[100] = {0}; char str2[100] = {0}; int vote[100] = {0}; int object = 0; int Invalid = 0; getchar(); memset(str1,0,sizeof(str1)); scanf("%[^\n]", str1);//只有%s才会自动在末尾加入终止符\0,故这里没有终止符,会被上一次脏数据影响。 scanf("%d", &N); //getchar(); for(int i=0; i<N; i++) { scanf("%s", str2); object = 0; MatchFlag = 0; for(int j=0; str1[j] != '\0'; j++) { k=0; memset(str_temp,0,sizeof(str_temp)); while(str1[j] != ' ' && str1[j] != '\0') { str_temp[k] = str1[j]; k++, j++; } if(strcmp(str_temp,str2) == 0) { vote[object]++; MatchFlag = 1; break; } else object++; } if(!MatchFlag) Invalid++; } object = 0; for(int j=0; str1[j] != '\0'; j++) { k=0; memset(str_temp,0,sizeof(str_temp)); while(str1[j] != ' ' && str1[j] != '\0') { str_temp[k] = str1[j]; k++, j++; } printf("%s : %d\r\n", str_temp, vote[object]); object++; } printf("Invalid : %d\r\n", Invalid); } return 0; }
#include <stdio.h> //#include <malloc.h> //#include <string.h> #include <stdlib.h> //#define MAX_LEN 20 int main(void){ int n = 0;//候选人数 while(scanf("%d",&n)!=EOF){ //scanf("%d",&n)!=EOF;//输入候选人数; char names[100][20] ; char name[20] = {'0'}; //char EmptyName[MAX_LEN] = {'\0'}; int votes[100] = {0}; int invalidCount = 0 ; int total = 0; for(int i = 0; i < n; i++){ scanf("%s",names[i]); }//输入候选人名; scanf("%d",&total); for(int i = 0; i < total;i++){ //strcpy(name,EmptyName); memset(name,0,20); scanf("%s",name); for(int j=0;j<n;j++){ if(0==strcmp(name,names[j])){ votes[j]++; break; } if(j==n-1){ invalidCount ++; //printf("i = %d,j= %d,invalid = %d\n",i,j,invalidCount); } } } for(int i=0;i<n;i++){ printf("%s : %d\n",names[i],votes[i]); } printf("Invalid : %d\n",invalidCount); } return 0; }