考研复试题目练习(from 牛客网)

本文介绍了如何使用C++实现成绩的稳定排序、利用暴力和优化算法计算整数的约数个数以及使用递归计算阶乘的过程,展示了基础的IT技术在解决实际问题中的应用。
摘要由CSDN通过智能技术生成

1.成绩排序

#include <algorithm>
#include <iostream>
#include <stdio.h>
#include<cstring>
using namespace std;

//成绩排序
//cmp+sort
struct student{
    string name;
    int score;
};
int flag; //升序还是降序
bool cmp(student a,student b)
{
    if(flag==0)return a.score>b.score;
    else return a.score<b.score;
}


int main() {
    int n;//定义学生个数
    while(cin>>n){
        cin>>flag;
        student stu[n];
        for(int i=0;i<n;i++)cin>>stu[i].name>>stu[i].score;
        stable_sort(&stu[0],&stu[n],cmp);//稳定排序
        for(int i=0;i<n;i++)cout<<stu[i].name<<" "<<stu[i].score<<endl;
    
    }
    return 0;
}

2.约数的个数

输入n个整数,依次输出每个数的约数的个数

开始就用的暴力算法,然后超时了 

#include <iostream>
using namespace std;


int main() {
    int n;
    while (true) { // 注意 while 处理多个 case
        cin>>n;
        int a[n],b[n];//b[n]用于存储约数的个数
        for(int i=1;i<=n;i++){
            cin>>a[i];
            b[i]=0;
            for(int j=1;j<=i;j++){
                if(a[i]%j==0) b[i]++;
            }   
        }
        for(int i=1;i<=n;i++){
            cout<<b[i];
        }
       

    }
}

用下面的方法小于根号n,如果有约数,则大于根号n也一定有一个约数;如果n可以开根号,比如16,则4*4=16,但只算一次。(下面这种结构化的代码,更加清晰明了,实现的功能用一个函数来实现)

#include <iostream>
using namespace std;

int numOfDivisor(int num)
{
    int ans=0;
    int i;
    for(i=1;i*i<num;i++){
        if(num%i==0)ans+=2;
        if(i*i==num)ans++;
    }
    return ans;
}
int main() {
    int n,num;
    while (cin>>n) { 
        for(int i=0;i<n;i++)
        {
            cin>>num;
            cout<<numOfDivisor(num)<<endl;
        }
    }
    return 0;
}

3.阶乘

用了递归算法,这里要注意long long 

#include <iostream>
using namespace std;

long long int function_(int n){ //本来没加long long 只有13组用例可以通过
    if (n==0||n==1) return 1;
    else return n*function_(n-1);

}
int main() {
    int n;
    while (cin >> n) { // 注意 while 处理多个 case
        cout <<function_(n)<< endl;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值