C语言的一道数组题Plus
其实数组那部分当时学的东西挺简单的.
常见的题就是用一个数组装几个数字.
然后排序,找出大于n的数字有几个,有几个重复数字之类的.
去年想出来一个题.
因为以前写的代码太复杂,又有很多不足和bug.所以今天重新写了下.
小明想要记录多个数字(即装到数字中),最多有50个数字,(都是十进制数)
但他不知道输入多少个好,请你设计一段代码来满足他的需求.(数字范围在int内)
并输出这些数字.
不考虑输入文章未出现的情况.(例如输入一个封号 ';' )
********************************************************************************
q:我们在int n[50]后如何记录数字?
因为常用的记录数字往往是将数组全部装完
或者是先输入一个数字来决定数组长度
若果只是用循环来记录数字就会陷入死循环(没有那么多的数字)
think:用一个特殊的数字来结束 例如输入0来结束 if(n[i]==0)break;←这样
但如果输入的数字里刚好有这个数字就会出现问题.
/***************************************************** * * 思想:将每个数字改成获得单个字符再转换(1) * 获得空格或回车就将以获得的数字装进数组(2) * *装满或获得两次回车就结束(3) * * 1.num用来装已获得的数字 * 2.js对数字计数 * flag表示能否计数 * 3.flagn表示是否获得了一个回车 ******************************************************/ #include<stdio.h> #include<stdlib.h> #define n 50 int main(int argc,char** argv){ int math[n],num,js = 0,flag = 0,flagn = 0; char ex; while(1){ if(scanf("%[0-9]",&ex)){ flag = 1; //可以计数 flag flagn = 0; //不结束循环 num=num*10+ex-48; //利用asc ii码来计算num } else if(scanf("%[ ]",&ex)){ //选择空格字符 if(flag){ math[js++]=num; //录入数字 数字数量+1 if(js == 51)break; //达到上限 } num = flagn = 0; //num归零 不结束循环 flag = 0; //不可计数 flag } else if(scanf("%c",&ex) && ex == '\n'){ //选择回车符 if(flag)math[js++]=num; //计数 数字+1 num = flag = 0; //num归零 不可计数 flag if(flagn)break; //将会*以双回车结束 flagn = 1; } if(js==n)break; //达到上限 } //循环结束了 if(!js){ //*无数字处理 printf("null.\nend.\nthere are %d numbers.\n",js); system("pause"); return 0; } num=0; printf("have %d number.\n",js); while(js--){ printf("%-5d",math[num++]); if(!(num%10))printf("\n"); } system("pause"); return 0; }
way2:将数字以十六进制来读取将十六进制转换为十进制 添加要求:以十六进制数a作为结束语句(其实只要是大于十的进制都可以)
代码如下:这个代码有误 最近会尽快更正!
#include<stdio.h> #include<stdlib.h> #define n 50 int main(int argc,char** argv){ int math[n],num,shu=0,changdu=1,n=0; while(1){ scanf("%x",&num); if(num<10){ math[n++]=num; //个位数直接赋值 if(n==n)break; //达到上限 continue; } else if(num==10)break; //输入十六进制数a 结束输入数字 shu=num; while(shu){ changdu*=16; //将该十进制的十六进制最高位所代表的数计算出来即changdu shu/=16; } //shu==0 changdu/=16; while(changdu){ shu=shu*10+num/changdu; changdu/=16; num/=16; } math[n++]=shu; if(n==n)break; //达到上限 } printf("there are %d numbers.\n",n); shu=num=0; while(n--){ printf("%-5d",math[shu++]); if(!(shu%10))printf("\n"); } system("pause"); return 0; }
通过比较, 第二种似乎更好.
但我觉得第一种比较好,它没有要求以十六进制数a作为结束语句
更加方便,更能使客户(小明)满意.
想了个plus plus的题:
在这个基础上要求输入的可能使算式,要求将数字计算出再存储到数组中(算式中可能会出现加减乘除符号,符号最多出现两个,每个参与计算的数不超过两位数)
(好吧...... 后面补充的是为了方便我写代码 嘻嘻)
上一篇: 努比亚红魔3S发布:骁龙855 Plus+5000mAh 2999元
下一篇: 短而精悍的几则冷幽默