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