(BIT小学期编程题解)9~12经验总结_数据库程序设计题解

学校工作总结 时间:2020-02-28 05:15:29 收藏本文下载本文
【www.daodoc.com - 学校工作总结】

(BIT小学期编程题解)9~12经验总结由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“数据库程序设计题解”。

【经验总结】9~12题小总结

在各位大神的提醒和帮助下终于做完了,下面小小的总结一下。第9题《千字文》 大体思路:

主要就是数据的读入和输出,进行UTF-8和unicodo以及十进制之间的转换,转换完成进行计数然后输出。其实题目的主体并不难,难的是数据的读入和输出。但是需要判断一下这个字符是用几个字节表示的,如果读入的值在0~127之间说明是用一个字节表示的,如果在192~223之间就表示是用两个字节表示的,根据题意,其他的情况就是用三个字节表示的。具体实现:

输入用getchar()读入,然后结束的标记就用!=255,因为getchar()是一个字节一个字节读的,而UTF-8刚好又是以字节的形式存储的,所以正好搭配。

至于运用位运算还不是很熟练,所以就先不说位运算那种方法了,说一下一个暴力计算Unicode的方法:对于一个字节表示的字符其UTF-8的表示方式是0×××××××;对于两个字节表示的字符其表示方式是110×××××

10××××××;对于三个字节表示的字符其表示方式就是1110××××

10××××××

10××××××;依次类推。然后Unicode就是将上面的×号所在的位上的0或1字串链接起来所得到的一个大的二进制串的值。下面就是计算了,可以这样运用纯数学的方式计算。比如说对于二进制的符号来说假设第一个字节表示的数是a,第二个字节表示的数是b,那么将后面的×号所在位上的数字链接起来所得到的二进制字符串的十进制表示就是(a-2^7-2^6)*2^6+(b-2^7)这个主要就是运用了二进制与十进制的转化。计算出字符相应的Unicode值之后就把其作为计数数组的下标,然后进行计数,这样也省去了最后字符要按Unicode的大小进行输出时的排序那一步。三个字节的计算方法和两个字节的计算方法一样就不再说了。然后就是输出汉字,输出的时候需要判断一下Unicode的值以确定该字符是用三个字节表示的还是用两个字节表示的,两个字节可以表示的范围是128~2047,输出的时候可以采用这样的输出方式(“%c%c”,a,b)a,b,就是前面我们读入时的a,b的值。这里那,对于啊a,b可以有两种方式来计算,第一种就是在最开始计算的时候就把每一个字符所用的字节表示的数给记录下来;第二种就是再将Unicode的十进制形式转换为UTF-8以字节表示的形式,具体转换时这样的,假设Unicode的值是t(对于两个字节表示的字符来说),那么b=t%2^6+2^8,a=t/2^6+2^6+2^7,这样也可以计算出来啊a,b的值。这样一个汉字就输出来了,剩下的就是输出其十六进制表示就用printf(“0x%04x”,unicode);然后再输出大于1的字符的个数就好。

第10题找9.整体思路:

整体思路就是以高精度算法为工具,以黄轩成大神的结论:(0,a)中 含9的数字的个数是(a[0]*10^4 + a[1]*10^3 + a[2]*10^2 + a[3]*10 + a[4])减去(a[0]*9^4 + a[1]*9^3 + a[2]*9^2 + 0 + 0)为导向进行计算。分别计算出小于a和小于b的数中含9的数的多少,然后相减就可以了。具体方法:

首先是数据读入,可以用getchar()读入然后一位一位的处理,也可以用%s读入然后再一位一位的处理。中间的一位一位的处理过程主要就运用到了秦九韶算法,(a[0]*10^4 + a[1]*10^3 + a[2]*10^2 + a[3]*10 + a[4])=((((a[0]*10+a[1])*10+a[2])*10+a[3])*10+a[4])也就是每读一位就 *10+x(a[0]*9^4 + a[1]*9^3 + a[2]*9^2 + 0 + 0)=((((a[0]*9+a[1])*9+a[2])*9+0)*9+0);对于上面的第一步,其实本质含义就是把字符串转化为整形的数,对于第二个计算式就是用一个数组来计数,每读一位就进行一次数组乘9然后加上这一位的数值。注意中间需要判断一下,如果读入的数里面有9那么以后就只用乘9不用再加每一位上的数字了,这个标记一下就好。这样就可以把小于a,小于b的数中含9 的数找到相减就可以了,注意一下如果b中含有9那么最后的结果要+1.然后就是编写高精度加法,减法,高精度乘低精度乘法的函数了,跟前不久写的高精度很类似,只是把进位改一下,程序微调一下就好了。编写的时候注意因为最后的结果很大,所以要进行数位压缩,如果采用100000000进制压缩的话,最后存结果的数组只用开到1250就够了(当然实际开的时候要大一些,不然会RE的)

还有需要注意的就是:

(1)存a,b的数组要大一些10005左右,存结果的数组1260左右。

(2)输出的时候如果结果不是存结果数组的第一个元素,那么其他的元素在输出的时候需要补0用%08d输出就好。(3)编写函数的时候注意进位。第11题,识别条形码

整体思路:

整体思路就是对给出的数据进行排序,根据最值得情况来判断改组数据是不是合法,是不是只有宽条,处理好多%5少%5就好了。具体实现:

讨论区里面大神们已经用各种不同的方法得到了结果,我这里就不说了就给出几个判定的等式

宽Max/窄min=1.9/1.05 因为一共只有20个数所以可以有比较多的方法。第12题 整体思路: 整体思路就是遍搜,找出可以收集到的珠子的最大个数,从开始找断点然后分别向两边进行搜索。珠子的情况大致可以分为三种,一种是全部为W,一种是全部为B或是R,还有一种就是这三种颜色的珠子混合存在。具体方法:

具体方法其实就是怎么实现珠子连在一起的问题,如果直接做的话可以这样:(1)在循环的时候,循环变量一旦减到负数就加上n,一旦加到n就减去n。(2)也可以把原来的字符串复制一次或是两次到一个叔组里面,然后就不用考虑最后的链接问题了,每一次只要在i~i+n之间循环就可以了。

具体循环的时候就是左边找一遍然后右边找一遍,然后把左右两边的珠子数加在一起,但是存在全部是R或是全部是B或是全为W和R混或是全为W和B混合,所以在从一边向另一边记录的时候最好设置一个变量,意思就是左边已经搜索过的,右边就不用再搜索了,这样就可以防止最后的结果大于n。然后每次搜索过后的结果都和Max比较,让Max取最大值就好了,最后输出Max即可。

希望对还没有过的有帮助,如果有什么错误,希望提出来,谢谢!

下载(BIT小学期编程题解)9~12经验总结word格式文档
下载(BIT小学期编程题解)9~12经验总结.doc
将本文档下载到自己电脑,方便修改和收藏。
点此处下载文档

文档为doc格式

    热门文章
      整站推荐
        点击下载本文