求教一道知名通信公司笔试题目?
发布网友
发布时间:2022-07-14 15:04
我来回答
共2个回答
热心网友
时间:2023-09-28 08:00
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int print(int i,int l,string s,ofstream& fout)
//i是第几轮, l是剩下的环数, s是之前的纪录, fout是文件输出流
{
if(i==10 && l == 0) //如果是第十轮且剩下的环数是0,就输出记录.
{
cout << s << endl;
fout << s << endl;
return 1;
}
else if(i == 10) return 0; //如果到第十轮还没到90环就返回0
if((double)l/(10-i)>10) return 0; //如果在剩下的轮数不可能到达90环,就返回0
int sum = 0;
for(int j=0;j<=10 && l-j>=0;j++) //在本轮中从0到10进行循环递归...
{
string temp = s; //新纪录 == 旧记录
char t = j+'0';
if(j==10) temp += "10"; //新纪录添加10
else temp += t; //新纪录添加t
temp += " ";
sum += print(i+1,l-j,temp,fout); //递归
}
return sum;
}
int main()
{
ofstream fout("result.txt");
int i = print(0,90,"",fout);
cout << "There are total " << i << " ways to get 90 points.\n";
fout << "There are total " << i << " ways to get 90 points.\n";
fout.close();
system("pause");
}
编译运行的话,会生成"result.txt".里面保存有所有的排列可能...一共92378种可能....
看不懂啊?这个只是利用的函数递归来实现的...
如果你重视运行时间的话...那就循环好了....不过这样代码的可读性就下降了...我的时间长可能还因为使用的string,如果用char* 应该还是挺快的...
热心网友
时间:2023-09-28 08:01
最简单的方法就是十重循环,每重0到10枚举,加入适当的剪枝