【算法比赛】统计从N到M中出现多少个1(N、M为正整数且N

王集鹄 2008-03-25 04:03:20
[Quote=需求说明:]
整数1中出现1个1
整数101中出现2个1
整数123中出现1个1
整数232中出现0个1

从1到10中(1、2、3、4、5、6、7、8、9、10)出现2个1
从105到111中(105、106、107、108、109、110、111)出现10个1
设计一个算法,统计正整数从N到M中出现了多少个1
[/Quote]

[Quote=输入范例:]
N=2,M=200
[/Quote]

[Quote=输出范例:]
Count=139
[/Quote]

为了方便调试和对比,统一测试数据和代码框架:
/// <summary>
/// 在N到M中出现多少个1
/// </summary>
/// <param name="N">最小数</param>
/// <param name="M">最大数</param>
/// <returns>返回出现了多少个1</returns>
private long Calc(uint N, uint M)
{
/* TODO : 请在这里发挥 */
return 0;
}

private void button1_Click(object sender, EventArgs e1) // 在控制台自己动手改这里
{
// 不要改变如下代码
uint N, M;
long vTickCount = Environment.TickCount;
N = 2008;
M = 20080808;
Console.WriteLine("从{0}到{1}中出现{2}个1", N, M, Calc(N, M));
N = uint.MaxValue / 2;
M = uint.MaxValue;
Console.WriteLine("从{0}到{1}中出现{2}个1", N, M, Calc(N, M));
N = uint.MinValue;
Console.WriteLine("从{0}到{1}中出现{2}个1", N, M, Calc(N, M));
Console.WriteLine("计算耗时{0}毫秒!", Environment.TickCount - vTickCount);
}


奖励:
第一名100分
第二名50分
其他酌情散掉。

ps:帖代码之前先自己跑一遍,运行在5分钟以上的就别帖了,测试起来费劲。。
...全文
1360 124 打赏 收藏 转发到动态 举报
写回复
用AI写文章
124 条回复
切换为时间正序
请发表友善的回复…
发表回复
benbenkui 2008-09-14
  • 打赏
  • 举报
回复
[Quote=引用 122 楼 oobibigo 的回复:]
难道是我计算错误?

上面看到NNN多的牛人推算出什么公式。。。 但好像连1+1的问题都没解决吧。

0~9 出现1的次数是: 1次。
0~99 出现1的次数是: 19次。(1,10~19,21,31,41,51,61,71,81,91 ) 一帮SB东西。 明明只有19个,却人云亦云的说是20次。还谈什么够比算法。
[/Quote]
你确实是个SB,0-99是19个1吗?
feifun 2008-08-29
  • 打赏
  • 举报
回复
对不起了各位,我在论坛里看到的是另一个很相似的题目,我已经算完了。
“求 1-2008080808 有多少个整数含有数字1”//好像是金山公司的题目
【算法比赛】统计从N到M中出现多少个1(N、M为正整数且N<M)。看谁的算法最快。
题目有差异,我粗心了,多包涵。
feifun 2008-08-29
  • 打赏
  • 举报
回复
难道是我计算错误?

上面看到NNN多的牛人推算出什么公式。。。 但好像连1+1的问题都没解决吧。

0~9 出现1的次数是: 1次。
0~99 出现1的次数是: 19次。(1,10~19,21,31,41,51,61,71,81,91 ) 一帮SB东西。 明明只有19个,却人云亦云的说是20次。还谈什么够比算法。
gzw_08 2008-08-24
  • 打赏
  • 举报
回复
找出m与n之间的所有数中,各个数字0到9出现的次数。比如:m=99,n=101那样的话,之间的数就只有100。0出现的次数就是2,1出现的次数就是1,其它的数字的次数都是0。不过那个m与n的范围都是很大的,0到10的20次方。编程实现。



解答:
由于__int64表示范围只能表示<10^18,就算用unsigned __int64,也顶多是10^19,所以用__int64罢了。

# include <iostream>
using namespace std;
//数据范围n,m<2^63
const int N=20;
__int64 pre[N],post[N],b[N],base[N],ot[N][10],sum,len;
void count_number(__int64 s[], __int64 n){
__int64 cn,k;
int i,j;
memset(ot,0,sizeof(ot));
memset(pre,0,sizeof(pre));
memset(post,0,sizeof(post));
memset(base,0,sizeof(base));
memset(b,0,sizeof(b));
cn=n;
len=0;
while(cn){
++len;
cn/=10;
}
k=1;
base[len]=1;
post[len]=0;
for(i=len-1;i>=0;i--){
base[i]=base[i+1]*10;
}
for(i=len-1;i>0;i--){
pre[i+1]=n/base[i];
post[i]=n%base[i];
}
for(i=len;i>0;i--){
b[i]=n%base[i-1]/base[i];
}

if(len>1) ot[1][b[1]]=post[1]+1;
else {
ot[1][0]=ot[1][b[1]]=1;
if(!n) {
ot[1][1]=0;
len++;
}
}

for(i=1;i<b[1];i++){
ot[1][i]=base[1];
}
for(i=2;i<=len;i++){
{
if(!b[i]) {
ot[i][0]=(pre[i]-1)*base[i]+post[i]+1;
}
else ot[i][0]=pre[i]*base[i];
if(i==len) ot[i][0]++;
for(j=1;j<=9;j++){
if(j==b[i]) ot[i][j]=pre[i]*base[i]+post[i]+1;
else if(j<b[i]) ot[i][j]=(pre[i]+1)*base[i];
else ot[i][j]=pre[i]*base[i];
}
}
}
for(i=0;i<=9;i++){
sum=0;
for(j=1;j<=len;j++){
sum+=ot[j][i];
}
s[i]=sum;
}
}
int main(){
int i,j;
__int64 m,n,n_count[N],m_count[N];
//n>m
while(scanf("%I64d %I64d",&m,&n)!=EOF){
n--;
count_number(m_count,m);
count_number(n_count,n);
for(i=0;i<=9;i++){
sum=0;
for(j=1;j<=len;j++){
sum+=ot[j][i];
}
printf("%d:%I64d\n",i,n_count[i]-m_count[i]);
}
}
return 1;
}

jikun6666 2008-04-03
  • 打赏
  • 举报
回复
看了这么多还是利用统计的较好
ldhooi001 2008-04-02
  • 打赏
  • 举报
回复
强人啊,都是强人啊
lovingkiss 2008-04-02
  • 打赏
  • 举报
回复
如楼上的兄弟所说,不过似乎说的有些不对的
1位数 1个
2位数 10+1*10-1=19个 这里需要去掉重复的11的10-19 01。。11。21。。91
。。。。。
就是中学的知识——但是如果要用循环的话,就无法这么跑了的。。。

如果用数学知识,不难,用其他的方式方法,就比较麻烦了。。。
lovingkiss 2008-04-02
  • 打赏
  • 举报
回复
20080808
只是想法阿,假设只是一个8个球,每一位都有可能是1,有多少种取法??
按照取球的概率算出来就是了。。。
也就是说
第一位,是2选1(不能大于2)
其他位数就是10选1。。。只要保证取出来的数不重复就够了

——下班了,思路有了,呵呵,这个应该是中学的课题了吧。。。。


││博客空间:http://blog.csdn.net/lovingkiss
││资源下载:http://download.csdn.net/user/lovingkiss
││Email:loving-kiss@163.com [MSN也是这个]
││联系方式:Q66840199 项目、聊天、咨询、探讨、统统收费,呵呵......
╚---------------------------------------------------------------------------------------------------------ō*︻$▅▆▇◤
keyake863 2008-04-02
  • 打赏
  • 举报
回复

private long Calc(uint N, uint M)
{
int count=0;
for (int i = N; i <= M; i++)
{
if (i.ToString().Contains("1"))
count++;
}
return count;
//return 0;
}





ldw701 2008-04-02
  • 打赏
  • 举报
回复
仰望强人
kingstou 2008-04-01
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 zswang 的回复:]
引用 22 楼 harryheart 的回复:
呃...汗下自己先
不过用统计学规律应该能得到一个比较优秀的算法
1-9 1个
1-99 10+1*10=20个
1-999 100+20*10=300个
...
比如87266
里面有(10000+8*4000)+(1000+7*300)+(100+2*20)+(10+6*1)+(1+6*0)

很好就是这个思路,跑循环要累死机器的,呵呵。看看谁能写出最快的算法。
[/Quote]

規則是這樣的
0~9------------------1個1
10-19----------------11個1
20-29----------------1個1
30-39----------------1個1
~~~~~~
90-99----------------1個1
合計:1+1*10

100-199----------------100個1+之前的20個1
200-299----------------20個1(之前的個位到十位所有1的合計)
300-399----------------20個1
~~~~~
900-999----------------20個1
合計:100+20*10

1000-1999--------------1000個1+之前的300個1
2000-2999--------------300個1(之前的個位到百位所有1的合計)
3000-3999--------------300個1
~~~~
9000-9999--------------300個1
合計:1000+300*10

依此類推,計算兩數之間的1,可以先計算從1到終點之間最靠近的整千位的總量,再減去開頭及末尾的1
李冬宝 2008-04-01
  • 打赏
  • 举报
回复
int icount = 0;
for (int i = n; i <= m; i++)
{
int len1 = i.ToString().Length;
int len2 = i.ToString().Replace("1", "").Length;
icount += len1 - len2;
}

这样很快啊
海洋齐齐 2008-04-01
  • 打赏
  • 举报
回复
/* TODO : 我也做个记号 */
lanpeng 2008-04-01
  • 打赏
  • 举报
回复
建議LZ去學習下數據結構和算法,
這還不是什么算法之類的東西。
像什么堆排序,希爾排序呀等 等
waterxx 2008-03-31
  • 打赏
  • 举报
回复
-_-#!

无意中看到

这不是排列组合问题么?不需要循环计算啊

稍想了一下
只到个位最大数9时,即0~9 只有1个1  
即A1 = 1
到十位最大数99时,即0~99 有 10 + 10 = 20个
  这里第一个10是01,11,21…91 共10个,第二个10是 10,11,12,13,…19共10个
即A2 = A1*10 + 10^1
到百位最大数999时,有(10 + 10)* 10 + 100
即A3 = A2*10 + 10^2

如此,到n位最大数时, An = (An-1)*10 + 10^(n-1)
至于从N到M,再分开计算出0~N和0~M中各含1的个数,再相减就成了


crossrowman 2008-03-31
  • 打赏
  • 举报
回复

if(x==1)N_Count+=N_1_Count; //这行写错了 ,应该是: N_Count+=1000000;//N-1个0
这个应该可以跟 if(N==0)分支合并
crossrowman 2008-03-31
  • 打赏
  • 举报
回复
给个解题思路,我要100分

//求解 x0000~y0000 (后面N个0) 中包含的1的个数
//0<x<y<=9
long calc( int x , int y , int N)
{
if(N==0)
{
if(x==1) return 1;
else return 0;
}
//这里没有仔细想 反正漏掉的也就可能是 9000~9999这些,一样的递归去算
long N_1_Count = calc(1,9,N-1);
long N_Count =(y-x) * N_1_Count;//不知道会不会溢出...
if(x==1)N_Count+=N_1_Count;
return N_Count;
}


pgdoryoku 2008-03-31
  • 打赏
  • 举报
回复
好贴,先mark
junlingxin 2008-03-31
  • 打赏
  • 举报
回复
修改一下,执行的也不行
private static int count = 0;
static void Main(string[] args)
{
test(2008, 20080808);
System.Console.WriteLine(count);
System.Console.ReadLine();
}
private static void test(int m, int n)
{
for (int i = m; i <= n; i++)
{
checkValue(i);
}
}
private static void checkValue(int value)
{
string strValue = Convert.ToString(value);
string[] values=strValue.Split('1');
count = count + (values.Length - 1);
}
junlingxin 2008-03-31
  • 打赏
  • 举报
回复
static void Main(string[] args)
{
test(1, 20080808);
System.Console.WriteLine(count);
System.Console.ReadLine();
}
private static void test(int m, int n)
{
for (int i = m; i <= n; i++)
{
checkValue(i);
}
}
private static void checkValue(int value)
{
string strValue = "="+Convert.ToString(value)+"=";
string[] values=strValue.Split('1');
count = count + (values.Length - 1);
}


执行了12秒
加载更多回复(102)
基础篇 1、 算法有哪些特点?它有哪些特征?它和程序的主要区别是什么? 2、 算法的时间复杂度指的是什么?如何表示? 3、 算法的空间复杂度指的是什么?如何表示? 4、 什么是最坏时间复杂性?什么是最好时间复杂性? 5、 什么是递归算法?什么是递归函数? 6、 分治法的设计思想是什么? 7、 动态规划基本步骤是什么? 8、 回溯法与分枝限界法之间的相同点是什么?不同之处在哪些方面? 9、 分枝限界法的基本思想是什么? 10、 限界函数的功能是什么? 11、 设某一函数定义如下: 编写一个递归函数计算给定x的M(x)的值。 12、 已知一个顺序表的元素按元素值非递减有序排列,编写一个函数删除表多余的值相同的元素。 13、 分别写出求二叉树结点总数及叶子总数的算法。 分治术 14、 有金币15枚,已知其有一枚是假的,而且它的重量比真币轻。要求用一个天平将假的金币找出来,试设计一种算法(方案),使在最坏情况下用天平的次数最少。 15、 利用分治策略,在n个不同元素找出第k个最小元素。 16、 设有n个运动员要进行网球循环赛。设计一个满足以下要求的比赛日程表。 (1)每个选手必须与其它n-1选手各赛一次; (2)每个选手一天只能赛一次。 17、 已知序列{503,87,512,61,908,170,897,275,652,462},写一个自底向上的归并分类算法对该序列作升序排序,写出算法每一次归并执行的结果。 贪心法 18、 设有n个文件f1,f2,…,fn要求存放在一个磁盘上,每个文件占磁盘上1个磁道。这n个文件的检索概率分别是p1,p2,…,pn,且 =1。磁头从当前磁道移到被检索信息磁道所需的时间可用这两个磁道之间的径向距离来度量。如果文件fi存放在第i道上,1≤i≤n则检索这n个文件的期望时间是 。其d(i,j)是第i道与第j道之间的径向距离。磁盘文件的最优存储问题要求确定这n个文件在磁盘上的存储位置,使期望检索时间达到最小。试设计一个解此问题的算法,并分析算法的正确性与计算复杂性。 19、 设有n个正整数,编写一个算法将他们连接成一排,组成一个最大的多位整数。用贪心法求解本题。 20、 键盘输入一个高精度的正整数N(此整数没有‘0’),去掉其任意S个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数最小(输出应包括所去掉的数字的位置和组成的新的正整数,N不超过240位)。 21、 对于下图给出的有向网,写出用Dijkstra方法求从顶点A到图其它顶点的最短路径的算法,并写出执行算法过程顶点的求解次序及从顶点A到各顶点路径的长度。 22、 对于上图给出的有向图,写出最小成本生成树,给出求解算法。 动态规划 23、 求出上图每对结点间的最短距离的算法,并给出计算结果。 24、 下图给出了一个地图,地图每个顶点代表一个城市,两个城市间的连线代表道路,连线上的数值代表道路的长度。现在,想从城市A到达城市E,怎样走路程最短,最短路程的长度是多少? 25、 已知序列a1,a2,…,an,试设计一算法,从找出一子序列 ai1 < ai2 < … E。试用动态规划的最优化原理求出A->E的最省费用。 29、 已知如下图,写出用动态规划求最短路径的递推关系式,并写出求从源点A0到终点A3 的最短路径过程。给出求解算法。 6 A1 A2 5 5 2 A0 A3 3 4 4 B1 B2 5 搜索与遍历问题 30、 已知有向图G=,试设计一算法以判断对于任意两点u和v,是否存在一条从u到v的路径,并分析其复杂度。 31、 对于给定的一个二叉树T(如下图) a) 设计一个算法统计二叉树结点总数; b) 设计一个算法,求二叉树最大宽度及最大宽度所在深度。 32、 判近亲问题。给定一个家族族谱,为简化问题起见,假设家族的夫妻关系只表示男性成员。设用线性表存储家族成员,用成员的父指针指向其生父。编写一个在此种族谱表示方式下的算法,判断给定的二个家族成员是否是五代内的近亲。(提示:家族成员的表示方式应与搜索方式相适应。) 33、 完全二叉树定义为:深度为K,具有N个结点的二叉树的每个结点都与深度为K的满二叉树编号从1至N的结点一一对应。(1)写一个建立二叉树的算法。(2)写一个判别给定的二叉树是否是完全二叉树的算法。 34、 编写计算整个二叉树高度的算法(二叉树的高度也叫二叉树的深度)。 35、 编写计算二叉树最大宽度的算法(二叉树的最大宽度是指二叉树所有层结点个数的最大值)。 回溯法 36、 (组合问题)求出从自然数1,2,…,n任取r个数的所有组合。 37、 传教士与野人渡河问题。有M个传教士和M个野人准备渡河,船一次最多载2人,任何时刻野人数不能多于传教士数,但允许全部为野人。编写算法给出合理的渡河计划。 38、 某乡有n个村庄,有一个售货员,他要到各个村庄去售货,各村庄之间的路程s是已知的,且A村到B村与B村到A村的路大多不同。为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为1。试设计一个算法,帮他选择一条最短的路。 39、 设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设wi,j是从供应商j处购得的部件i的重量,ci,j是相应的价格。试设计一个算法,给出总价格不超过c的最小重量机器设计。 40、 设有n件工作分配给n个人。为第i个人分配工作j所需的费用为ci,j 。试设计一个算法,计算最佳工作分配方案,为每一个人都分配1 件不同的工作,并使总费用达到最小。 41、 编写程序求解骑士巡游问题:在n行n列的棋盘上(如n=8),假设一位骑士(按象棋“马走日”的行走法)从初始坐标位置(x1,y1)出发,要遍访(巡游)棋盘的每一个位置一次。请编一个程序,为骑士求解巡游“路线图”(或告诉骑士,从某位置出发时,无法遍访整个棋盘 — 问题无解骑士巡游)。
第四届“蓝桥杯”全国软件专业人才设计与创业大赛选拔赛 C/C++高职高专组 1、题目标题: 猜年龄 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来国清华大学讲学。 一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说: “我年龄的立方是个4位数。我年龄的4次方是个6位数。这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。” 请你推算一下,他当时到底有多年轻。 通过浏览器,直接提交他那时的年龄数字。    注意:不要提交解答过程,或其它的说明文字。                     2、标题: 马虎的算式             小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。         有一次,老师出的题目是:36 x 495 = ?         他却给抄成了:396 x 45 = ?         但结果却很戏剧性,他的答案竟然是对的!!         因为 36 * 495 = 396 * 45 = 17820         类似这样的巧合情况可能还有很多,比如:27 * 594 = 297 * 54         假设 a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,且不含0)         能满足形如: ab * cde = adb * ce 这样的算式一共有多少种呢?            请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。        满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。            答案直接通过浏览器提交。    注意:只提交一个表示最终统计种类数的数字,不要提交解答过程或其它多余的内容。         3、标题: 振兴华         小明参加了学校的趣味运动会,其的一个项目是:跳格子。         地上画着一些格子,每个格子里写一个字,如下所示:(也可参见p1.jpg)        从 我 做 起 振    我 做 起 振 兴    做 起 振 兴    起 振 兴 华             比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。             要求跳过的路线刚好构成“从我做起振兴华”这句话。         请你帮助小明算一算他一共有多少种可能的跳跃路线呢?        答案是一个整数,请通过浏览器直接提交该数字。    注意:不要提交解答过程,或其它辅助说明类的内容。    a=从    b=我    c=做    d=起    e=振    f=兴    g=    h=华                     4、标题: 幻方填空         幻方是把一些数字填写在方阵,使得行、列、两条对角线的数字之和都相等。         欧洲最著名的幻方是德国数学家、画家迪勒创作的版画《忧郁》给出的一个4阶幻方。         他把1,2,3,...16 这16个数字填写在4 x 4的方格。         如图p1.jpg所示,即:        16 ? ? 13    ? ? 11 ?    9 ? ? *    ? 15 ? 1         表有些数字已经显露出来,还有些用?和*代替。         请你计算出? 和 * 所代表的数字。并把 * 所代表的数字作为本题答案提交。            答案是一个整数,请通过浏览器直接提交该数字。    注意:不要提交解答过程,或其它辅助说明类的内容。         5、题目标题:公约数公倍数         我们经常会用到求两个整数的最大公约数和最小公倍数的功能。         下面的程序给出了一种算法。         函数 myfunc 接受两个正整数a,b         经过运算后打印出 它们的最大公约数和最小公倍数。         此时,调用 myfunc(15,20)        将会输出:    3    60        // 交换数值    void swap(int *a,int *b)    {     int temp;     temp=*a;     *a=*b;     *b=temp;    }        void myfunc(int a, int b)    {     int m,n,r;     if(a算法,如快速排序、希尔排序等。         但实际应用时,经常会或多或少有一些特殊的要求。我们没必要套用那些经典算法,可以根据实际情况建立更好的解法。         比如,对一个整型数组的数字进行分类排序:         使得负数都靠左端,正数都靠右端,0在部。注意问题的特点是:负数区域和正数区域内并不要求有序。可以利用这个特点通过1次线性扫描就结束战斗!!         以下的程序实现了该目标。         其x指向待排序的整型数组,len是数组的长度。        void sort3p(int* x, int len)    {     int p = 0;     int left = 0;     int right = len-1;         while(p<=right){     if(x[p]<0){     int t = x[left];     x[left] = x[p];     x[p] = t;     left++;     p++;     }     else if(x[p]>0){     int t = x[right];     x[right] = x[p];     x[p] = t;     right--;     }     else{     __________________________; //填空位置     }     }        }         如果给定数组:     25,18,-2,0,16,-5,33,21,0,19,-16,25,-3,0     0 ,18,-2,0,16,-5,33,21,0,19,-16,25,-3,25         则排序后为:     -3,-2,-16,-5,0,0,0,21,19,33,25,16,18,25                请分析代码逻辑,并推测划线处的代码,通过网页提交    注意:仅把缺少的代码作为答案,千万不要填写多余的代码、符号或说明文字!!         7、标题:核桃的数量         小张是软件项目经理,他带领3个开发组。工期紧,今天都在加班呢。为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑)。他的要求是:         1. 各组的核桃数量必须相同     2. 各组内必须能平分核桃(当然是不能打碎的)     3. 尽量提供满足1,2条件的最小数量(节约闹革命嘛)        程序从标准输入读入:    a b c    a,b,c都是正整数,表示每个组正在加班的人数,用空格分开(a,b,c<30)        程序输出:    一个正整数,表示每袋核桃的数量。        例如:    用户输入:    2 4 5        程序输出:    20        再例如:    用户输入:    3 1 1        程序输出:    3                资源约定:    峰值内存消耗(含虚拟机) < 64M    CPU消耗 < 1000ms            请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。        所有代码放在同一个源文件,调试通过后,拷贝提交该源码。        注意: main函数需要返回0    注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。    注意: 所有依赖的函数必须明确地在源文件 #include , 不能通过工程设置而省略常用头文件。        提交时,注意选择所期望的编译器类型。         8、题目标题:打印十字图         小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示(可参见p1.jpg)         $$$$$$$$$$$$$     $ $     $$$ $$$$$$$$$ $$$     $ $ $ $     $ $$$ $$$$$ $$$ $     $ $ $ $ $ $     $ $ $$$ $ $$$ $ $     $ $ $ $ $ $ $     $ $ $ $$$$$ $ $ $     $ $ $ $ $ $ $     $ $ $$$ $ $$$ $ $     $ $ $ $ $ $     $ $$$ $$$$$ $$$ $     $ $ $ $     $$$ $$$$$$$$$ $$$     $ $     $$$$$$$$$$$$$             对方同时也需要在电脑dos窗口以字符的形式输出该标志,并能任意控制层数。         为了能准确比对空白的数量,程序要求对行的空白以句点(.)代替。        输入格式:    一个正整数 n (n<30) 表示要求打印图形的层数        输出:    对应包围层数的该标志。        例如:    用户输入:    1    程序应该输出:    ..$$$$$..    ..$...$..    $$$.$.$$$    $...$...$    $.$$$$$.$    $...$...$    $$$.$.$$$    ..$...$..    ..$$$$$..        再例如:    用户输入:    3    程序应该输出:    ..$$$$$$$$$$$$$..    ..$...........$..    $$$.$$$$$$$$$.$$$    $...$.......$...$    $.$$$.$$$$$.$$$.$    $.$...$...$...$.$    $.$.$$$.$.$$$.$.$    $.$.$...$...$.$.$    $.$.$.$$$$$.$.$.$    $.$.$...$...$.$.$    $.$.$$$.$.$$$.$.$    $.$...$...$...$.$    $.$$$.$$$$$.$$$.$    $...$.......$...$    $$$.$$$$$$$$$.$$$    ..$...........$..    ..$$$$$$$$$$$$$..        请仔细观察样例,尤其要注意句点的数量和输出位置。            资源约定:    峰值内存消耗 < 64M    CPU消耗 < 1000ms            请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。        所有代码放在同一个源文件,调试通过后,拷贝提交该源码。        注意: main函数需要返回0    注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。    注意: 所有依赖的函数必须明确地在源文件 #include , 不能通过工程设置而省略常用头文件。        提交时,注意选择所期望的编译器类型。                 9、标题:带分数         100 可以表示为带分数的形式:100 = 3 + 69258 / 714         还可以表示为:100 = 82 + 3546 / 197         注意特征:带分数,数字1~9分别出现且只出现一次(不包含0)。         类似这样的带分数,100 有 11 种表示法。        题目要求:    从标准输入读入一个正整数N (N<1000*1000)    程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。    注意:不要求输出每个表示,只统计有多少表示法!            例如:    用户输入:    100    程序输出:    11        再例如:    用户输入:    105    程序输出:    6            资源约定:    峰值内存消耗 < 64M    CPU消耗 < 3000ms            请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。        所有代码放在同一个源文件,调试通过后,拷贝提交该源码。        注意: main函数需要返回0    注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。    注意: 所有依赖的函数必须明确地在源文件 #include , 不能通过工程设置而省略常用头文件。        提交时,注意选择所期望的编译器类型。                 10、标题:剪格子         如图p1.jpg所示,3 x 3 的格子填写了一些整数。         我们沿着图的红色线剪开,得到两个部分,每个部分的数字和都是60。         本题的要求就是请你编程判定:对给定的m x n 的格子的整数,是否可以分割为两个部分,使得这两个区域的数字和相等。     如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目。     如果无法分割,则输出 0        程序输入输出格式要求:        程序先读入两个整数 m n 用空格分割 (m,n<10)    表示表格的宽度和高度    接下来是n行,每行m个正整数,用空格分开。每个整数不大于10000    程序输出:在所有解,包含左上角的分割区可能包含的最小的格子数目。            例如:    用户输入:    3 3    10 1 52    20 30 1    1 2 3        则程序输出:    3        再例如:    用户输入:    4 3    1 1 1 1    1 30 80 2    1 1 1 100        则程序输出:    10        (参见p2.jpg)            资源约定:    峰值内存消耗 < 64M    CPU消耗 < 5000ms            请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。        所有代码放在同一个源文件,调试通过后,拷贝提交该源码。        注意: main函数需要返回0    注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。    注意: 所有依赖的函数必须明确地在源文件 #include , 不能通过工程设置而省略常用头文件。        提交时,注意选择所期望的编译器类型。            
​什么是共识算法背景分布式系统集群设计面临着一个不可回避的问题,一致性问题对于系统的多个服务节点,给定一系列操作,如何试图使全局对局部处理结果达成某种程度的一致?这个一致性问题大致有如下的场景:节点之间通讯不可靠的,延迟和阻塞节点的处理可能是错误的,甚至节点自身随时可能宕机节点作恶举例说明,就比如有两家电影院同时售卖总量一定的电影票,在这样的场景下,要如何设计方式来保证两家电影院协调同步不出现超卖或者错卖的问题呢?共识算法,就是解决对某一提案(目标,投票等各种协作工作),大家达成一致意见的过程比如上述的买票问题,就可以有如下的设计:1.每次卖票打电话给其他电影院,确认当前票数2.协商售卖时间,比如一三五A卖,二四六B卖3.成立个第三方存票机构,它统一发票通过以上的设计,可以看出一个很重要的解决一致性算法的解决思路,即:将可能引发不一致的并行操作进行串行化,就是现在计算机系统里处理分布式一致性问题基础思路和唯一秘诀 著名的共识设计理论FLP 不可能性原理  共识算法的理论下限提出该定理的论文是由 Fischer, Lynch 和 Patterson 三位作者于 1985 年发表,该论文后来获得了 Dijkstra(就是发明最短路径算法的那位)奖。FLP 原理认为对于允许节点失效情况下,纯粹异步系统无法确保一致性在有限时间内完成。三人三房间投票例子三个人在不同房间,进行投票(投票结果是 0 或者 1)。三个人彼此可以通过电话进行沟通,但经常会有人时不时地睡着。比如某个时候,A 投票 0,B 投票 1,C 收到了两人的投票,然后 C 睡着了。A 和 B 则永远无法在有限时间内获知最终的结果。如果可以重新投票,则类似情形每次在取得结果前发生带入到计算机领域就是说,即便在网络通信可靠情况下,一个可扩展的分布式系统的共识问题的下限是无解。即可靠性的下限是0%CAP  分布式系统领域的重要原理CAP 原理最早由 Eric Brewer 在 2000 年,ACM 组织的一个研讨会上提出猜想,后来 Lynch 等人进行了证明• C(一致性):所有的节点上的数据时刻保持同步,即数据一致• A(可用性):每个请求都能在一定时间内接受到一个响应,即低延迟• P(分区容错):当系统发生分区时仍然可以运行的定理:任何分布式系统只可同时满足二点,没法三者兼顾。即数据一致,响应及时,可分区执行不可能同时满足。举个例子:一个分布式网路上,某一个节点有一组依赖数据A,当网络无延迟,无阻塞时,依赖于X的操作可正常进行。但网络无延迟阻塞在现实世界是没法100%保证的,那么当网络异常时,必然会产生分布式系统的分区和孤岛,那当一个执行操作在A分区之外时,如果要保证P,即当系统发生分区时仍可运行,就需要在分布式系统多个节点有X的备份数据,以应对分区情况。则这时候就需要在C,A之间做出选择。假如选择C,即要保证数据在分布式网络的一致性,那么就需要在X每次改动时,需要将全网节点的X数据同步刷新成最新的状态,那么在等待数据刷新完成之前,分布式系统是不可响应X的依赖操作的,即A的功能缺失假如选择A,即要突出低延迟的实时响应。那么在响应的时候,可能全节点的X数据并没有同步到最新的状态,则会导致C的缺失。上面看上去有些绕,那么你只要记住这句话,CAP原理在分布式网络系统的应用讨论,其实就是讨论在允许网络发生故障的系统,该选择一致性还是可靠性?如果系统重视一致性,那么可以基于ACID原则做系统设计即 Atomicity(原子性)、Consistency(一致性)、Isolation(隔离性)、Durability(持久性)。ACID 原则描述了对分布式数据库的一致性需求,同时付出了可用性的代价。• Atomicity:每次操作是原子的,要么成功,要么不执行;• Consistency:数据库的状态是一致的,无间状态;• Isolation:各种操作彼此互相不影响;• Durability:状态的改变是持久的,不会失效相应的有一个BASE原则,(Basic Availiability,Soft state,Eventually Consistency)则强调了可用性。 经典的共识算法设计业内,针对节点异常的情况,会有两种分类1.故障的,不响应的节点,成为非拜占庭错误2.恶意响应的节点,称为非拜占庭错误Paxos 最早的共识算法  非拜占庭算法的代表Paxos有三种角色:• proposer:提出一个提案,等待大家批准为结案。客户端担任该角色;• acceptor:负责对提案进行投票。往往是服务端担任该角色;• learner:被告知结案结果,并与之统一,不参与投票过程。即普通节点系统运行由proposer驱动,当合法提案在一定时间内收到1/2以上投票后达成共识。因此,可得出无法达成共识的条件:1.proposer故障2.二分之一以上acceptor故障拜占庭问题与BFT(Byzantine Fault Tolerant) 算法Leslie Lamport 1982 年提出用来解释一致性问题的一个虚构模型。拜占庭是古代东罗马帝国的首都,由于地域宽广,守卫边境的多个将军(系统的多个节点)需要通过信使来传递消息,达成某些一致的决定。但由于将军可能存在叛徒(系统节点出错),这些叛徒将努力向不同的将军发送不同的消息,试图会干扰一致性的达成。拜占庭问题即为在此情况下,如何让忠诚的将军们能达成行动的一致。对于拜占庭问题来说,假如将军总数为 N,叛变将军数为 F,则当N>=3F+1 时,问题才有解,即叛变的将军不超过1/3时,存在有效的算法,如BFT,不论叛变者如何折腾,忠诚的将军们总能达成一致的结果。这是一个数学论证的结论,有兴趣的同学可以自行推导。PBFT  一种高效拜占庭容错共识算法PBFT是Practical Byzantine Fault Tolerance的缩写,意为实用拜占庭容错算法。该算法是Miguel Castro 和Barbara Liskov(2008年图灵奖得主)在1999年提出来的,解决了原始拜占庭容错算法效率不高的问题。他的核心思想是:对于每一个收到命令的将军,都要去询问其他人,他们收到的命令是什么。如上图,假设命令由A将军分发,假如A是作恶异常,分发给B,C,D的操作分别是1,2,3.意图扰乱共识。拜占庭容错算法上设计实现是,当B,C,D收到命令后,相互之间也会沟通从A收到的命令是否一致,从而达到识破干扰的目的。其容错的极限值就是N>=3F+1。PBFT 在区块链上的实现区块链的节点分为记账节点和普通节点两个角色记账节点负责向全网提供记账服务,并维护全局账本,每过一段时间从记账节点选一个议长,进行命令的分发,其他记账节点则作为议员进行验证将军就是记账节点,拥有全局账本,并验证交易的有效性,过互相传达验证结果,在f共识的一般流程如下:1.任一节点接收到发送者签名的交易数据请求后,向全网广播2.所有记账节点均独立监听全网的交易数据,并记录在内存3.议长在经过t后发送共识请求提案request4.议员在收到提案后,进行相关验证,发送响应response5.任意节点在限定时间内收到至少F+1个response后,共识达成,把交易记录入区块并发布给全网,如果超时,则更换视图和议长6.任意节点在收到完整区块后,把包含的交易从内存删除开始下一个共识循环区块产生间隔t,    记账节点n,  可容错节点数f, 视图编号v,  区块高度h, 议长编号p,  议员编号i p=(h-v)%n  未来的发展POW算法建立了比特币帝国,具有划时代的意义。但其能耗和速度问题却是制约区块链普及的两大难以解决的问题。目前POS算法是一大趋势,以太坊的Casper,EOS的DPos等都是借鉴了上述前人的设计理念做的基于应用场景的优化改造,但万变不离其宗,我和大家一样,需要不断的学习和思考,没准,能有发明出自己的共识算法的一天呢。 
第1章 C语言概述 1 1.5 参照本章例题,编写一个C程序,输出以下信息: 1 1.6 写一个程序,输入a,b,c三个值,输出其最大者。 1 第2章 程序的灵魂——算法 2 2.1 什么叫结构化的算法?为什么要提倡结构化的算法? 2 2.7 什么叫结构化程序设计?它的主要内容是什么? 2 第3章 数据类型、运算符与表达式 2 3.3请将下面各数用八进制和十六进制数表示: 2 3.4将以下三各整数分别赋给不同类型的变量,请画出赋值后数据在内存的存储形式。 2 3.5字符常量和字符串常量有什么区别? 3 3.6写出以下程序运行的结果: 3 3.7要将“China”译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母。例如,字母“A”后面第4个字母是“E”,用“E”代替“A”。因此,“China”应译为“Glmre”。请编一程序,用赋初值的方法使c1,c2,c3,c4,c5这5个变量的值分别为’C’,’h’,’i’,’n’,’a’,经过运算,使c1,c2,c3,c4,c5的值分别变为’G’,’l’,’m’,’r’,’e’,并输出。 4 3.8例2.6能否改成如下: 4 3.9求下面算术表达式的值。 4 3.10写出程序运行的结果。 5 3.11写出下面赋值的结果。格写了数值的是要将它赋给其他类型的变量,将所有空格填上赋值后的数值。 5 3.12 出下面表达式运算后a的值,设原来a=12。设a和n都已定义为整型变量。 5 第4章 最简单的C程序设计——顺序程序设计 6 4.4 若a=3,b=4,c=5,x=1.2,y=2.4,z=-3.6,u=51247,n=128765,c1=’a’,c2=’b’,想得到以下的输出格式和结果,请写出程序(包括定义变量类型和设计输出)。 6 4.5请写出下面程序的输出结果: 7 4.6 用下面的scanf函数输入数据,使a=3,b=7,x=8.5,y=71.82,c1=’A’,c2=’a’。问在键盘上如何输入? 7 4.7下面的scanf函数输入数据,使a=10,b=20,c1=’A’,c2=’a’,x=1.5,y=-3.75,z=67.8,请问在键盘上如何输入数据? 8 4.8圆半径r=1.5,圆柱高h=3,求圆周长,圆面积,圆球表面积,圆球体积,圆柱体积。用scanf输入数据,输出计算结果,输出时要求有文字说明,取小数点后2位数字。请编程序。 8 4.9输入一个华氏温度,要求输出摄氏温度,公式为C=(5/9)(F-32) 9 输出要有文字说明,取2位小数。 9 第5章 选择结构程序设计 10 5.2语言如何表示“真”和“假”?系统如何判断一个量的“真”和“假”? 10 5.3写出下面各逻辑表达式的值。设a=3,b=4,c=5。 10 5.4有3个整数a,b,c,由键盘输入,输出其最大的数。 10 5.5有一函数: 11 5.6给出一百分制成绩,要求输出成绩等级’A’、’B’、’C’、’D’、’E’。90分以上为’A’,80~89分为’B’,70~79分为’C’,60~69分为’D’,60分以下为’E’。 12 5.7给定一个不多于5位的正整数,要求:①求它是几位数;②分别打印出每一位数字;③按逆序打印出各位数字。例如原数为321,应输出123。 13 5.8企业发放的奖金根据利润提成。利润I低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元(100000中10万元按10%提成,高于10万元的部分,可提成7.5%;200000 中20万元仍按上述办法提成(下同),高于20万元的部分按5%提成;400000正整数m和n,求其最大公约数和最小公倍数。 17 6.2输入一行字符,分别统计出其英文字母,空格,数字和其它字符的个数。 18 6.3 18 6.4求∑n!(即求1+2!+…+20!)。 19 6.5求 19 6.6打印出所有的“水仙花数”。 20 6.7一个数如果恰好等于它的因子之和,这个数就称为“完数“。例如,6的因子为1,2,3,而6=1+2+3,因此6是“完数”。编程序找出1000以内的所有“完数”,并按下面的格式输出其因子:6 Its factors are 1,2,3 20 6.8有一分数序列: 23 6.9一球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下。求它在第10次落地时,共经过多少m?第10次反弹多高? 23 6.10猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上再想吃时,见只剩一个桃子了。求第一天共摘多少桃子。 24 6.11用迭代法求 24 6.12用牛顿迭代法求方程2x3-4x2+3x-6=0在1.5附近的根。 25 6.13用二分法求方程2x3-4x2+3x-6=0在(-10,10)之间的根。 26 6.14打印出以下图案: 27 6.15两个乒乓球队进行比赛,各出3人。甲队为A、B、C3人,乙队为X、Y、Z3人。已抽签决定比赛名单。有人向队员打听比赛名单。A说他不和X比,C说他不和X、Z比。请编程找出3对赛手的名单。 28 第7章 数组 28 7.1用筛法求100之内的素数。 28 7.2用选择法对10个整数排序(从小到大)。 30 7.3求一个3×3矩阵对角线元素之和。 31 7.4有一个已排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组。 32 7.5将一个数组的值按逆序重新存放。例如原来顺序为:8,6,5,4,1。要求改为:1,4,5,6,8。 34 7.6打印出以下的杨辉三角形(要求打印出10行)。 35 7.7输出魔方阵。所谓魔方阵是指这样的方阵(方阵的阶数应为奇数),它的每一行、每一列和对角线之和均相等。 36 7.8找出一个二维数组的鞍点,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点。 38 7.9有15个数按从小到大的顺序存放在一个数组。输入一个数,要求用折半查找法找出该数是数组第几个元素的值。如果该数不在数组,输出“不在表”。 39 7.10有一篇文章,共有3行文字,每行有80个字符。要求分别统计出其英文大写字母,小写字母,数字,空格以及其它字符的个数。 41 7.11打印以下图案: 42 7.12有一行电文,已按下面规律译成密码: 43 7.13编一个程序,将两个字符串连接起来,不要用strcat函数。 45 7.14编一个程序,将两个字符串s1和s2进行比较。如果s1>s2,输出一个正数;s1=s2,输出0;s1中,不用strcpy函数。拷贝时,’\0’也要拷过去,’\0’后面的字符不拷贝。 46 第8章 函数 47 8.1写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果,两个整数由键盘输入。 47 8.2 47 8.3写一个判素数的函数,在主函数输入一个整数,输出是否素数的信息。 49 8.4写一函数,使给定的一个二维数组(3×3)转置,即行列互换。 49 8.5写一函数,使输入的一个字符串按反序存放,在主函数输入和输出字符串。 50 8.6写一函数,将两个字符串连接。 51 8.7写一函数,输入一个4位数字,要求输出这4个数字字符,但每两个数字之间有一个空格。如输入1990,应输出”1 9 9 0”。 52 8.8编写一函数,有实参传来一个字符串,统计此字符串字母,数字,空格和其它字符的个数,在主函数输入字符串以及输出上述的结果。 52 8.10写一函数,用“起泡法”对输入的10个字符按由小到大的顺序排列。 54 8.11用弦截法求根。 55 8.12输入10个学生5门课的成绩,分别用函数求:(1)每个学生的平均分;(2)每门课的平均分;(3)找出最高的分数所对应的学生和课程;(4)求出平均分方差; 57 8.13写几个函数:(1)输入10个职工的姓名和职工号;(2)按职工号由小到大排序,姓名顺序也随之调整;(3)要求输入一个职工号,用折半查找法找出该职工的姓名。 61 8.14写一函数,输入一个十六进制数,输出相应的十进制数。 64 8.15给出年,月,日,计算该日是该年的第几天。 65 第9章 预处理命令 66 9.1定义一个代参数的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参。输出已交换后的两个值。 66 9.2输入两个整数,求它们相除的余数。用带参的宏来实现,编程序。 67 9.3 67 9.4给年份year定义一个宏,以判断该年份是否为闰年。 68 9.5请分析以下一组宏所定义的输出格式: 68 9.6请设计输出实数的格式。实数用“6.2f”格式输出。 69 9.7分别用函数和带参的宏,从3个数找出最大数。 70 9.8试述“文件包含”和程序文件的连接(link)的概念,二者有何不同? 71 9.9用条件编译法实现以下功能: 71 第10章 指针 72 10.1输入3个整数,按由小到大的顺序输出。 72 10.2输入3个字符串,按由小到打的顺序输出。 73 10.3输入10个整数,将其最小的数与第一个数对换,把最大的一个数与最后一个对换。写3个函数:(1)输入10个数;(2)进行处理;(3)输出10个数。 74 10.4有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成前面m个数。 75 写一函数实现以上功能,在主函数输入n个整数,并输出调整后的n个数。 75 10.5有一字符串,包含n个字符。写一个函数,将此字符串从第m个字符开始的全部字符复制成为另一个字符串。 76 10.6输入一行文字,找出其大写字母,小写字母,空格,数字及其他字符各有多少。 77 10.7写一个函数,将一个3×3的矩阵转置。 77 9.8将一个5×5的矩阵最大的元素放在心,4个角分别放在4个最小的元素(按从左到右,从上到下的顺序,依次从小到大存放),写一个函数实现之,并用main函数调用。 78 10.9在主函数输入10个等长的字符串。用另一个函数对它们排序,然后在主函数输出这10个已排好序的字符串。 80 10.10用指针数组处理上一题目,字符串不等长。 81 10.11将n个数按输入输出顺序的逆序排列,用函数实现。 82 10.12有一个班4个学生,5门课。(1)求第一门课的平均分;(2)找出有两门以上课程不及格的学生,输出他们的学号和全部课程成绩及平均成绩;(3)找出平均成绩在90分以上或全部课程成绩在85分以上的学生。分别编3个函数实现上3个要求。 83 10.13输入一个字符串,内有数字和非数字字符,如: 86 10.14写一函数,实现两个字符串的比较。即自己写一个strcmp函数,函数原型为: 88 10.15编写一个程序,打入月份号,输出该月的英文月名。例如,输入”3”,则输出”March”,要求用指针数组处理。 89 10.16用指向指针的指针的方法对5个字符串排序并输出。 89 10.17用指向指针的指针的方法对n个整数排序并输出。要求将排序单独写成一个函数。n和正整数在主函数输入。最后在主函数输出。 90 第11章 结构体与共用体 91 11.1定义一个结构体变量(包括年,月,日)。计算该日在本年是第几天,注意闰年问题。 91 11.2写一个函数days,实现上面的计算。由主函数将年,月,日传递给days函数,计算后将日数传回主函数输出。 93 11.3编写一个函数print,打印一个学生的成绩数组,该数组有5个学生的数据记录,每个记录包括num,name,score[3],用主函数输入这些记录,用print函数输出这些记录。 95 11.4在上题的基础上,编写一个函数input,用来输入5个学生的数据记录。 97 11.5有10个学生,每个学生的数据包括学号,姓名,3门课的成绩,从键盘输入10个学生的数据,要求打印出3门课的总平均成绩,以及最高分的学生的数据(包括学号,姓名,3门课成绩,平均分数)。 97 11.6编写一个函数new,对n个字符开辟连续的存储空间,此函数应返回一个指针(地址),指向字符串开始的空间。new(n)表示分配n个字节的内存空间。 100 11.7写一函数free,将上题new函数占用的空间释放free(p)表示将p(地址)指向的单元以后的内存段释放。 101 11.8已有a,b两个链表,每个链表的结点包括学号,成绩。要求把两个链表合并,按学号升序排列。 101 11.9有两个链表a和b,设结点包含学号,姓名。从a链表删去与b链表有相同学号的那些结点。 104 11.10建立一个链表,每个结点包括:学号,姓名,性别,年龄。输入一个年龄,如果链表的结点所包含的年龄等于此年龄,则将此结点删去。 106 第12章 位运算 109 12.1编写一个函数getbits,从一个16位的单元取出某几位()即该几位保留原值,其余位为0)。函数调用形式为: 109 12.2写一个函数,对一个16位的二进制数取出它的奇位数(即从左边起第1,3,5,…,15位)。 109 12.3编一程序,检查一下你所用的计算机系统的C编译在执行右移时是按照逻辑位移的原则,还是按照算术右移的原则。如果是逻辑右移,请编一函数实现算术右移;如果是算术右移,请编一函数实现逻辑右移。 110 12.4编一函数用来实现左右循环移位。函数名为move,调用方法为:move(value,n) 112 其value为要循环位移的数,n为位移的位数。如n0为右移。如n=4,表示要右移4位;n=-3,表示要左移3位。 112 第13章 文件 113 13.3从键盘输入一个字符串,将其的小写字母全部转换成大写字母,然后输出到一个磁盘文件”test”保存。输入的字符串以”!”结束。 113 13.4有两个磁盘文件“A”和“B”,各存放一行字母,要求把这两个文件的信息合并(按字母的顺序排列),输出到一个新文件“C”。 114 13.5有5个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件stud。 115 13.7将上题已排序的学生成绩文件进行插入处理。插入一个学生的3门课成绩,程序先计算新插入学生的平均成绩,然后将它按平均成绩高低顺序插入,插入后建立一个新文件。 122 13.8将上题的结果仍存入原有的stu_sort文件而不另建立新文件。 123 13.9有一磁盘文件emploee,内存放职工的数据。每个职工的数据包括:职工姓名,职工号,性别,年龄,住址,工资,健康状况,文化程度。要求将职工名和工资的信息单独抽出来另建一个简明的职工工资文件。 125 13.10从上题的“职工工资文件”删去一个职工的数据,再存回原文件。 127
课程设计题目 一、必做题。 1、链表排序 任务 : (1)从文件读入30个无序整数,建立一个单链表,排序输出、再倒序输出。 (2)从文件A读入30个无序整数,建立一个递增的单链表A并输出,从文件B读入30个无序整数,建立一个递增的单链表B并输出,在A求递增的并集。 (3)从文件读入30个学生成绩(0-100之间),建立一个双向循环链表并输出,调整链表顺序,使所有的及格成绩排在不及格成绩之前,并输出。 2、二叉树的应用 任务 :编程实现二叉树的建立,层次遍历,(递归和非递归方法)先序、序、后序,二叉树的高度、宽度。二叉排序树的建立、插入、删除; 基本要求:从文件读入建树信息,树的节点数目不小于20个,树的高度不小于5; 3、校园局域网布线和游历问题 任务 :用无向网表示你所在学校的主要建筑平面图,图顶点表示主要建筑,图的边表示建筑之间的道路,存放路径长度信息。要求能够建立校园局域网,所花的代价最小;给出任意建筑之间游历的最短路径。 基本要求: (1) 原始数据存在文件,方便读入; (2) 建筑物点不小于20个,边不小于30个; (3) 分别用广度优先和深度优先的方法遍历图,起始点定为1号教学楼; (4) 建立校园局域网,要求所花的代价最小; (5) 查询从1号教学楼到其他各点的最短路径; (6) 查询图任意两个建筑间的最短路径。 4、Hash表应用 任务 :设计散列表实现电话号码查找系统。 基本要求: 1) 设每个记录有下列数据项:电话号码、用户名、地址; 2) 从键盘或文件输入各记录,不少于30个,以电话号码为关键字建立散列表; 3) 采用链地址的方法解决冲突; 4) 查找并显示给定电话号码的记录; 5、排序算法比较 任务 :利用随机函数产生10个样本(其之一已为正序,之一为倒序),每个样本有20000随机整数,利用直接插入排序、希尔排序,冒泡排序、快速排序、选择排序、堆排序,归并排序(递归和非递归),基数排序八种排序方法进行排序(结果为由小到大的顺序),并统计每一种排序所耗费的平均时间 二、选做题。 1、 运动会分数统计 任务:参加运动会有n个学校,学校编号为1……n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1……m,女子m+1……m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。(m=10 , w=8 , n=15) 功能要求: 1).可以输入各个项目的前三名或前五名的成绩; 2).能统计各学校总分(用链表); 3).可以按学校编号、学校总分、男女团体总分排序输出(快速、基数); 4).可按学校编号查询学校某个项目的情况;可按项目编号查询前三或前五名的学校。 界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。 存储结构:学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件。 测试数据:要求使用1、全部合法数据;2、局部非法数据。进行程序测试,以保证程序的稳定。测试数据及测试结果请在上交的资料写明; 2、 迷宫求解 任务:可以读入一个任意大小的迷宫数据,分别用广度和深度搜索的方法求出一条走出迷宫的路径,并将路径输出(最佳路径); 要求:以较为直观的方式显示结果 3、 Huffman编码 任务 :对一篇英文文章,统计各字符出现的次数,实现Huffman编码; 要求:输出每个字符出现的次数和编码,其求最小权值要求用堆实现; 4、营业窗口队列模拟 任务:实现具有n(n=3)个窗口的现实队列模拟,统计每人的等待时间。 要求: 1). 随机产生顾客的到达时间和服务时间存盘。 2). 利用存盘数据实现队列的插入和删除。 2). 当有顾客离开时,根据队列长度调整队尾。 3). 考虑顾客途离队的情况。 4). 考虑顾客具有优先级的情况。 5、公交线路提示 任务:建立南京主要公交线路图。 要求:输入任意两站点,给出最佳的乘车线路和转车地点。 路线信息可上网查询 6、家谱管理系统 任务:实现具有下列功能的家谱管理系统 功能要求: 1). 输入文件以存放最初家谱各成员的信息,成员的信息均应包含以下内容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡),也可附加其它信息、但不是必需的。 2). 实现数据的存盘和读盘。 3). 以图形方式显示家谱。 4). 显示第n 代所有人的信息。 5). 按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。 6). 按照出生日期查询成员名单。 7). 输入两人姓名,确定其关系。 8). 某成员添加孩子。 9). 删除某成员(若其还有后代,则一并删除)。 10).修改某成员信息。 11).按出生日期对家谱所有人排序。 12).打开一家谱时,提示当天生日的健在成员。 要求:建立至少30个成员,以较为直观的方式显示结果,并提供文稿形式以便检查。 界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能。 存储结构:学生自己根据系统功能要求自己设计,但是要求相关数据要存储在数据文件。测试数据:要求使用1、全部合法数据;2、局部非法数据。进行程序测试,以保证程序的稳定。测试数据及测试结果请在上交的资料写明; 7、算术表达式求值 任务: 一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#”,如:#(7+15)*(23-28/4)#。引入表达式起始、结束符是为了方便。编程利用“算符优先法”求算术表达式的值。 要求: (1) 从键盘读入一个合法的算术表达式,输出正确的结果。 (2) 显示输入序列和栈的变化过程。 8、电子小字典 任务:建立一个微型电子字典,实现生词的加入,单词的查找、删除,修改等操作。 数据结构:键树 9、稀疏矩阵相乘 任务:以三元组形式存储稀疏矩阵,实现矩阵相乘 10、平衡二叉树 任务:平衡二叉树的建立、结点的插入和删除。 11、B-树 任务:3阶B-树的结点的插入和删除。 12、编写“连连看”程序。 13、……(自选合适的题目) 成绩评定细则:(优、良、、及格、不及格五等级) 1. 正确性:程序是否可以运行,结果是否正确(20%) 2. 功能的完备性:是否实现要求的所有子功能(20%) 3. 课程设计报告算法说明,课程设计报告总结(20%) 4. 独立完成情况( 40%) 加分项目: 1.工作量和选题难度 2.可读性:代码编写是否规范,是否便于阅读。如函数、变量命名,‘{ }’的缩进,关键位置适量注释等 3.功能的完善:除要求实现的功能外,完成了其它的功能,实现了功能的完善 4.健壮性:异常处理的情况 5.界面的设计:可视化界面,或者交互良好的DOS界面 6. ……(自荐加分项目) 代码量要求:>=2500行。 代码总量 = 课设题目1 代码量 + 课设题目2 代码量…… 若代码总量低于2500行,则成绩按比例打折。 编程语言:C或C++语言 编程环境:Microsoft Visual C++ 6.0 检查方式:一对一上机检查 总体上检查程序的代码量,正确性,可读性,健壮性,功能的完备性,程序的结构是否合理;根据实际情况进行详细的程序代码检查。 时间安排: 1 上机时间安排 2课程设计检查时间 3 课程设计报告上交时间 课程设计报告要求: 1.课程设计报告封面:包括课题名称、班级、学号、学生姓名、成绩和指导教师; 2.课程设计报告目录:每部分内容所在页码; 3.需求分析:给出每道题的需求; 4.概要设计:给出每道题采用的数据结构,算法设计思想,算法的时间复杂度; 5.详细设计:给出每道题的源程序,并在必要的代码处给出注释; 6.功能测试:给出每道题的测试数据和结果; 7.完成情况:每道题完成部分和未完成部分,自己最满意的部分; 8.代码量:每道题代码的行数和总行数; 9.心得体会:包括课程设计设遇到的问题,如何解决,编程的体验,感想和建议; 10.课程设计报告的电子文档在检查后一周内上交班长。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧