一些常见OJ问题的实现-In-C-Language

整理Oj平台上一些基础问题的实现


宏定义

#define ABS(x) ((x) > 0 ? (x) : -(x))       //绝对值
#define MAX(x, y) (((x) > (y)) ? (x) : (y)) //两个数最大值
#define MIN(x, y) (((x) < (y)) ? (x) : (y)) //两个数最小值
#define toupper(ch) ((ch) - 'a' + 'A')      //小写转换为大写
#define tolower(ch) ((ch) - 'A' + 'a')      //大写转换为小写
#define SWAP(a,b) {a=a^b; b=a^b; a=a^b;}    //交换两个数值

整数相关

判断一个数是否为整数

//使用fmod对1取模是否为0
float x;
if(fmod(x,1) == 0)
//第二种
float b;
if(b - (int)b == 0)
    

% 运算符
% 只用于整型的计算,后一个数不能是0,参与运算的数据可正可负。

fmod()函数
fmod()函数可以对浮点型数据进行取模运算,后一个数可为0,这时函数返回NaN。

判断数字位数

int length_int(int x)
{
    int count = 0;
    while (x != 0)
    {
        x /= 10;
        count++;
    }
    return count;
}

交换两个数(不使用临时变量)

int a,b; //a=11 b=99
a=a+b;
b=a-b;
a=a-b;   //a=99 b=11

取出数字各位上的数

int figure[1000];
//逆序输出          x 必须为 正数 
int figure_int(int x, int figure[])
{
    for (int i = 0; x > 0; i++)
    {
        figure[i] = x % 10;
        x /= 10;
    }
}              // x =1892               [0]=2 [1]=9 [2]=8 [3]=1

数字倒序输出

int input,output = 0;
    while (input)
    {
        output = output * 10 + input % 10;
        input/=10;
    }
printf("%d",output);

排序算法

冒泡算法

#include <stdio.h>
void bubble_sort(int arr[], int len)
{
    for (int i = 0; i < len - 1; i++)   //外侧循环次数为 len-1 或 len
        for (int j = 0; j < len - 1 - i; j++)   //内循环次数为  len-1-i
        {
            int temp;
            if (arr[j] > arr[j + 1])   //从小到大             升序
            {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
}
int main()
{
    int arr[] = {22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70};
    int len = (int)sizeof(arr) / sizeof(*arr); //  数组长度
    //sizeof测字节长度.
    //short int 字节长  2 , int,long int,float 字节长为4  ,double ,long long int 字长 8
    bubble_sort(arr, len);
    return 0;
}

选择排序

#include <stdio.h>
void selection_sort(int arr[], int len)
{
    for (int i = 0; i < len - 1; i++)     //外侧循环次数为 len-1
        for (int j = i + 1; j < len; j++) //内循环 为 len
        {
            if (arr[i] > arr[j])         //从小到大             升序
            {
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
}
int main()
{
    int arr[] = {22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70};
    int len = (int)sizeof(arr) / sizeof(*arr); //  数组长度
    //sizeof测字节长度.
    //short int 字节长  2 , int,long int,float 字节长为4  ,double ,long long int 字长 8
    selection_sort(arr, len);
    return 0;
}

打印三角形

金字塔 _1

           *
      * * *
    * * * * *
  * * * * * * *
* * * * * * * * *
#include <stdio.h>
int main(void)
{
    int rows;
    scanf("%d", &rows);
    for (int i = 1; i <= rows; i++)
    {
        for (int blank = 1; blank <= rows - i; blank++) //打印空格
        {
            printf("  "); //两个空格               第i行有2*(行数-i)个空格
        }
        for (int k = 0; k != 2 * i - 1; k++) //打印(星号+空格) 1-3-5-7-9...
        {
            printf("* ");
        }
        printf("\n");
    }
    return 0;
}

倒三角形_1

#include <stdio.h>
int main(int argc, char *argv[])
{
    int rows;
    scanf("%d", &rows);
    for (int i = rows; i >= 1; i--)
    {
        //打印空格
        for (int j = 0; j < rows - i; j++)
        {
            printf("  ");
        }
        for (int j = 0; j < 2 * i - 1; j++)
        {
            printf("* ");
        }
        printf("\n");
    }
    return 0;
}

数字三角形

           1
         2 3 2
       3 4 5 4 3
     4 5 6 7 6 5 4
5 6 7 8 9 8 7 6 5
#include <stdio.h>
int main(int argc, char *argv[])
{
    int rows;
    scanf("%d", &rows);
    for (int i = 1; i <= rows; i++)
    {
        //打印空格
        for (int j = 0; j < rows - i; j++)
        {
            printf("  ");
        }
        //左小一半
        for (int k = i; k < 2 * i - 1; k++)
        {
            printf("%d ", k);
        }
        //右大半
        for (int k = 2 * i - 1; k >= i; k--)
        {
            printf("%d ", k);
        }
        printf("\n");
    }
    return 0;
}

杨辉三角

弗洛伊德三角

    1
    2    3
    4    5    6
    7    8    9   10
   11   12   13   14   15
   16   17   18   19   20   21
#include <stdio.h>
int main()
{
    int N;
    scanf("%d", &N);
    int j = 1;
    for (int i = 1; i <= N; i++) //i控制打印行数
    {
        for (int l = 1; l <= i; l++, j++) //l 控制每行打印 l 个数字 
            printf("%5d", j);   //j 为打印出来的数字,实为总共进行循环的次数
        printf("\n");
    }
    return 0;
}

数字进制转换

二进制—>十进制

十进制—>二进制

字符串相关

删除字符串中的空格

百度真的不行,我爱Google,我爱 Stack overflow

//Version 1:
void remove_spaces(char *s)
{
    char *d = s;
    while (*s != 0)
    {
        while (*d == ' ')
        {
            d++;
        }
        *s = *d;
        s++;
        d++;
    }
} // https://stackoverflow.com/questions/1726302/removing-spaces-from-a-string-in-c

//Version 2:
void delete_spaces(char *s)
{
    for (int i = 0, j = 0; s[i] != 0; i++)
    {
        if (s[i] != ' ')
        {
            s[j] = s[i];
            j++;
        }
        s[j] = 0;
    }
} 

其他小问题

scanfgets

//形似
int n;char srt[10];
scanf("%d",&n);
//getchar();        //解决方法
gets(str);   //这里gets不会执行

scanf函数在读取字符以外的输入时,
不接收'\n',把'\n'留存在输入缓冲区中,后面被gets当一个字符接收了;
gets在读入'\n'后就认为字符串结束了,所以你啥也没有看到而向下走了。
解决办法是在gets前加一句getchar(),把那些该死的'\n'从缓冲区中取走.

数组的指针/指针数组的歧义

int* arr1[8];    //declare arr1 as array 8 of pointer to int
int (*arr2)[8];  //declare arr2 as pointer to array 8 of int
int *(arr3[8]);  //declare arr3 as array 8 of pointer to int
int (*a[8])[5];  //a is an array of pointers to integer array of size 5 
char *(*(**foo [][8])())[];  //foo is array of array of 8 pointer to pointer to function returning pointer to array of pointer to char
int (*(*)())();  //foo is a pointer to function returning pointer to function returning int

More

多维数组的指针

int a[i][j];
/*
a      :  指向第 0 行数组地址
a + i  :  指向第 i 行数组地址
*(a + i)        ==> a[i]      : 指向第 i 行首元素地址
*(a + i)+j     ==> &a[i][j]  : 指向第 i 行,第 j 列元素地址
*(*(a + i) + j) ==> a[i][j]   : 第 i 行, 第 j 列的元素
*/

多维字符数组的输出

#include <stdio.h>
int main(void)
{
    char a[3][6] = {"Illlll","Loveoo", "China"};
    puts(a);
    printf("%s", a);
    return 0;
}
//输出
/* IlllllLoveooChina
   IlllllLoveooChina */

不会的题解决掉

输入一个长度小于1000的字符串,内有数字和非数字字符(可能包含空格),将其中连续的数字作为一个整数,计算并输出该字符串中所有整数之和。

例如:输入:B234x7892?2%!tab7654
其中可以组成234、7892、2、7654共4个整数,输出这4个整数之和,为:15782

错误做法如下:

#include <stdio.h>
int main(void)
{
    char a[1000];
    gets(a);
    int sum = 0, sum1 = 0;
    for (int i = 0; a[i]!= 0; i++)
    {
        if (a[i]>='0' && a[i]<='9')
        {
            sum1 = a[i] + sum1 * 10; //Q1 : sum1 = a[i] -'0' + sum1 * 10;
        }
        else
        {
            sum += sum1;
            sum1 = 0;
        }  
    } //Q2 : sum+=sum1;
    printf("%d", sum);
    return 0;
}
  • Q1:字符数组中 数字是 ANSI码 ,变成数字要 a[i]-'0’
  • Q2:字符数组最后要是以数字结尾,最后一个数没有加到 sum中.

约瑟夫环

已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。如

输入:10 3
输出:4

//方法1 : 还不懂
#include <stdio.h>
int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    int f = 0;
    for (int i = 2; i <= n; ++i)
        f = (f + m) % i;
    printf("%d\n", f + 1);
    return 0;
}

公式Sn=1+11+121+1221+12321+123321+1234321+12344321+....,编程计算该公式前n项之和

输入n为:4
则计算前4项之和:1+11+121+1221=1354
所以输出为:1354

输入一个float型的浮点数,将该浮点数所占用的4个字节分别按照整型输出,输出的顺序按照从高字节到低字节的顺序,输出按照%5d的方式输出。

Input
2.3
Output
   64   19   51   51

输入10个2位正整数,按照V形输出

Snipaste_2019-12-22_18_33_44

左侧数据从大到小,右侧数据从小到大;

左侧数据最大值小于等于右侧数据最小值;

每个数据按照 %3d 形式输出。

猜你喜欢

转载自www.cnblogs.com/Delta2019/p/12089778.html
今日推荐