WordPress博客右边设置,seo积分系统,装修网站有哪些,广东公司网站建设企业本题的基本要求非常简单#xff1a;给定N个实数#xff0c;计算它们的平均值。但复杂的是有些输入数据可能是非法的。一个“合法”的输入是[-1000#xff0c;1000]区间内的实数#xff0c;并且最多精确到小数点后2位。当你计算平均值的时候#xff0c;不能把那些非法的数据… 本题的基本要求非常简单给定N个实数计算它们的平均值。但复杂的是有些输入数据可能是非法的。一个“合法”的输入是[-10001000]区间内的实数并且最多精确到小数点后2位。当你计算平均值的时候不能把那些非法的数据算在内。输入格式输入第一行给出正整数N100。随后一行给出N个正整数数字间以一个空格分隔。输出格式对每个非法输入在一行中输出“ERROR: X is not a legal number”其中X是输入。最后在一行中输出结果“The average of K numbers is Y”其中K是合法输入的个数Y是它们的平均值精确到小数点后2位。如果平均值无法计算则用“Undefined”替换Y。如果K为1则输出“The average of 1 number is Y”。输入样例175 -3.2 aaa 9999 2.3.4 7.123 2.35输出样例1ERROR: aaa is not a legal numberERROR: 9999 is not a legal numberERROR: 2.3.4 is not a legal numberERROR: 7.123 is not a legal numberThe average of 3 numbers is 1.38输入样例22aaa -9999输出样例2ERROR: aaa is not a legal numberERROR: -9999 is not a legal numberThe average of 0 numbers is Undefined
本题比较简单但是有两个坑一个是输出-0.00这样的数字测试数据未检测这一点二是出现1 numbers这样的语法错误。
代码如下 #include stdio.h
#include stdlib.h
#include string.h//isNum判断一段字符是个数字
int isNum(const char* str)
{int result 0;int i 0;int dotCnt 0;double val 0.0;int acuCnt 0;for (i 0; i strlen(str); i) {result (str[i]A str[i]Z) || (str[i]a str[i]z);if (result) { //如果存在字母则不是数字return 0;}if (str[i]- i!0) { //如果非首位置出现‘-’则不是数字return 0;}if (str[i] .) { dotCnt;acuCnt strlen(str) - i - 1;}}if (dotCnt 1) { //如果‘.’出现两次以上则不是数字return 0;}if (atof(str)1000 || atof(str)-1000) { //如果大于设定范围则为非法数字return 0;}if (acuCnt 2) { //如果小数点后精确数字位数2则是非法数字return 0;}return 1;
}int main()
{char str[100] {\0};int N;int i;double sum 0.0;int vldNumCnt 0;double average 0.0;scanf(%d, N);for (i 0; i N; i) {scanf(%s, str);if (isNum(str)) {vldNumCnt;sum atof(str);} else {printf(ERROR: %s is not a legal number\n, str);}}if (vldNumCnt 0) {printf(The average of 0 numbers is Undefined\n);} else {average sum / vldNumCnt;if (-0.005average average0) { //防止输出-0.00printf(The average of %d %s is 0.00\n, vldNumCnt, vldNumCnt1 ? number:numbers); //防止输出1numbers} else {printf(The average of %d %s is %.2lf\n, vldNumCnt, vldNumCnt1 ? number:numbers, average);}}return 0;
}