1 冒泡排序
将数组按从小到大或者从大到小排序
数组相邻两个数之间比较大小 ,交换位置。将最大或者最小的放在最后一个。 如 4 3 2 1 先从4 开始排序 ,将4排序完 ,再排序3,直到将所有数都排完 ,一共进行3次排序。
例:# define N 某个数
int a[N]
for (int i=0;i<N-1;i++) //进行N-1次排序
{
for(int t=0;t<N-1-i;t++) //
{
if(a[t]>a[t+1]) //如果大于 ,则交换位置
{
int tem;
tem=a[t];
a[t]=a[t+1];
a[t+1]=tem;
}
}
}
2 数组向右移,如1 2 3 4 整体向右移动2位,被顶替的数字移动到数组最前面。 则变成 3 4 1 2
例子:int a[100],n,m; //数组有n个数,向右移m位
for(int i=0;i<m;i++) //控制向右移m位
{
for(int t=n;t>0;t--) //此循环控制数组每次向右移动1位
{
a[t]=a[t-1];
}
a[0]=a[n]; //移动后将溢出的位数赋值给 a[0],即第1个数
}
```
3 求n以内的素数(超暴力法,后面有埃氏筛法);
for(int i=2;i<=n;i++)
{
for(int t=2;t<=i;t++) //测试是否是素数
{
if(i%t==0&&i!=2&&i!=t)break;
if(i==t) //当循环到与i相等时还没有break,则说明是素数
{
b[g]=i;
g++;
}
}
}
4 求n个数中的最大值或者最小值;
先将数存进数组
int max; //设置最大的数
max=[0]; //先从第一个数开始
for(int i=0;i<=n;i++)
{
if(a[i]>max)
{
max=a[i];
}
}
5 当位数过长时,求各个位数的和
可以使用char 或者string定义变量 ,再定义一个int型变量,用于将字符型转化为整数型
原理:由于字符型存储字符都是使用ASCII码来转换的,当转化为int型,相应的字符会转化为其对应的ASCII码 ;例如字符中 数字1 的ASCII码 是49;
转化为int 型时只用减去 48,即可得到整型的数字1;
例如 string a;int b;
a=“1”;
b=a-48;
6 数组行列转换
for(int i=0;i<3;i++)
{
for(int t=i;t<3;t++) //这一步关键
{
int tem;
tem=a[i][t];
a[i][t]=a[t][i];
a[t][i]=tem;
}
}
```
7.埃氏筛法·
int t=0;
int prime[1000]; //记录素数
bool is_prime[1000]; //判断是否是素数
memset(is_prime,true,sizeof(is_prime)); 初始化
is_prime[0]=is_prime[1]=false;
for(int i=2;i<=n;i++)
{
if(is_prime[i])
{
prime[t++]=i;
for(int j=2*i;j<=n;j+=i) // 除去素数的倍数
{
is_prime[j]=false;
}
}
}
8,当数据过多时,存放的数组内,用循环一一对应。
当有连续的 A,B,C时,可以令一个字符变量等于‘A’,后面的字母用 a++
9.判断数组内的某个数 是不是什么东西时,
1.可以再定义一个bool类型的数组与其一一对应,如果对应的那个数 是什么东西,就令对应的bool类型数组为true。 例如a[1] 已经判定是某个特殊数。则令b[1]=true.
2.也可以令 已经判定为特殊数的那个数为bool类型数组的 序列名,如a[1]=20 已经判断为特殊数,则令 b[a[1]]=true;全部判断完毕后用循环将特殊数存放到另一个数组内,如
for(int i=0;i<K;i++)
{
if(b[a[i]])
{
c[time++]=a[i];
}
}
这种算法在特殊情况下,可以提高运行速度。
实例是 pat乙级题,1005.
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
int K;
int n;
cin>>K;
int num[110];//存放数字
bool is[100000];//判断是不是关键数;
memset(is,true,sizeof(is));
for(int i=0;i<K;i++) //输入数据。
{
cin>>num[i];
n=num[i];
while(n!=1)
{
if(n%2==0)n=n/2;
else n=(3*n+1)/2;
is[n]=false;//出现的数,存在数组的序列里
}
}
int time=0;//一共time个关键数。
int real[100];//存关键数
for(int i=0;i<K;i++)
{
if(is[num[i]])
real[time++]=num[i];
}
for(int i=0;i<time-1;i++)//排序。
{
for(int t=0;t<time-i-1;t++)
{
if(real[t]<real[t+1])
{
int tem;
tem=real[t];
real[t]=real[t+1];
real[t+1]=tem;
}
}
}
cout<<real[0];
for(int i=1;i<time;i++)
{
cout<<" "<<real[i];
}
return 0;
}
10.查找数组中相同元素,并将相同的改成空格。
for(int i=0:i<N;i++)
{
for(int t=i+1;t<N;t++)
{
if(a[i]==a[t])a[t]=' '
}
}
11.判断素数
if(n<=0 || n==1) //负数、0和1都不是素数
cout<<"NO"<<endl;
else
{
flag=0;
for(i=2;i<sqrt(n);i++)
{
if(n%i==0)
{
flag++; //
break;
}
}
if(flag==0)
{
cout<<"YES"<<endl;
}
else
{
cout<<"NO"<<endl;
}
12.存到数组,一起输出。
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int gg[100];
int t=0;
while(n--)
{ int sum=0;
int a,b;
cin>>a;
for(int i=1;i<=a;i++)
{
cin>>b;
sum+=b;
}
gg[t++]=sum;
}
cout<<gg[0]<<endl;
for(int i=1;i<t;i++)
{
cout<<endl<<gg[i]<<endl;
}
return 0;
}
13.用函数判断素数。
bool lbj(int a)
{ if(a<=1)
{return false;}
else for(int i=2;i<=sqrt(a);i++)
{
if(a%i==0&&a>=0)
return false;
}
return true;
}
14.将某一字符串的顺序输出 。
先记录要顺序输出的字符串 每个字符的个数,再循环输出。
15.结构体排序,根据结构体中某个变量的值进行排序,结构体中其他东西不变。
例如 struct info
{
int a;
int b;
}stu[3];
stu[1].a=1;stu[1].b=1;
stu[2].a=2;stu[2].b=2;
stu[3].a=3;stu[3].b=3;
bool BIG(info g1,info g2)
{
return g1.b>g2.b;
}
sort (stu,stu+3);
排序后结果是 stu[1].a=3;stu[1].b=3;
stu[2].a=2;stu[2].b=2
stu[3].a=1;stu[3].b=1.