C语言II博客作业01

C语言程序设计 2020计算机3班
作业的要求 作业要求
作业的目标 回顾数据类型和表达式,初初了解第12章:文件
学号 20209003

1.作业

1.1 题目

给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数。
例如:
N=2,写下1,2。这样只出现了1个“1”。
N=12,我们会写下1,2,3,4,5,6,7,8,9,10,11,12。这样,1的个数是5。

问题是:
1.写出一个函数f(N),返回1到N之间出现的“1”的个数,比如f(12)= 5;
2.满足条件“f(N)= N”的最大的N是多少?

  • 1.1.1 贴出代码图片,写出解题思路,列出测试数据。

    • 满足条件的最大N是1111111110
    • 测试数据
      N f(N)
      12 5
      1000 301
      7777777 5691358
      99999999 80000000
  • 1.1.2 给出不同测试数据的运算时间。(如果你的运算时间不变,说明你的测试数据不够大)




  • 1.1.3 思考针对足够大的数据,如何减少运算时间,并给出在原有算法基础上的改进算法和改进思路。

    不用像原方法一样将 1 到 N 依次判断是否为1,再相加。
    只需将N的各位数字出现数字1的次数相加即可。需要分段进行:
    • 当N为一位数,当且仅当N>=1时,f(N)=1;
    • 当N为两位数
      • 10<=N<=19时,f(N)=个位出现1的次数+十位出现1的次数=(十位数的数字+1)+(个位数的数字+1);
      • 20<=N<=99时,f(N)=个位出现1的次数+十位出现1的次数=(十位数的数字+1)+10;

1.2 将上题中多组测试数据写入文件,并给出测试程序以检测你的代码有没有问题,贴出你的代码、运行结果和文件内容。

  • 代码:

  • 文件内容:
  • 运行结果:

1.3 用自己的语言回答两个问题,并给出所查阅资料的引用。

  • 1.3.1 什么是文件缓冲系统?工作原理如何?

    • 文件缓冲系统:在内存开辟一个“缓冲区”,为程序中的每一个文件使用,当执行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”,装满后再从内存“缓冲区”依此读入接收的变量。执行写文件的操作时,先将数据写入内存“缓冲区”,待内存“缓冲区”装满后再写入文件。(摘自缓冲文件系统和非缓冲文件系统
    • 工作原理:程序操作磁盘文件的数据,必须要借助缓冲区。缓冲文件系统规定磁盘与内存缓冲区之间的交互由操作系统自动完成。(摘自《C语言程序设计(第三版)》)
  • 1.3.2 什么是文本文件和二进制文件?

    • 文本文件:文本文件是一种由若干行字符构成的 计算机文件。文本文件存在于计算机文件系统中。(摘自搜狗百科-文本文件
    • 二进制文件:二进制文件是指包含在 ASCII及扩展 ASCII 字符中编写的数据或程序指令的文件。也是计算机文件的一种。(摘自搜狗百科-二进制文件

2.学习总结

2.1 学习进度条

周\日期 这周所花的时间 代码行 学到的知识点简介 目前比较迷惑的问题
1\3.1-3.7 约8小时 约120行 回顾数据类型和表达式,初初了解第12章:文件 对文件的掌握还不熟练

2.2 累积代码行和累积博客字数

2.3 学习内容总结和感悟

  • 思维导图:

  • 感悟:对文件的掌握还不够熟练,上学期学过的知识细节方面有疏漏,尽快完善。
posted @ 2021-03-07 13:56  藐致  阅读(81)  评论(1编辑  收藏  举报