快速排序
快排很容易进入无限递归,写的时候要注意边界问题
#include<iostream>
using namespace std;
int n;
const int N = 1e6 +10;
void qsort(int a[],int l,int r){
if(l>=r) return;
int x=a[l],i=l-1,j=r+1;
while(i<j){
do i++;
while(a[i]<x);
do j--;
while(a[j]>x);
if(i<j) swap(a[i],a[j]);
}
qsort(a,l,j);
qsort(a,j+1,r);
}
int main(){
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++){scanf("%d",&a[i]);}
qsort(a,0,n-1);
for(int i=0;i<n;i++){printf("%d ",a[i]);}
return 0;
}
求前n项分数和
#include<stdio.h>
int main(){
int n=10;
double sum = 0.0;
for (int i = 1; i <= n;i++){
sum += 1.0 / i;
}
printf("f(%d)=%f\n", n, sum);
return 0;
}
//变式
#include<stdio.h>
int main(){
int n=10000;
double sum = 0.0;
int sign = 1;
for (int i = 1; i <= n;i++){
sum += sign*1.0 / i;
sign = -sign;
}
printf("f(%d)=%f\n", n, sum);
return 0;
}
整数分解
#include<stdio.h>
int main(){
int x;
scanf("%d", &x);
x = 12345;
do{
int d = x % 10;
printf("%d", d);
if(x>=10){
printf(" ");//在非最后一轮输出空格
}
x /= 10;
} while (x > 0);
return 0;
}
整数逆序
#include<stdio.h>
int main(){
int x;
scanf("%d", &x);
int t = 0;
do{
int d = x % 10;
t = t * 10 + d;
x /= 10;
} while (x > 0);
printf("t=%d\n", t);
// do{
// int d = x % 10;
// printf("%d", d);
// if(x>=10){
// printf(" ");//在非最后一轮输出空格
// }
// x /= 10;
// } while (x > 0);
return 0;
}
求最大公约数
#include<stdio.h>
int main(){
int a, b;
int t;
a = 12, b = 6;
while (b!=0)
{
t = a % b;
a = b;
b = t;
printf("%d", a);
}
return 0;
}
全排列问题
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
//记录路径
int path[100];
// 记录每一位是否访问
int status[100];
int n;
/*
u是递归层数,a[]是存放待排列数字的数组
*/
void dfs(int u, int a[])
{
if (u == n)
{
for (int i = 0; i < n; i++)
{//输出路径
printf("%d ", path[i]);
}
puts(""); // 每个排列之间的换行
return;
}
for (int i = 0; i < n; i++)
{
if (!status[i])
{
path[u] = a[i];
status[i] = true;
dfs(u + 1, a);
status[i] = false;//恢复现场,回溯
}
}
}
int main()
{
//n是待排列数字的个数
scanf("%d", &n);
int a[n]; // 记录待排列数字
// 输入待排列数字
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
dfs(0, a);
return 0;
}
//没有给定数组长度
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
//记录路径
int path[100];
// 记录每一位是否访问
int status[100];
int n;
/*
u是递归层数,a[]是存放待排列数字的数组
*/
void dfs(int u, int a[])
{
if (u == n)
{
for (int i = 0; i < n; i++)
{//输出路径
printf("%d ", path[i]);
}
puts(""); // 每个排列之间的换行
return;
}
for (int i = 0; i < n; i++)
{
if (!status[i])
{
path[u] = a[i];
status[i] = true;
dfs(u + 1, a);
status[i] = false;//恢复现场,回溯
}
}
}
int main()
{
//n是待排列数字的个数
// scanf("%d", &n);
int a[100]; // 记录待排列数字
// 输入待排列数字
int x;
n=0;
while (cin>>x,x)
{
a[n++] = x;
if(cin.get()=='\n') break;//回车结束循环
}
dfs(0, a);
return 0;
}
选择排序
#include<iostream>
using namespace std;
const int N = 1010;
int a[N];
int n;
void selectSort(){
for (int i = 0; i < n;i++){
int pos = i;
for (int j = i + 1; j < n;j++){
if(a[j]<a[pos])
pos = j;
}
swap(a[i], a[pos]);
}
}
int main()
{
cin >> n;
for (int i = 0; i < n;i++){
cin >> a[i];
}
selectSort();
for (int i = 0; i < n;i++){
cout << a[i] << " ";
}
return 0;
}
蜜蜂路线
#include <cstdio>
int main(){
long long f[105];
f[1]=1;
f[2]=2;
for(int i=3;i<=100;i++) f[i]=f[i-1]+f[i-2];
int n;
int a,b;
scanf("%d%d",&a,&b);
printf("%lld\n",f[b-a]);
return 0;
}
读写文件
#include<stdio.h>
#include<stdlib.h>
int cmp(const void *a, const void *b)
{
const int *pa = a, *pb = b;
return *pb - *pa; // 逆序比较
}
int main(){
const char *filename = "original.txt";
//打开文件读取数据
//打开文件
FILE *fin;
if((fin=fopen(filename,"r"))==NULL){
perror(filename);
return 1;//读取文件失败
}
//读取数据
int a[1024];
int n = 0;
while ((fscanf(fin,"%d",&a[n])==1))
{
n++;
}
//关闭文件
fclose(fin);
//数据排序
qsort(a, n, sizeof(int), cmp);
//写入文件
//打开文件
FILE *fout;
if ((fout = fopen(filename, "w")) == NULL)
{
perror(filename);
return 2; // 写文件失败
}
//写入数据
for (int i = 0; i < n; i++)
fprintf(fout, "%d\n", a[i]);
//关闭文件
fclose(fout);
return 0;
}
水仙花数
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
bool check(int x){
int sum = 0, y = x;//用y暂存下x的取值
while (x)
{
int t = x % 10;//取个位
x /= 10;//去除末位
sum += t * t * t;
}
return sum == y;
}
int main(){
int m, n;
while (cin>>m>>n,m)//只要有m在输入,循环就会一直执行
{
int cnt = 0;
for (int i = m;i<=n;i++){
if(check(i)){
cout << i << " ";
cnt++;
}
}
if (!cnt)
{
cout << "no";
}
cout << endl;
}
return 0;
}
逆置链栈
#include<stdio.h>
#include<stdlib.h>
typedef char ElementType;
typedef struct SNode *Stack;
struct SNode
{
ElementType Data;
struct SNode *Next;
};
//构建一个堆栈的头结点,返回指针
Stack Create()
{
Stack s;
s = (Stack)malloc(sizeof(struct SNode));
s->Next = NULL;
return s;
}
int IsEmpty(Stack s)
{
return (s->Next == NULL);
}
void Push(ElementType item,Stack s)
{
struct SNode *temp;
temp = (Stack)malloc(sizeof(struct SNode));
temp->Data = item;
temp->Next = s->Next;
s->Next = temp;
}
//删除并返回堆栈s的栈顶元素
ElementType Pop(Stack s)
{
struct SNode *temp;
ElementType topElem;
if(IsEmpty(s)){
printf("堆栈空");
return NULL;
}else
{
temp = s->Next;
s->Next = temp->Next;
topElem = temp->Data;
free(temp);
return topElem;
}
}
void PrintStack(Stack s){
if(s==NULL){
printf("栈不存在\n");
return;
}
//s = s->Next;
while (!IsEmpty(s))
{
printf("%c", Pop(s));
}
printf("\n");
}
int main(){
Stack s;
s=Create();
char c;
int i=0;
for(i=0;i<10;i++)
{
scanf("%c",&c);
Push(c,s);
}
PrintStack(s);
return 0;
}
求1000以内的完数
//注意别把本身当成因子
#include<stdio.h>
int check(int x){
int t = x;
int i;
int sum = 0;
for (i = 1; i < x;i++)
{
//找x的因数
if(x%i==0)
{
sum += i;
}
}
if(sum==t)
return 1;
return 0;
}
int main()
{
int i;
for (i = 1; i <= 1000;i++)
{
if(check(i))
printf("%d ", i);
}
return 0;
}
冒泡排序
#include<iostream>
using namespace std;
int main(){
int n;
cin >> n;
int a[n];
for (int i = 0; i < n;i++){
cin >> a[i];
}
for (int i = 0; i < n - 1;i++)
{
for (int j = 0; j < n - i - 1; j++)
{
if(a[j]>a[j+1])
swap(a[j], a[j + 1]);
}
}
for (int i = 0; i < n;i++)
{
cout << a[i] << " ";
}
return 0;
}
2811

被折叠的 条评论
为什么被折叠?



