整理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 或 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;
}
数字三角形
#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;
}
数字进制转换
二进制—>十进制
十进制—>二进制
字符串相关
删除字符串中的空格
//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;
}
}
其他小问题
scanf
后 gets
//形似
int n;char srt[10];
scanf("%d",&n);
//getchar(); //解决方法
gets(str); //这里gets不会执行
数组的指针/指针数组的歧义
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
多维数组的指针
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的字符串,内有数字和非数字字符(可能包含空格),将其中连续的数字作为一个整数,计算并输出该字符串中所有整数之和。
错误做法如下:
#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
中.
约瑟夫环
//方法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项之和
输入一个float型的浮点数,将该浮点数所占用的4个字节分别按照整型输出,输出的顺序按照从高字节到低字节的顺序,输出按照%5d的方式输出。
Input
2.3
Output
64 19 51 51