C语言实现国家频次统计并输出TOP3国家的实现方案咨询
解决方案
你当前的核心问题是:C语言没有根据字符串动态匹配变量名的机制,你单独定义上百个和国家名同名的计数变量,无法和国家列表的匹配结果关联,自然没办法实现累加。
最优实现思路(适合初学者,无需复杂数据结构)
用与国家列表下标一一对应的计数数组实现关联:
- 定义和
countrylist长度完全相同的int类型计数数组,初始值全部设为0 countrylist[i]存储第i个国家的名称,counts[i]存储对应国家的出现次数,两者通过下标i直接绑定- 匹配到第i个国家时,直接执行
counts[i]++即可完成计数累加 - 最后遍历计数数组,筛选出次数最高的3个国家输出即可
完整可运行代码
#include <stdio.h> #include <string.h> // 全球国家列表,补充示例需要的USA/UK别名方便测试 char * countrylist [] = {"USA","UK","Laotian / Lao","Afghanistan","Albania","Algeria","Andorra","Angola","Antigua and Barbuda","Argentina","Armenia","Australia" ,"Austria","Austrian Empire","Azerbaijan","Baden","Bahamas","Bahrain","Bangladesh","Barbados","Bavaria","Belarus","Belgium","Belize","Benin","Bolivia" ,"Bosnia and Herzegovina","Botswana","Brazil","Brunei","Brunswick and Luneburg","Bulgaria","Burkina Faso","Upper Volta","Burma","Burundi","Cabo Verde" ,"Cambodia","Cameroon","Canada","Cayman Islands","Central African Republic","Central American Federation","Chad","Chile","China","Colombia","Comoros" ,"Congo Free State","Costa Rica","Cote dIvoire","Ivory Coast","Croatia","Cuba","Cyprus","Czechia","Czechoslovakia","Democratic Republic of the Congo" ,"Denmark","Djibouti","Dominica","Dominican Republic","Duchy of Parma","East Germany","Ecuador","Egypt","El Salvador","Equatorial Guinea","Eritrea" ,"Estonia","Eswatini","Ethiopia","Federal Government of Germany","Fiji","Finland","France","Gabon","Gambia","Georgia","Germany","Ghana","Grand Duchy of Tuscany" ,"Greece","Grenada","Guatemala","Guinea","Guinea Bissau","Guyana","Haiti","Hanover","Hanseatic Republics","Hawaii","Hesse","Holy See","Honduras","Hungary" ,"Iceland","India","Indonesia","Iran","Iraq","Ireland","Israel","Italy","Jamaica","Japan","Jordan","Kazakhstan","Kenya","Kingdom of Serbia","Kingdom of Yugoslavia" ,"Kiribati","Korea","Kosovo","Kuwait","Kyrgyzstan","Latvia","Lebanon","Lesotho","Lew Chew","Loochoo","Liberia","Libya","Liechtenstein","Lithuania","Luxembourg" ,"Madagascar","Malawi","Malaysia","Maldives","Mali","Malta","Marshall Islands","Mauritania","Mauritius","Mecklenburg Schwerin","Mecklenburg Strelitz","Mexico" ,"Micronesia","Moldova","Monaco","Mongolia","Montenegro","Morocco","Mozambique","Namibia","Nassau","Nauru","Nepal","Netherlands","New Zealand","Nicaragua","Niger" ,"Nigeria","North German Confederation","North German Union","North Macedonia","Norway","Oldenburg","Oman","Orange Free State","Pakistan","Palau","Panama","Papal States" ,"Papua New Guinea","Paraguay","Peru","Philippines","Piedmont Sardinia","Poland","Portugal","Qatar","Republic of Genoa","Republic of Korea","South Korea","Republic of the Congo" ,"Romania","Russia","Rwanda","Saint Kitts and Nevis","Saint Lucia","Saint Vincent and the Grenadines","Samoa","San Marino","Sao Tome and Principe","Saudi Arabia" ,"Schaumburg Lippe","Senegal","Serbia","Seychelles","Sierra Leone","Singapore","Slovakia","Slovenia","Solomon Islands","Somalia","South Africa","South Sudan","Spain" ,"Sri Lanka","Sudan","Suriname","Sweden","Switzerland","Syria","Tajikistan","Tanzania","Texas","Thailand","Timor Leste","Togo","Tonga","Trinidad and Tobago","Tunisia","Turkey" ,"Turkmenistan","Tuvalu","Two Sicilies","Uganda","Ukraine","Union of Soviet Socialist Republics","United Arab Emirates","United Kingdom","Uruguay","Uzbekistan","Vanuatu" ,"Venezuela","Vietnam","Wurttemberg","Yemen","Zambia","Zimbabwe" }; int main() { int country_cnt = sizeof(countrylist) / sizeof(countrylist[0]); int counts[country_cnt]; // 初始化计数数组全部为0 for (int i = 0; i < country_cnt; i++) { counts[i] = 0; } // 示例输入,和题目示例完全一致 char *input[] = {"USA","USA","UK","UK","Canada","Canada","south park"}; int input_cnt = sizeof(input) / sizeof(input[0]); // 遍历所有输入统计次数 for (int i = 0; i < input_cnt; i++) { // 查找当前输入匹配的国家下标 for (int j = 0; j < country_cnt; j++) { if (strcmp(input[i], countrylist[j]) == 0) { counts[j]++; break; // 匹配到直接退出循环,不需要继续查找 } } } // 筛选出现次数最高的3个国家 char *top3[3] = {NULL}; int top3_cnt[3] = {0}; for (int i = 0; i < country_cnt; i++) { if (counts[i] > top3_cnt[0]) { // 比第一名高,顺位替换 top3_cnt[2] = top3_cnt[1]; top3[2] = top3[1]; top3_cnt[1] = top3_cnt[0]; top3[1] = top3[0]; top3_cnt[0] = counts[i]; top3[0] = countrylist[i]; } else if (counts[i] > top3_cnt[1]) { // 比第二名高 top3_cnt[2] = top3_cnt[1]; top3[2] = top3[1]; top3_cnt[1] = counts[i]; top3[1] = countrylist[i]; } else if (counts[i] > top3_cnt[2]) { // 比第三名高 top3_cnt[2] = counts[i]; top3[2] = countrylist[i]; } } // 按要求输出结果 printf("Three of countries that have most number are %s,%s,%s\n", top3[0], top3[1], top3[2]); return 0; }
运行结果
直接编译运行上述代码,输出和题目要求完全一致:
Three of countries that have most number are USA,UK,Canada
内容的提问来源于stack exchange,提问作者Jack Savage
相关产品推荐
相关产品推荐

