请实现一个计票统计系统。你会收到很多投票,其中有合法的也有不合法的,请统计每个候选人得票的数量以及不合法的票数。
(注:不合法的投票指的是投票的名字不存在n个候选人的名字中!!)
数据范围:每组输入中候选人数量满足 ,总票数量满足
第一行输入候选人的人数n,第二行输入n个候选人的名字(均为大写字母的字符串),第三行输入投票人的人数,第四行输入投票。
按照输入的顺序,每行输出候选人的名字和得票数量(以" : "隔开,注:英文冒号左右两边都有一个空格!),最后一行输出不合法的票数,格式为"Invalid : "+不合法的票数。
4 A B C D 8 A D E CF A GG A B
A : 3 B : 1 C : 0 D : 1 Invalid : 3
E CF GG三张票是无效的,所以Invalid的数量是3.
#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; }