关于一道简单的C++面试题.....

原题如下:请用递归做出下面题目!
一人打靶,每靶0-10环,共打了10枪,90环,请求出有多少种可能性?想想啊,有没有效率高的方法! 当时看了过后,我想都没想就先直接用多重循环先求出正确答案,然后再用递归,可以写了一个11重循环,运行后根本无法显示结果,查看后,发现循环到第7重时,程序正常,结果也正常,但是到第8重时,程序就无法显示结果了。。。照理说 C 是无限嵌套循环,但是这里怎么出现这样的情况?会不会因为是内存的原因?代码如下:#include <iostream>
using namespace std;main()
{
int a,b,c,d,e,f,g,h,i,j,k;
long n=0;
for(a=0;a<12;a++)
for(b=0;b<12;b++)
for(c=0;c<12;c++)
for(d=0;d<12;d++)
for(e=0;e<12;e++)
for(f=0;f<12;f++)
for(g=0;g<12;g++)
for(h=0;h<12;h++)
for(i=0;i<12;i++)
for(j=0;j<12;j++)
for(k=0;k<12;k++)
if(a+b+c+d+e+f+g+h+i+j+k==90)
n++;
cout<<n;
system("pause");
return 0;

}

昏,打10枪每次也只有中和不中2种情况,不需要循环11次啊
你这样11个循环嵌套,循环11^11次方,你算算要运行多久,大概2500亿次,就算忽略各层的比较所用时间,只计算n++这一句的时间,如果用1个3.0Ghz的cpu,相当于每秒有30亿个时钟周期,就算n++的执行只用一个时钟周期=1/30亿秒,执行完全部循环也要2500/30≈83秒,实际算上各层循环的累加和比较所用的时间,绝对不会在2分钟之内运行完。
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-12-16
楼上Silverbullet说错了,每靶0-10环,所以不能简单地分成中和不中两种情况。
不过楼主这个代码也有问题。
第一,每靶0-10环,所以每个循环的判断条件应该是小于11才对。如果是小于12,就变成是每靶0-11环了。
第二,共打了10枪,但却用了11重循环,应该是10重循环才对。
简单地使用多重循环来写这个代码效率很低,因为有10重循环,每重循环有要运行11遍,也就是11的10次方。如果要进行优化,那么就要在每重循环加上一些判断条件过滤掉不必要的循环,但这样整个代码就会很臃肿,所以这个问题确实很适合用递归来解决。
下面是我写的递归的代码,只需要几十毫秒就可以得出答案。

#include <iostream>using namespace std;int count(int t, int c)
{
int i, n, r = 0;
if(c == 0)
return 1;
if(t == 1)
return c < 11 ? 1 : 0;
if(10 * t < c)
return 0;
--t;
n = c < 10 ? c : 10;
for(i = 0; i <= n; ++i)
r += count(t, c - i);
return r;
}int main()
{
cout << count(10, 90) << endl;
system("pause");
return 0;
}
第2个回答  2013-12-16
都写得比我好

C\/C++经典面试题
面试题 1:变量的声明和定义有什么区别 为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明,但是只在一个地方定义。加入 extern修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分 定义。说明:很多时候一个变量,只是声明不分配内存空间,直到具体使用时才...

关于一道简单的C++面试题...
昏,打10枪每次也只有中和不中2种情况,不需要循环11次啊 你这样11个循环嵌套,循环11^11次方,你算算要运行多久,大概2500亿次,就算忽略各层的比较所用时间,只计算n++这一句的时间,如果用1个3.0Ghz的cpu,相当于每秒有30亿个时钟周期,就算n++的执行只用一个时钟周期=1\/30亿秒,执行完全部...

C\/C++面试题: char x=119; char y=9; char z=x+y; 则z= ?
char x=119; char y=9; char z=x+y;119+9=128,因为是有符号数,所以结果Z的值应该为-128。

c++经典面试题及答案
1. C++的类和C里面的struct有什么区别?struct成员默认访问权限为public,而class成员默认访问权限为private 2. 析构函数和虚函数的用法和作用 析构函数是在对象生存期结束时自动调用的函数,用来释放在构造函数分配的内存。虚函数是指被关键字virtual说明的函数,作用是使用C++语言的多态特性 3. 全局变量...

如何面试c++工程师?
面内容: 三面时面试官的桌子上写着算法工程师,当时直接吓尿,算法蒟蒻表示压力山大,结果出了2道智力题。。。1, 给你2k+1个连续格子,2人下棋,规则是,当一个人在某个格子下子的时候,该棋子左右2边的格子都会被占掉,也就是说不能在这里下棋了,当一个人下子后这个棋盘没有空余位 置则该...

【面试常考题】C++的智能指针
例如,理解如何使用`shared_ptr`和`unique_ptr`,其中前者允许多个智能指针共享同一块内存,后者则禁止复制,仅支持单个拥有者。深入学习这些概念后,你将能更好地应对面试中关于内存管理的问题,提升简历中的技术实力。总而言之,理解并熟练运用智能指针是C++编程中不可或缺的一部分,它能帮助你写出更...

C++经典面试问题
C++经典面试问题分享 1,关于动态申请内存 答:内存分配方式三种: (1)从静态存储区域分配:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。 全局变量,static变量。 (2)在栈上创建:在执行函数时,函数内局部变量的存储单元都可以在栈上创建, 函数执行结束时这些存储单元自动被释放。 栈内存分...

C++大仙帮看看这个面试题?1000的阶乘是多少?有多少个连续的0?
你计算有多少个5这个公因数就好了,只有10以内只有2*5=10,所以除了2,5之外的任何素数的因式组合都不会产生0.所以把你懂的就是求1000-1的所有含有的因子5的个数,因为数字不大很好处理的。这是末尾的零。其它地方就不好说了,不过考察乘法表之后,可以得出其他位置出现连续0的概率是很小的,即使...

[c++面试题]c++关键字override你了解吗?
在C++中覆盖虚拟函数时,建议使用覆盖关键字。不使用override关键字可能导致错误 一个不使用override关键字可能导致错误的例子:在这个例子中,我们有一个基类Base,它有一个虚函数foo(),还有一个派生类Derived,它试图覆盖foo()。然而,派生类的函数foo(int x)的签名与基类的函数foo()不同。这意味着...

挑战C++面试题:到底怎样写出一个无懈可击的strcpy函数?
这样你就遇到【第一个问题】了:如何知道【要拷贝的字符串】结束了(要拷贝的字符串首地址是 from)?对于 from 指针指向的字符串,你可以说字符串有个结束符 '\\0',但这个不是【强制的】。比如 char s1[4];char s2[4] = {'a','b','c','d'}; \/\/ s2 不是一个标准的 C 字符串!st...

相似回答