数字统计问题实验报告
1. 实验目的
1.掌握文件流的输入输出;
2.掌握简单算法的编写;
3.掌握问题分析的流程。
2. 实验题目
- 实现计算给定的书页总数目n(1≤n≤ ),计算书的全部页码中分别用到多少次数字0,1,2,……,9。
- 数据输入:输入数据由文件名为input.txt的文本文件提供,每个文件只有一行,给出表示书的总页码的整数n。
- 结果输出;将计算结果输出到文件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