Online judge笔记

(注:本文章有部分代码及资料来源于其他作者,本文章只用作笔记整理,无商业用途,谢谢)

1.进制转换

%d 有符号10进制整数

%i 有符号10进制整数

%o 无符号8进制整数

%u 无符号10进制整数

%x 无符号的16进制数字,并以小写abcdef表示

%X 无符号的16进制数字,并以大写ABCDEF表示

%F/f 浮点数

%E/e 用科学表示格式的浮点数

%g 使用%f和%e表示中的总的位数表示最短的来表示浮点数 G 同g格式,但表示为指数

%c 单个字符

%s 字符串
 

2.大小写字母转换

 大写字母ascii码+32

3.%9.2f表示输出场宽为9的浮点数,其中小数位为2,整数位为6

对浮点数,若整数部分位数超过了说明的整数位宽度,将按实际整数位输出;若小数部分位数超过了说明的小数位宽度,则按说明的宽度以四舍五入输出。

4.利用Π先定义

#define PI 3.1415926

5.求三角函数

#include<math.h>//头文件
//角度转弧度 π/180×角度;弧度变角度 180/π×弧度
cos(弧度)

6.switch的使用

#include <stdio.h>
 
int main(){
    double x,y,z;
     
    char op;
    scanf("%lf%c%lf",&x,&op,&y);
    switch(op){
        case '+': 
            z = x+y;
            break;      
        case '-':
            z = x-y;
            break;
        case '*':
            z = x*y;
            break;
        case '/':
            z = x/y;
            break;
    }   
    printf("%f%c%f=%f\n",x,op,y,z);
     
    return 0;
}

7.求最大公约数

#include<stdio.h>
int G(int A,int B)
{
    if(B==0)
    return A;
    else
    return(B,A%B);
}//函数形式
int main()
{
   int a,b,t;
   while (b!=0)
   {
     t=b;
     b=a%b;
     a=t;
   } 
   printf("%d",a);//循环形式
}

8.求最小公倍数

  实际上就是两个数的乘积再除以他们的最大公约数

  例如求a,b的最小公倍数=a*b/a与b的最大公约数

9.求数比较小的阶乘的时候可以用递归实现

#include <stdio.h>
#define MOD 10007
 
int f(int n){
    if(n==0) return 1;
    return f(n-1)*(n%MOD)%MOD;
}
 
int main(){
    int n;
    scanf("%d",&n);
    printf("%d\n",f(n));
     
    return 0;
}       

10.素数

   常用埃氏筛

#include<stdio.h>
#define N 100000;
int B[100000]={0};

int main()
{ 
    int i,j;
    B[0]=0;
    B[1]=0;
    for(i=2;i<=N;i++)
    {
        if(!B[i])
        {
            for(j=i*i;j<=N;j+=i)
            {
                B[j]=1;
            }
        }
    }//1是质数,0是非质数



}

11.字母塔

采用循环

#include <stdio.h>
 
int main(){
    char c,t;
    int i,j,n;
    while((c=getchar())!=EOF){
        getchar();  //read return key
        n = c-'A'+1;
        for(i=0;i<n;i++){
            for(j=0;j<n-i-1;j++) putchar(' ');
            for(j=0,t='A';j<i+1;j++,t++) putchar(t);
            for(j=0,t-=2;j<i;j++,t--) putchar(t);
            putchar('\n');
        }
    }
    return 0;
}   

13.质因数分解

#include<stdio.h>
#include<math.h>
int main()
{
    int n,m,i,j,sum;
    while(scanf("%d",&n)!=EOF)
    {
        
        for(i=2;i<=sqrt(n);i++)
        {   
            sum=0;
            m=n;
            while(n%i==0)
            {
                n/=i;
                sum++;
            }
            if(m%i==0) 
            {
            printf("%d",i);
            if(sum>1) printf("^%d",sum);
            if(i<=n) printf("*");
            }
             
        }
        if(n>1) printf("%d",n); 
        printf("\n");
    }
    return 0;
}

14.组合数

用杨辉三角

#include<stdio.h>
int B[101][101];
int main()
{
    int i,j;
    B[0][0]=1;
    B[1][1]=1;
    B[1][0]=1;
    for(i=2;i<=100;i++)
    {
        B[i][0]=1;
        B[i][i]=1;
        for(j=1;j<i;j++)
        {
           B[i][j]=B[i-1][j-1]+B[i-1][j];
        }
    }
}

15.判断闰年

#include <stdio.h>
 
int main(){
    int y;
     
    scanf("%d",&y);
    if(y%400==0||y%100!=0&&y%4==0) puts("Yes");
    else puts("No");
     
    return 0;
}

16.几个比较常用的排序

(1)qsort排序

  • 对int的排序

?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
int less(const void *a,const void *b){
    int *pa,*pb;
    pa = (int *)a;
    pb = (int *)b;
    return *pa - *pb;   
}
 
int greater(const void *a,const void *b){
    int *pa,*pb;
    pa = (int *)a;
    pb = (int *)b;
    return *pb - *pa;
}
 
void prt(int *a,int n){
    int i,j;
    for(i=0;i<n;i++) printf("%d ",a[i]);
        printf("\n");
     
}
 
int main(){
    int a[10]={3,7,2,5,3,8,1,7,4,3};
    prt(a,10);
    qsort(a,10,sizeof(int),less);
    prt(a,10);
    qsort(a,10,sizeof(int),greater);
    prt(a,10);
     
    return 0;
}

对double排序

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#define EPS 1e-6
 
int less(const void *a,const void *b){
    double *pa,*pb;
    pa = (double *)a;
    pb = (double *)b;
    if(fabs(*pa-*pb) < EPS) return 0;
    if(*pa-*pb >=EPS) return 1;
    return -1;  
}
 
int greater(const void *a,const void *b){
    double *pa,*pb;
    pa = (double *)a;
    pb = (double *)b;
    if(fabs(*pa-*pb) < EPS) return 0;
    if(*pa-*pb >=EPS) return -1;
    return 1;   
}
 
void prt(double *a,int n){
    int i;
    for(i=0;i<n;i++) printf("%.2f ",a[i]);
        printf("\n");
     
}
 
int main(){
    double a[10]={1.3,1.7,1.2,1.5,2.3,1.8,1.1,2.7,1.4,3.3};
    prt(a,10);
    qsort(a,10,sizeof(double),less);
    prt(a,10);
    qsort(a,10,sizeof(double),greater);
    prt(a,10);
     
    return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
 
int less(const void *a,const void *b){
    char *pa,*pb;
    pa = (char *)a;
    pb = (char *)b;
    return strcmp(pa,pb);
}
 
int greater(const void *a,const void *b){
    char *pa,*pb;
    pa = (char *)a;
    pb = (char *)b;
    return strcmp(pb,pa);
}
 
void prt(char (*a)[20],int n){
    int i;
    for(i=0;i<n;i++) puts(a[i]);
    printf("\n");
}
 
int main(){
    char a[10][20]={"Hello","Hell","Her","He","His","Hers","Helm","Heat","Heal","Heap"};
    prt(a,10);
    qsort(a,10,sizeof(a[0]),less);
    prt(a,10);
    qsort(a,10,sizeof(a[0]),greater);
    prt(a,10);
     
    return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
#define N 4
 
int less(const void *a,const void *b){
    int *pa,*pb,i;
    pa = (int *)a;
    pb = (int *)b;
    for(i=0;i<N&&*pa==*pb;i++,pa++,pb++);
    if(i==N) return 0;
    else return *pa - *pb;  
}
 
int greater(const void *a,const void *b){
    int *pa,*pb,i;
    pa = (int *)a;
    pb = (int *)b;
    for(i=0;i<N&&*pa==*pb;i++,pa++,pb++);
    if(i==N) return 0;
    else return *pb - *pa;
}
 
void prt(int (*a)[N],int n){
    int i,j;
    for(i=0;i<n;i++){
        for(j=0;j<N;j++) printf("%d ",a[i][j]);
        printf("\n");
    }
    printf("\n");
}
 
int main(){
    int a[5][N]={{1,7,3,4},{1,5,4,3},{2,5,3,7},{2,5,3,8},{1,7,4,3}};
    prt(a,5);
    qsort(a,5,sizeof(a[0]),less);
    prt(a,5);
    qsort(a,5,sizeof(a[0]),greater);
    prt(a,5);
     
    return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
struct node{
    int x,y;
};
 
int less(const void *a,const void *b){
    struct node *pa,*pb;
    pa = (struct node*)a;
    pb = (struct node*)b;
    if(pa->x == pb->x) return pa->y - pb->y;
    else return pa->x - pb->x;    
}
 
int greater(const void *a,const void *b){
    struct node *pa,*pb;
    pa = (struct node*)a;
    pb = (struct node*)b;
    if(pa->x == pb->x) return pb->y - pa->y;
    else return pb->x - pa->x;    
}
 
void prt(struct node *p,int n){
    int i;
    for(i=0;i<n;i++) printf("%d %d\n",p[i].x,p[i].y);
    printf("\n");
}
 
int main(){
    struct node a[5]={{1,2},{2,3},{1,3},{2,5},{1,7}};
    prt(a,5);
    qsort(a,5,sizeof(struct node),less);
    prt(a,5);
    qsort(a,5,sizeof(struct node),greater);
    prt(a,5);
     
    return 0;
}

2)冒泡排序【比较注重过程】

#include <stdio.h>
#define N 100
 
int main(){
    int a[N],n,i,j,k,t;
    scanf("%d",&n);
    for(i=0;i<n;i++) scanf("%d",a+i);
    for(i=0;i<n-1;i++){
        for(j=i;j<n-1;j++) if(a[j]<a[j+1]){
            t = a[j];
            a[j] = a[j+1];
            a[j+1] = t;
        }
        t = a[i];
        a[i] = a[j];
        a[j] = t;       
    }
    for(i=0;i<n-1;i++) printf("%d ",a[i]);
    printf("%d\n",a[i]);
    return 0;   
}

17.两个矩形相交面积

#include <stdio.h>
#include <math.h>

int main() {
    int k;
    double x[5], y[5];
    double x1, x2, y1, y2, s1, s2, x3, y3;
    scanf("%d", &k);
    while (k--) {
        for (int i = 0; i < 4; i++)
            scanf("%lf%lf", x + i, y + i);
        x1 = (x[1] + x[0]) / 2;
        x2 = (x[3] + x[2]) / 2;
        y1 = (y[1] + y[0]) / 2;
        y2 = (y[3] + y[2]) / 2;
        s1 = abs(x[1] - x[0]) + abs(x[3] - x[2]);
        s2 = abs(y[1] - y[0]) + abs(y[3] - y[2]);
        if (abs(x1 - x2) < s1 / 2 && abs(y1 - y2) < s2 / 2)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}

18.常用函数

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int putchar(int ch);
 /*putchar输出一个char*/
 int getchar(void);
/*getchar是从标准输入设备读取一个char。*/
char *gets(char *s);
/*功能:从标准输入读入字符,并保存到s指定的内存空间,直到出现换行符或读到文件结尾为止。
参数:
    s:字符串首地址
返回值:
    成功:读入的字符串
    失败:NULL
*/  
int puts(const char *string);
/*功能:标准设备输出s字符串,在输出完成后自动输出一个'\n'。
参数:
    s:字符串首地址
返回值:
    成功:非负数
    失败:-1
*/
size_t strlen(const char *s);
/*功能:计算指定指定字符串s的长度,不包含字符串结束符‘\0’
参数:
s:字符串首地址
返回值:字符串s的长度,size_t为unsigned int类型
*/

/*char *strcpy(char *dest, const char *src);
功能:把src所指向的字符串复制到dest所指向的空间中,'\0'也会拷贝过去
参数:
    dest:目的字符串首地址
    src:源字符首地址
返回值:
    成功:返回dest字符串的首地址
    失败:NULL
注意:此函数不是一个安全的函数,因为没有指定copy的大小,可能会造成越界。推荐使用strcpy_s(char *dest,size_t size,const char *src)
*/
int strcmp(const char *s1, const char *s2);
/*功能:比较 s1 和 s2 的大小
参数:
    s1:字符串1首地址
    s2:字符串2首地址
返回值:
    相等:0
    大于:>0
    小于:<0
*/  
char *strcat(char *dest, const char *src);
/*功能:将src字符串连接到dest的尾部,‘\0’也会追加过去
参数:
    dest:目的字符串首地址
    src:源字符首地址
返回值:
    成功:返回dest字符串的首地址
    失败:NULL
*/
char *strstr(const char *haystack, const char *needle);
/*功能:在字符串haystack中查找字符串needle出现的位置
参数:
    haystack:源字符串首地址
    needle:匹配字符串首地址
返回值:
    成功:返回第一次出现的needle地址
*/
char *strtok(char *str, const char *delim);
/*功能:来将字符串分割成一个个片段。当strtok()在参数s的字符串中发现参数delim中包含的分割字符时, 则会将该字符改为\0 字符,当连续出现多个时只替换第一个为\0。
参数:
    str:指向欲分割的字符串
    delim:为分割字符串中包含的所有字符
返回值:
    成功:分割后字符串首地址
    失败:NULL
注意:在第一次调用时:strtok()必需给予参数s字符串
往后的调用则将参数s设置成NULL,每次调用成功则返回指向被分割出片段的指针
void *memset(void *s, int c, size_t n);
/*功能:将s的内存区域的前n个字节以参数c填入
参数:
    s:需要操作内存s的首地址
    c:填充的字符,c虽然参数为int,但必须是unsigned char , 范围为0~255
    n:指定需要设置的大小
返回值:s的首地址
*/
void *memcpy(void *dest, const void *src, size_t n);
/*功能:拷贝src所指的内存内容的前n个字节到dest所值的内存地址上。
参数:
    dest:目的内存首地址
    src:源内存首地址,注意:dest和src所指的内存空间不可重叠
    n:需要拷贝的字节数
返回值:dest的首地址
*/
————————————————
版权声明:本文为CSDN博主「光明益生菌」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34192115/article/details/80320447
————————————————
版权声明:本文为CSDN博主「光明益生菌」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34192115/article/details/80320447

19.Fibonacci数

#include <stdio.h>
//fib(48) overflow int 
#define N 48
int f[N]={1,1};
 
int fib(int n){
    if(f[n]) return f[n];
    f[n] = fib(n-1)+fib(n-2);
    return f[n];
}
 
 
int main(){
    int n;
 
    scanf("%d",&n);
    printf("%d",fib(n));
 
    return 0;
}       

动态规划(重要)

(1)备忘录法(自上而下)

public static int Fibonacci(int n)
{
		if(n<=0)
			return n;
		int []Memo=new int[n+1];		
		for(int i=0;i<=n;i++)
			Memo[i]=-1;
		return fib(n, Memo);
	}
	public static int fib(int n,int []Memo)
	{
		
		if(Memo[n]!=-1)
			return Memo[n];
	//如果已经求出了fib(n)的值直接返回,否则将求出的值保存在Memo备忘录中。				
		if(n<=2)
			Memo[n]=1;
		
		else Memo[n]=fib( n-1,Memo)+fib(n-2,Memo);	
		
		return Memo[n];
	}

(2)自底而上

public static int fib(int n)
{
		if(n<=0)
			return n;
		int []Memo=new int[n+1];
		Memo[0]=0;
		Memo[1]=1;
		for(int i=2;i<=n;i++)
		{
			Memo[i]=Memo[i-1]+Memo[i-2];
		}		
		return Memo[n];
}

20.前缀和(经常会用到)

const int maxn = 1e5+10;
int a[maxn],pre[maxn];
for(int i=1;i<=n;i++){
	pre[i]=pre[i-1]+a[i];//从1到i的累加和,等于从1到(i-1)的累加和,再加上a[i]的值。
}

21.dfs

例子

//问题:有一个100*100的迷宫,告诉你起点终点,以及障碍物的位置,问你至少需要几步从起点走到终点。
这里我们用dfs解决(也可以用bfs解决,bfs是广度优先搜索)。
void dfs(int step,int x,int y){
    if((x,y)是终点,那么step就是最小的答案);
    vis[x][y]=1;
    /**
    这里写往4个方向搜索的代码,如果那个点以前没有访问过,那么就往下搜
    if(......)dfs(step+1,x+1,y);如果这个点不是障碍物,并且以前没有到达过,那么我们就往下走。
    if(......)dfs(step+1,x-1,y);
    if(......)dfs(step+1,x,y+1);
    if(......)dfs(step+1,x,y-1);
    **/
}

22.bfs

struct node{
    int x,y,step;
    node(int x,int y,int step):x(x),y(y),step(step){}
};
void bfs(){
    int vis[100][100]={0};
    queue<int> q;
    q.push(node(起点坐标));
    while(!q.empty()){
        node now = q.front();q.pop();
        vis[now.x][now.y]=1;
        if(now这个点的坐标是终点坐标){ 答案就是now.step; }
        if(......)q.push();如果这个点不是障碍物,并且以前没有到达过,那么我们就压入队列,等待访问。
        if(......)q.push();
        if(......)q.push();
        if(......)q.push();
    }
    如果队列访问空了都没有找到答案,说明无解。
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值