111期_C++_2024年1月寒假作业博客_day07

1 rewind函数的功能

        1.1 rewind的功 能: 将文件内部的位置指针重新指向一个流(数据流/文件)的开头。

        1.2 文件内部的位置指针会随着对文件的读写文件的位置指针(指向当前读写字节)向后移动。

        1.3 而文件指针是指向整个文件,如果不重新赋值文件指针不会改变 

2 fopen的第一个参数的说明

        2.1 fopen的第一个参数是字符串,字符串中应该放入要打开文件的绝对地址

        2.2 字符串赋给其它的字符串的时候将会自动无视  \  这个符号,其自动视为和其它字符配合

              配合之后形成转义字符 

              比如绝对路径是:c:\user\text.txt,则给到fopen的一个参数的实参是"c:\\user\\text.txt"

3 fopen在第二次打开之后重新写入字符串时会将之前的内容清除

4 函数 fseek 把文件位置重定位到文件中的指定位置

5 fputc的使用说明

        5.1 若调用 fputc 函数输出字符成功,则其返回值是输出的字符

        5.2 若调用 fputc 函数输出字符失败,则其返回值是EOF

6 设计一个算法,算出 n 阶乘有多少个尾随零,

   比如5的阶乘是120,则5的阶乘有1个尾随零,

          40的阶乘是815915283247897734345611269596115894272000000000

          则40的阶乘有9个尾随零

   解题思路:

          思路一:直接求出来所给数的阶乘,通过循环得到这个阶乘结果的尾随零的个数

                         在C语言中,无法保证所有数的解成都可以用一个变量接收,

                         所以给的数稍微大一点,比如到30,就无法求解

          思路二,求出来所给数的阶乘,只要知道这个数的末尾是0,就将计数加一

                        且将这个数除以十以后的结果赋给原变量

                        所以给的数到40,就无法求解

          思路三,首先根据几个事实得到此思路

                        fact 1: 尾随零的个数只会随所给数的增加而单调递增

                        fact 2: 只有在所给的数是5的倍数的时候,尾随零的个数才会发生变化

                        fact 3: 如果将所给数分解成多个质数相乘,质数中5的个数就是fact 2中变化的个数

                  下面的代码能够保证当n为有限的数时,只要给出一个取值范围比n大的变量i即可

                  但是这个代码的缺点是:1. n很大时无法求解(n已经是取值范围最大的变量)

                                                          2. 时间复杂度过高

int find_five(unsigned long long int i)
{
	int incre = 0;
	while (i % 5 == 0)
	{
		incre++;
		i /= 5;
	}
	return incre;
}

int trailingZeroes(int n)
{
	int count = 0;
	unsigned long long int i = 5;
	while (i <= n)
	{
		int incre = find_five(i);
		count += incre;
		i += 5;
	}
	return count;
}

         思路四,直接利用fact3,查看n分解成质数的乘积后有几个5,每次除以5以后决定增量

7 题目描述:写出一个程序,接受一个正浮点数值,输出该数值的近似整数值。
   如果小数点后数值大于等于 0.5 ,向上取整;小于 0.5 ,则向下取整

        7.1 float型变量中存储的二进制数赋值给同样是4字节(X86)的int型变量,应该使用指针变量

float num = 4.1f;
int* ptmp_num = (int*)pnum;
int tmp_num = *ptmp_num;

         7.2 对于一个X86中的浮点数,其在内存中第32位是符号位,第24到31位是小数点平移位

               第1到23位是小数点后显示位

         7.3 想要对一个正的浮点数进行四舍五入,需要对整数部分和小数部分分别进行分析

               case1: 当小数点平移位小于01111110,则这个浮点数是大于等于0,小于0.5的数

               case2: 当小数点平移位是:01111110,则这个浮点数是大于等于0.5,小于1的数

               case3: 当小数点平移位是:01111111,则这个浮点数是大于等于1,小于2的数

                          整数部分就是1,对于小数部分,分为以下两种情况

                   case3.1 小数点后显示位小于10000000000000000000000,浮点数小于1.5

                   case3.2 小数点后显示位大于等于10000000000000000000000,浮点数大于等于1.5

                case4: 当小数点平移位大于01111111,则这个浮点数是大于等于2的数

                    可以考虑右边这个24位数:1xxxxxxxxxxxxxxxxxxxxxxx,小数点后显示位

                    利用循环将这个24位数不断右移编程一个奇数(末尾为0),

                    记这个二进制数为X,假设X的最高非零位是二进制数中的第digit位

                    X的前E' 位是这个浮点数的整数部分对应的二进制数,记为bi_integer,

                    X的后digit - E' 位是这个浮点数的的小数部分对应的二进制数,记为bi_fraction

                    记 bi_integer对应的十进制数是integer,X的第digit - E'位是key,

                        注:(从低到高数,最低位是第一位)

                    case4.1 key是0,浮点数大于等于integer,小于integer + 0.5

                    case4.2 key是1,浮点数是大于等于integer + 0.5,小于integer + 1

                           

                          


        

               

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值