目录
整理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)
判断数字位数
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
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;
}
数字三角形
#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;
}
杨辉三角
弗洛伊德三角
#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;
}
数字进制转换
二进制—>十进制
十进制—>二进制
其他小问题
scanf
后 gets
//形似
int n;char srt[10];
scanf("%d",&n);
//getchar(); //解决方法
gets(str); //这里gets不会执行