C语言II博客作业01

一、作业头

这个作业属于哪个课程 C语言程序设计II
这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2020-4/homework/11772
我在这个课程的目标是 复习C语言以前学过的知识
学号 20209078

二、作业

2.1 题目:给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数。
1.写出一个函数f(N),返回1到N之间出现的”1“的个数,比如f(12)=5;
思路:单纯的取余来逐个数“1”出现的次数(个数)。
代码实现:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
    int a, b = 0, c, e = 0, i = 0;
    clock_t start, finish;
    double Total_time;
    start = clock();

    scanf("%d", &a);
    for (c = a; c >= 0; c--) {
	e = c;
	while (e != 0)
	{
	    if (e % 10 == 1) {
		b++;
	    }
	    e = e / 10;
	}
    }
    printf("%d\n", b);

    finish = clock();
    Total_time = (double)(finish - start) / CLOCKS_PER_SEC;
    printf("%f seconds\n", Total_time);
}
输入数据 输出数据
1 1
12 5
1000 301
100000 50001

2.满足条件”f(N)=N“的最大的N是多少?
思路:在上一题的基础上加个F(N)=N的判断,然后设置循环和覆盖就能取到最大值。
代码实现:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
    long long int a, b = 0, c, e = 0, i = 0,f = 0;
    clock_t start, finish;
    double Total_time;
    start = clock();
    for (a = 1; a <= 1111111119; a++) {
        for (c = a; c >= 0; c--) {
            e = c;
	    while (e != 0)
	    {
	        if (e % 10 == 1) {
		    b++;
		}
		e = e / 10;
	    }
	 }
	 if (a == b) {
	    f = a;
	    b = 0;
	 }
	 else {
	    b = 0;
	 }
}
    printf("%lld\n", f);

    finish = clock();
    Total_time = (double)(finish - start) / CLOCKS_PER_SEC;
    printf("%f seconds\n", Total_time);
}
输入数据 输出数据
1111111110

说明:这波是不会算法人的绝望啊,我也不清楚这个值是不是最大值。值越大越离谱,之前还能几千一组慢慢排除。[菜比落泪.jpg]

3.改进思路:想不到,只晓得把计时往后放点时间就短了。方法就是用人脑排除一些数据em...还可以减少循环个数。
效果:

改进思路2.0:利用分析,总结规律。参考博客[https://blog.csdn.net/sjf0115/article/details/8600599#]
效果:

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

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
    FILE* fp;
    int a, b = 0, c, e = 0, i = 0;
    clock_t start, finish;
    double Total_time;
    if ((fp = fopen("C:\\Users\\周宽\\Desktop\\新建文本文档.txt", "r")) == NULL)
    {
          exit(0);
    }

    start = clock();
    while (fscanf(fp, "%d", &a) != EOF) {
	for (c = a; c >= 0; c--) {
		e = c;
		while (e != 0)
		{
			if (e % 10 == 1) {
				b++;
			}
			e = e / 10;
		}
	}
	printf("%d\n", b);
	b = 0;
    }
    if (fclose(fp))
    {
    	exit(0);
    }

    finish = clock();
    Total_time = (double)(finish - start) / CLOCKS_PER_SEC;
    printf("%f seconds\n", Total_time);
}

2.3用自己的语言回答两个问题,并给出所查阅资料的引用(10分)

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

文件缓冲系统:文件缓冲系统是为了提高数据存取访问的效率,系统分配一块文件缓存区,程序与磁盘通过文件缓存区来存取,当使用时会开辟一个512B的扇形区域,使用完后该内存空间就会被释放。
工作原理:缓冲文件系统会自动在内存中为被操作的文件开辟一块连续的内存单元作为文件缓冲区。当要存取时,先把数据写入缓冲区,当写满512B时自动清空缓冲区,再写入新数据,存取数据通过缓冲区进行写读。

2.什么是文本文件和二进制文件?

ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。
二进制文件是按二进制的编码方式来存放文件的。 例如, 数5678的存储形式为: 00010110 00101110只占二个字节。二进制文件虽然也可在屏幕上显示, 但其内容无法读懂。C系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。 输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。 因此也把这种文件称作“流式文件”。

2.4 请给出本周学习总结(15分)

1. 学习进度条(5分)

周/日期 这周所花的时间 代码行 学到的知识点简介 目前比较迷惑的问题
3/1-3/3 2h 108 一堆,甚至于叫不上名字

2. 累积代码行和博客字数

时间 博客字数 代码行数
第一周 2550(667) 108

3. 学习内容总结和感悟

学习内容总结:

  • 本周刚开学,啥也没学。为了字多,就厚脸皮说自己学了点C语言吧。五十多天没碰了基本可以重开了。

感悟:

  • 忘了好多东西,希望能赶上来吧。发呆ing
posted @ 2021-03-04 00:50  岚影  阅读(164)  评论(0编辑  收藏  举报