1.选择问题,设有一组N个数要确定其中第K个最大者
为了方便,使用了容器vector工具,但是排序时没有使用容器内的sort函数,而是重新写了选择排序法
算法首先对前k个元素进行排序,然后再将剩下的元素逐个读入,当新的元素被读到时,如果小于数组中第k个元素则进行忽略,否则放到正确的位置上,并将数组中的一个元素挤出数组。当算法终止时,位于第k个位置上的元素作为答案进行返回。
完成代码如下所示:
//从一组N个数中确定其中第k个最大者
#include <iostream>
#include <vector>
using namespace std;
int chooseK(vector<int>srcNum,int k);
int main()
{
vector<int> a = {10,29,23,65,17,81,40,9,10,34,56};
int K = chooseK(a,6);
cout<< K <<endl;
return 0;
}
int chooseK(vector<int>srcNum,int K)
{
int temp = 0;
vector<int>tempVec;
if(K > srcNum.size())
{
cout<<"输入有误,请检查相关的参数"<<endl;
return 0;
}
else
{
for (int i = 0; i < K - 1; i++)
//对一开始K个数据进行排序
{
for (int j = i + 1; j < K; j++) {
if (srcNum[i] < srcNum[j]) {
temp = srcNum[i];
srcNum[i] = srcNum[j];
srcNum[j] = temp;
}
}
}
//使用tempVect用来保存前K个排好序的数字
for(int i = 0;i<K;i++)
{
int a = srcNum.at(i);
tempVec.push_back(a);
}
for(int p = K;p<srcNum.size();p++)
{
//外层循环遍历原容器中K之后的数值
if(tempVec.at(K-1)>srcNum.at(p))
//如果第K位大于要比较的数值,则直接进入下一次循环
{
continue;
}
for(int j = 0;j<K;j++)
{
//内层循环遍历tempVect中的K个数值
if(srcNum.at(p) > tempVec.at(j))
{
for(int m = K-1;m>j;m--)
{
tempVec[m] = tempVec[m-1];
}
tempVec.at(j) = srcNum.at(p);
break;
}
}
}
}
return tempVec.at(K-1);
}
1.5
题目:
编写一种递归方法,它用来返回数字N的二进制表示中1的个数,利用这样的事实:如果N是奇数,那么它1的个数等于N/2的二进制表示中1的个数加1
代码如下所示:
#include <iostream>
using namespace std;
int howManyOnes(int N);
int main()
{
int N;
cout<<"请输入一个整数:";
cin>>N;
cout<<"这个整数的二进制表示中包含"<<howManyOnes(N)<<"个1"<<endl;
return 0;
}
int howManyOnes(int N)
{
if(N <= 2)
return 1;
else
return N % 2 + howManyOnes(N/2);
}
1.6
编写带有下列声明的两个例程:
void permute(const string & str);
void permute(const string & str, int low, int high);
第一个例程是驱动程序,它调用第二个例程并显示string str 中的字符的所有排列。
如果str是“abc”则输出的那些字符串则是abc,acb,bac,bca,cab,cba
注意,第二个例程要使用递归(recursion)
先给出具体程序如下所示:
#include <iostream>
using namespace std;
void permute(const string & str);
void permute(const string & str,int low,int high);
int main()
{
string str = "abc";
permute(str);
return 0;
}
void permute(const string & str)
{
permute(str,0,str.length()-1);
}
void permute (const string & str,int low,int high)
{
string str1 = str;
if(low == high)
{
cout<<str1<<" ";
}
else
{
for(int i = low;i <= high;i++)
{
swap(str1[low],str1[i]);
permute(str1,low+1,high);
swap(str1[low],str1[i]);
}
}
}
算法的主要思想是将abc 分解成a|bc,再用递归思想求bc得全排列,以此类推。
1.10
题目:估算2^100(mod5)数值
2^100 = (2^10)^10 所以最后一位是6.。。。。
所以余数是1
利用python进行验证(这种情况pyhton具有没有数值类型的优势。。。)
在python环境下输入 2**100 可以得到计算结果为 1267650600228229401496703205376
所以余数是1