数字统计实验报告

数字统计问题实验报告

1.     实验目的

1.掌握文件流的输入输出;

2.掌握简单算法的编写;

3.掌握问题分析的流程。

2.     实验题目

  1. 实现计算给定的书页总数目n(1≤n≤ ),计算书的全部页码中分别用到多少次数字0,1,2,……,9。
  2. 数据输入:输入数据由文件名为input.txt的文本文件提供,每个文件只有一行,给出表示书的总页码的整数n。
  3. 结果输出;将计算结果输出到文件output.txt。输出文件共有10行,在第k行输出页码中用到数字k-1的次数,k=1,2,……,10。

3.     关键代码分析

        采用无优化的暴力破解法,即给定n后,对n的每一位数字进行扫描记录后,完成算法。

       其核心代码如下:

    for (i = 0; i <= page; i ++)

    {

      

       temp = i;

       while (temp)//当temp为0时跳出循环

       {

           flag ++;

           arr[temp % 10] ++;//计算个位数的数字数量

           temp = temp / 10;//消去个位数

       }

    }

              原理是每次只计算最低位的数字,即个位数,使用的算法是对当前的数字对10除余,每次都余个位数。

        接下来对当前的数除10,因为c语言向下取整的策略,123/10的结果是12,刚好消去了最低位。

            只要不断重复以上两个过程,扫描全部书页即可得到最终结果。

4.     算法描述(用流程图表示)

5.     程序

// DigitalStatistics.cpp: 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include "conio.h"

#include "stdlib.h"

#include "string.h"

#include "time.h"

int main()

{

       FILE *fp1, *fp2;

       int flag = 0, i, page, temp, arr[10] = {0};

       clock_t start, finish;

       double TotalTime;

       fopen_s(&fp1, "E:\\研一\\算法设计与分析\\二.数字统计\\input.txt", "r");

       fopen_s(&fp2, "E:\\研一\\算法设计与分析\\二.数字统计\\output.txt", "w");

       if (fp1 != NULL)

       {

              fscanf_s(fp1, "%d", &page);

       }

       else

       {

              printf("Fail to open the file_input.txt!");

              _getch();

              exit(1);   

       }

       if (fp2 == NULL)

       {

              printf("Fail to creat the file_output.txt!");

              _getch();

              exit(1);

       }

       start = clock();

       for (i = 0; i <= page; i ++)

       {

             

              temp = i;

              while (temp)//当temp为0时跳出循环

              {

                     flag ++;

                     arr[temp % 10] ++;//计算个位数的数字数量

                     temp = temp / 10;//消去个位数

              }

       }

       finish = clock();

       TotalTime = (double)(finish - start) / CLOCKS_PER_SEC;

       printf("The algorithm need about %f seconds to run\n", TotalTime);

       printf("The algorithm need about %d cycle to run", flag);

       for (i = 0; i < 10; i++)

       {

              fprintf_s(fp2, "%d\n", arr[i]);

       }

       fclose(fp1);

       fclose(fp2);

    return 0;

}

6.     测试与分析

 

因为本算法采用了无优化的暴力破解法,因而是一个满循环的算法。

7.     实验总结及体会

传统的c如下:

FILE *fp;

if((fp = fopen("E:\\input.txt", "r")) == NULL)

{

  printf("Error!");

}

VS平台上的fopen会报错,故而要使用fopen_s;

FILE *fp;

fopen_s(&fp, "E:\\input.txt", "r");

if(fp == NULL)

{

  printf("Error!");

}

同理VS不支持fscanf需要将其转化为fscanf_s:

int page;

if(fp != NULL)

{

  fscanf_s(fp, "%d", &page);

]

类同的,getch这个用于接受一个不显示的任意按键中断类函数也必须转换为_getch()才会被vs平台认为合法

参考书目

[1] 王晓东编著.计算机算法设计与分析(第4版)[M].电子工业出版社,2012.2

     

猜你喜欢

转载自www.cnblogs.com/NWNU-LHY/p/9706138.html