沧海一粟

驶向大海,乘风破浪

 

从一个ACM设计题出发

题目:

需要有以下输入:

3

2 34 45

4 1 2 4 5

1 34

要求输出结果:

79

12

34

第一个输入表示需要计算的数据组数量m,以后m行数据,每行第一个数据表示该行数据共n(每行都是独立的)个,接下来输入n个数字。输出结果共m个,占m行。

 

分析:1.需要连续输入,并取出数字(包括多位数,用number[]保存每一位数字),将提取出来的每一个数保存起来,numbers[]数组。

           2.分析数据,提取出m,和每一个n,分别计算每一组数据,将结果保存一起,results[]数组。

           3.输出

 

下面给出相关宏的定义和子函数的声明:

 1#define NUM_LENGTH 6
 2#define NUMS_LENGTH 50
 3#define RESULTS_LENGTH 10
 4#define ISEXIT_LOOP(c)  if ('X'==c||'x'==c)break;
 5
 6bool IsInt(char);    //判断是否为数字
 7int SubSum(int numbers[],int start,int end);        //求数组部分和
 8int GetNumber(int number[],int length);    //求出一个完整的数字
 9int power(int,int);    //求一个数的幂
10
11

 

      下面是主函数的实现,主要是利用死循环获取键盘输入字符,逐个分析成完整的数字存入数组

 1int _tmain(int argc, _TCHAR* argv[])
 2{
 3
 4    char c;
 5
 6    int number[NUM_LENGTH]={0};    //存放提取出来的数
 7    bool pre_is_int=false;    
 8    bool cur_is_int = false;
 9
10    int numbers[NUMS_LENGTH]={0};    //存放提取出来的所有数据
11    int results[RESULTS_LENGTH]={0};    //存放结果
12
13    int length = 0;    //结果长度
14    int i = 0;    //numbers数组下标
15    int j = 0;    //number数组下标
16    
17    while (true)
18    {
19        c = getchar();
20        ISEXIT_LOOP(c);  //循环结束条件
21
22        cur_is_int = IsInt(c);
23        if (true==pre_is_int&&false==cur_is_int)//表示获取到了一个完整的数字
24        {
25            nums[i++= getnum(num,j);
26            for (int index=0;index<j;index++)number[index]=0;    //number数组清零
27            j=0;  //number数组当前下标设置为0,提取下一个数字
28        }

29
30        if (cur_is_int)   //当前数字为数字
31        {
32              num[j++]=c-'0';
33        }

34        pre_is_int = cur_is_int;    //传递
35    }

36
37
38
39    length = numbers[0];//取出数据的计算组数
40
41    int curindex = 1;  //从第二个数字开始分析
42
43
44
45     //计算每一组数
46    for(int j = 0; j<length ; j++)
47    {
48
49        //curindex表示当前这一组数的第一个数的下标,这个表示该组数据的长度
50
51       //所以该组数下标从curindex+1开始,在curindex+numbers[curindex]结束
52
53       //SubSum函数,求数组部分和
54        results[j]=SubSum(nums,curindex+1,curindex+numbers[curindex]);
55
56
57
58        //改变curindex,使它为下一组数据的第一个数字的下标
59        curindex = curindex+nums[curindex]+1;
60    }

61
62
63
64    //输出结果
65
66    for (int index= 0; index<length ; index++)
67    {
68        printf("%d\n",results[index]);
69    }

70
71
72     return 0;
73}

74
75
 
       

          输入的结束条件是接收到输入字符‘x’或者‘X’。

 

          题目是做完了,但是引发了我对getchar()函数理解的兴趣,包括其基本原理和底层的实现。下一篇文章将介绍我对getchar()的探索历程。




posted on 2011-10-24 11:19 孺子牛 阅读(59) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

常用链接

留言簿(1)

随笔分类

文章档案(4)

最新随笔

搜索

积分与排名

最新随笔

最新评论