1.一个人上台阶可以一次上1个,2个,或者3个,问这个人上32层的台阶,总共有几种走法?

思路:先建立数学模型,设3步的走 i 次,2步的走 j 次, 1步的走 k 次,上了3*i + 2*j + 1*k = n个台阶.总共走 i + j + k 次, 等于把n个台阶的长度先划分成 i + j + k 个段落, 然后分别填下i个3, j 个2, k个1.这样,当划分成 i + j + k 个段落时, 根据排列组合知识,所有填充方法有 (i + j + k )!/ ( i!*j!*k!) 种,程序中使用GetComb(i,j,k)函数计算此值.
对于i, j, k的确定,我们可以用从大到小划分法, 先划分3的次数,再划分2的次数,剩下的都算做1的次数,具体程序中就是里面的i,j,两重循环.

 #include <iostream>
#include <cstdio>
int Factorial(int n)
{
int ret = n;
if (n<=)
{
return ;
}
while (n-->)
{
ret*=n;
}
return ret;
} //求(i+j+k)!/(i!*j!*k!) int GetComb(int i,int j,int k)
{
int m = Factorial(i+j+k);
int l = Factorial(i)*Factorial(j)*Factorial(k);
return m/l;
} int NStepFor123(int n)
{
int i=;
int j=;
int p;
int k;
int result=;
for ( i=; i<=n/; i++ )
{
p = n-i*;
for ( j=; j<=p/; j++ )
{
k = p -j*;
//求(i+j+k)!/(i!*j!*k!)
result += GetComb(i,j,k);
}
}
return result;
}
int main(int argc, const char * argv[]) {
// insert code here...
printf("%d",NStepFor123());
return ;
}

此题还可以有另一种方法

f(n) = f(n-1)+f(n-2)+f(n-3),特别地f(0)=1;f(1)=1;f(2)=2;
式子的证明为:增加一步共为f(n+1)的时候,把这新的一步算进去后有三种情况,1是这一步仅当一步走为f(n)次,2是这一步配合原来的最后一步作为两步走为f(n-1)次,3是这一步配合前面的两步作三步走为f(n-2);所以式子f(n+1) =f(n)+ f(n-1)+f(n-2),归纳得证。

int f (int k)
{
int v[]={,,};
long index = -;
if (k<)
{
return ;
} if (k<)
{
return v[k];
} while(k-->)
{
index++;
index %= ;
v[index] = v[]+v[]+v[];
}
return v[index];
}
int main(int argc, const char * argv[]) { printf("%d",f());
return ;
}

奇怪的是两个程序运行结果不一致

调试发现前1~13结果一致。由于第二种O(n)所以应是第一种出现问题。

int Factorial(int n) int 不能装下ret所以出错,把它改成 long型就ok了
代码如下
long Factorial(int n)
{
long ret = n;
if (n<=)
{
return ;
}
while (n-->)
{
ret*=n;
}
return ret;
} //求(i+j+k)!/(i!*j!*k!) double GetComb(int i,int j,int k)
{
double m = Factorial(i+j+k);
double l = Factorial(i)*Factorial(j)*Factorial(k);
return m/l;
} long NStepFor123(int n)
{
int i=;
int j=;
int p;
int k;
long result=;
for ( i=; i<=n/; i++ )
{
p = n-i*;
for ( j=; j<=p/; j++ )
{
k = p -j*;
//求(i+j+k)!/(i!*j!*k!)
result += GetComb(i,j,k);
}
}
return result;
}
int main()
{ printf("%ld",NStepFor123()); return ;
}
但我们发现在32时仍然不相等,说明阶乘运算得出的ret又大于long的取值了,int64_t仍然不够用,所以要用字符串模拟大数(会很麻烦)
所以建议使用第二种也就是递归的方法解决问题。

2016年4月21百度iOS实习生在线笔试题&编程题的更多相关文章

  1. 2014阿里巴巴WEB前端实习生在线笔试题

    2014年3月31日晚,我怀着稍微忐忑的心情(第一次在线笔试^_^!!)进行了笔试.阿里巴巴的笔试题共同拥有10道,差点儿包括了Web前端开发的各个方面,有程序题.有叙述题.时间很紧张,仅仅完毕了大概 ...

  2. 2017百度web前端实习生在线笔试题

    代码: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner s ...

  3. 2016年12月21日 星期三 --出埃及记 Exodus 21:16

    2016年12月21日 星期三 --出埃及记 Exodus 21:16 "Anyone who kidnaps another and either sells him or still h ...

  4. 2016年11月21日 星期一 --出埃及记 Exodus 20:12

    2016年11月21日 星期一 --出埃及记 Exodus 20:12 "Honor your father and your mother, so that you may live lo ...

  5. 2016年10月21日 星期五 --出埃及记 Exodus 19:5

    2016年10月21日 星期五 --出埃及记 Exodus 19:5 Now if you obey me fully and keep my covenant, then out of all na ...

  6. 外企iOS开发的笔试题

    一组外企iOS开发的笔试题,您能回答出来吗?从群里收集来的. (miki西游@mikixiyou的文档,原文链接: http://mikixiyou.iteye.com/blog/1546376  转 ...

  7. QQ群里收集的外企iOS开发的笔试题

    一组外企iOS开发的笔试题,您能回答出来吗?从群里收集来的. 1 why can't NSArray contain NSInteger Instance? with which extra step ...

  8. iOS开发工程师笔试题

    iOS开发工程师笔试题 1.   Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? Object-c的类不可以多重继承:可以 ...

  9. 2016届百度实习生前端笔试题上海卷a

    1.写出javascript运行结果:alert(‘5’+5); 结果:alert()函数中不能进行算术运算或字符串拼接,故不会弹出对话框.   2.写出javascript运行结果:for(var ...

随机推荐

  1. 《ASP.NET MVC 5框架揭秘》样章发布

    今天算是新作<ASP.NET MVC 5框架揭秘>正式上架销售的日子(目前本书在互动网已经到货),为了让更多适合的朋友们能够阅读此书,同时也避免让不适合的读者误买此书,特将此书的样章发布出 ...

  2. floating IP 原理分析 - 每天5分钟玩转 OpenStack(107)

    上一节我们通过 Web UI 创建为 cirros-vm3 分配了浮动 IP,今天将分析其工作原理. 首先查看 router 的 interface 配置: 可以看到,floating IP 已经配置 ...

  3. 出操队形(LIS)

    题目来源:微策略2013年校园招聘面试一面试题 题目描述: 在读高中的时候,每天早上学校都要组织全校的师生进行跑步来锻炼身体,每当出操令吹响时,大家就开始往楼下跑了,然后身高矮的排在队伍的前面,身高较 ...

  4. Oracle11g中数据的倒库和入库操作以及高版本数据导入低版本数据可能引发的问题

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 在10g之前,传统的导出和导入分别使用EXP工具和IMP工具 ...

  5. 模拟QQ聊天系统-安卓源代码

    利用课余时间随便写的一个小东西,都是一起学习. 先上图: package com.example.nanchen.listviewdemo.adapter; import android.conten ...

  6. TP框架执行流程分许

    1. index.php 入口文件 2. ThinkPHP/ThinkPHP.php 在php5.3版本以后 设置常量有两种方式: const name = value; 作用域根据当前命名空间决定 ...

  7. ASP.NET WEB API必知必会:特性路由

    一.什么是特性路由? 特性路由是指将RouteAttribute或自定义继承自RouteAttribute的特性类标记在控制器或ACTION上,同时指定路由Url字符串,从而实现路由映射,相比之前的通 ...

  8. 加入一个线程:join

    在启动一个线程之后调用该线程的join()方法,会使该线程先执行,该线程执行完成后,再执行调用该线程的线程. 例如如下的任务: public class LiftOff extends Thread ...

  9. Redis在windows下安装过程

    一.下载windows版本的Redis 去官网找了很久,发现原来在官网上可以下载的windows版本的,现在官网以及没有下载地址,只能在github上下载,官网只提供linux版本的下载 官网下载地址 ...

  10. C# DataGrid根据某列的内容设置行字体加粗 单元格设置对齐方式

    最近做了个功能,DataGrid显示具体内容的时候,根据某列分组. 每个分组具体内容后边,增加一行显示合计信息. 查询数据时,使用了union all将分组数据与明细数据合并起来,使用了排序达到了预期 ...