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;
}
}