一些测试时候的入门小习题,不做解说,有问题请评论
字符串逆序排列1
目录
/*数组字符反向(递归)(1)*/
#include<stdio.h>
int num = 0;
int times = 1;
int reverse_string(char* string)
{
char arr = '0';
if (*string == '\0')
return 0;
else
{
times++;
num = 1 + reverse_string(string + 1);
times--;
}
if (times < num)
{
arr = *string;
* string = *(string + num - times);
*(string + num - times) = arr;
}
return num;
}
int main()
{
char arr[] = "abcdef";
printf("%s\n", arr);
reverse_string(arr);
printf("%s\n", arr);
return 0;
}
字符串逆序排列2
/*数组字符反向(递归)(2)*/
#include<stdio.h>
int reverse_string(char* string)
{
char arr;
char* s;
s = string;
while (*s != '\0')
{
s++;
}
arr = *string;
*string = *(s - 1);
*(s - 1) = '\0';
if(string<(s-2))//说明还有至少两个元素没有替换
reverse_string(string + 1);
*(s - 1) = arr;//之间*(s-1)替换'\n',现在替换回来,期间用arr保存
}
int main()
{
char arr[] = "abcdef";
printf("%s\n", arr);
reverse_string(arr);
printf("%s\n", arr);
return 0;
}
冒泡法比大小
/*冒泡法比大小*/
#include <stdio.h>
#define LEN 3
void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void loopsort1(int len, int * arr)
{
int i = 0,j = 0;
for (i = 0; i < len - 1; ++i) {
for (j = 0; j < len - 1 - i; ++j) {
if ( arr[j] > arr[j+1]) {
swap(&arr[j], &arr[j + 1]);
}
}
}
}
int main()
{
int arr[LEN] = { 0 };
int len = 0, i ,j;
len = sizeof(arr) / sizeof(*(arr));
for (i = 0; i < len; ++i)
{
scanf("%d", arr + i);
}
loopsort1(len, arr);
for (j = len - 1; j >= 0; --j)
{
printf("%d ", arr[j]);
}
return 0;
}
迭代法求最大公约数
/*求两个数的最大公约数*/
#include<stdio.h>
void swap(int* a, int* b)//定义指针变量,表明这个变量指向地址,形参为a并非*a
{
int temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int num1 = 0, num2 = 0, temp = 0;
scanf("%d %d", &num1,&num2);
if (num1 < num2)
{
swap(&num1, &num2);
}
temp = num1 % num2;
while(temp!=0)
{
num1 = num2;
num2 = temp;
temp = num1 % num2;
}
printf("最大公约数为%d\n",num2);
return 0;
}
遍历法求素数(1-根号n)
/*打印素数*/
#include<stdio.h>
#include<math.h>
int primenum(int a)
{
int k=0,i=0;
k = (int)sqrt((double)a) + 1;
for (i = 2; i < k; i++){
if (a % i == 0)
return 0;
}
return 1;
}
int main()
{
int i = 100,a=0;
printf("打印100~200之间的素数:\n");
for (i = 100; i <= 200; ++i){
if (primenum(i) == 1){
printf("%-4d", i);
a++;
if (a % 10 == 0) {
printf("\n");
a = 0;
}
}
}
return 0;
}
字符的向中移动
/*延时字符的两端向中间移动*/
#include<stdio.h>
#include<string.h>
#include<windows.h>
int main()
{
char arr1[] = "hello bite!";
char arr2[] = "###########";
int size = 0;
int left = 0, right = 0, i = 0;
size = sizeof(arr2) / sizeof(arr1[0]);//size=strlen(arr1);//用sizeof包含了\n strlen不包括\n
right = size - 2;
while (left <= right)
{
printf("%s", arr2);
arr2[left] = arr1[left];
arr2[right] = arr1[right];
sleep(1000);//vs提供的函数,单位为ms
system("cls");
left++;
right--;
}
return 0;
}
求10个整数的最大值
/*求10整数中的最大值*/
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
int loop(int* arr,int n,int *p1)//arr为数组首地址,n为数组元素数量,num
{
int i=0;
int max = 0;
int flag=0;
for (i =0;i<n-1;i++){
if (arr[i] > arr[i + 1]){
arr[i + 1] = arr[i];
flag++;//判断右边是否连续小于左边
if (flag == 1) {
*p1 = i;//右边小于左边,指针固定为左边
}
else;
}else {
*p1 = i + 1;//右边大于左边,指针右移
flag = 0;
}
}
return arr[9];//返回最大值
}
int main()
{
int *num = 0;//数组下标
int* p = #//指向数组下标的指针
int arr1[10] = {0};//存储随机数的数组
int i = 0;
int max = 0;//最大值
int ch = 0;//读取getchar
srand((unsigned)time(NULL));
while ((ch=getchar())!=EOF)//循环测试 ctrl+Z结束
{
for (i = 0; i < 10; ++i)
{
arr1[i] = rand() % 100;
printf("arr[%d]=%-4d", i, arr1[i]);
if (i == 9)
printf("\n");
}//打印随机数组
max = loop(arr1, 10, p);//利用loop函数进行数组最大值及对应下标读取
printf("最大值是arr[%d],数值是%4d\n", num, max);//打印最大值及其对应下标;
Sleep(500);//休眠500ms
}
return 0;
}
有序数组查找数字
/*对有序数组进行二分法查找*/
#include<stdio.h>
#include<string.h>
int main()
{
int left = 0, right = 0, num = 0, i = 0, size = 0, mid = 0;
int arr[] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
char ch = 0;
size = sizeof(arr) / sizeof(arr[0]);
right = size -1;
for (i = 0; i < size; i++)
{
printf("arr[%2d]=%-2d ", i, arr[i]);
if (i == (size-1) / 2)
printf("\n");
if (i == size - 1)
printf("\n数组长度为 %d \n", size);
}
printf("请输入要查找的数:\n");
scanf("%d", &num);
while (1)
{
while (left <= right)
{
mid = (left + right) / 2;
if (arr[mid] > num)
{
right = mid - 1;
}
else if (arr[mid] < num)
{
left = mid + 1;
}
else if (arr[mid] == num)
{
printf("找到了,下标是%d\n", mid);
break;
}
}
if (left > right)
printf("找不到\n");
right = size - 1;
left = 0;
printf("请输入要查找的数:\n");
scanf("%d", &num);
if (num == 999)
break;
}
return 0;
}
猜数字小游戏
/*猜数字小游戏*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
void meun1(void)
{
printf("***********************************\n");
printf("********** Guess Number!**********\n");
printf("***********************************\n");
printf("*********** 1.Enter ***********\n");
printf("*********** 2.Exit ***********\n");
printf("***********************************\n");
}
void meun2(void)
{
printf("***********************************\n");
printf("********** Guess Number!**********\n");
printf("***********************************\n");
printf("*******Pleses Input Number!*******\n");
}
void meun3(void)
{
printf("***********************************\n");
printf("*********** 1.Continue ***********\n");
printf("*********** 2.Exit ***********\n");
printf("***********************************\n");
}
char game(void)
{
int select = 0;
do
{
int input = 0;
int temp = 0;
char tem = '0';
Sleep(800);//延时800ms
system("cls");//清空显示界面
meun2();
int result = (int)rand() % 100 + 1;//确保每次进入循环数值都是随机的
do
{
temp=scanf("%d", &input);
while ((tem = getchar()) != '\n');//清空缓冲区
{
;//空语句
}
if (temp==1&&input <= 100 && input >= 0)
{
if (input < result)
{
printf("猜小了\n");
continue;
}
else if (input > result)
{
printf("猜大了\n");
}
else if (input == result)
{
int ret = 0;
printf("********** 恭喜你猜对了!**********\n");
Sleep(800);//延时800ms
do
{
system("cls");//清空显示界面
meun3();
scanf("%d", &select);
switch (select)
{
case 1:
ret = 1;
break;
case 2:
return '2';
default:
printf("输入错误请重试\n");
Sleep(800);//延时800ms
continue;
}
} while (ret==0);
break;
}
}
else
{
printf("非法输入!\n");
break;
}
} while (1);
} while (1);
}
int main()
{
char ch = '0';
srand((unsigned int)time(NULL));//利用time获取时间戳给srand播种随机数
do
{
char temp='0';
meun1();
ch = getchar();
if (temp = getchar() != '\n')
{
printf("输入错误请重试\n");
while ((temp= getchar()) != '\n');//清空缓冲区
{
;//空语句
}
Sleep(800);//延时800ms
system("cls");//清空显示界面
ch = '0';//防止跳出循环
continue;
}
switch (ch)
{
case '1':
printf("游戏开始\n");
ch=game();
break;
case '2':
printf("退出游戏\n");
break;
default:
printf("输入错误请重试\n");
Sleep(800);//延时300ms
system("cls");//清空显示界面
break;
}
} while (ch != '2');
return 0;
}
递归计算斐波那契数列
/*计算斐波那契数列(递归)*/
#include<stdio.h>
int count = 0;
int a = 0;
int b = 1;
int temp = 0;
int fac(int n)
{
if (n == 1)
{
return a;
}
else
{
if (n == 2)
return b;
return fac(n - 1) + fac(n - 2);
}
}
int main()
{
int rez = 0;
int n = 0;
scanf("%d", &n);
printf("%d",fac(n+1));//此次计算数列从0开始
return 0;
}
迭代计算斐波那契数列
/*计算斐波那契数列(非递归)*/
#include<stdio.h>
int fac(int n)
{
int a = 1;
int b = 1;
int temp = 0;
int i = 0;
if (n <= 2)
return 1;
for(i=3;i<=n;++i)
{
temp = a + b;
a = b;
b = temp;
}
return b;
}
int main()
{
int rez = 0;
int n = 0;
scanf("%d", &n);
rez = fac(n);
printf("%d", rez);
return 0;
}
数组转置
/*数组转置*/
#include<stdio.h>
int main()
{
int m = 5;
int n = 2;
float a[5][2] = { {0} ,{0} };
float b[2][5] = { {0} ,{0} };
for (m = 0; m < 5; ++m)
{
for (n = 0; n < 2; ++n)
{
scanf("%f", &a[m][n]);
b[n][m] = a[m][n];
}
}
printf("数组a:\n");
for (m = 0; m < 5; ++m)
{
for (n = 0; n < 2; ++n)
{
printf("%4.2f ", a[m][n]);
}
printf("\n");
}
printf("数组b:\n");
for (n = 0; n < 2; ++n)
{
for (m = 0; m < 5; ++m)
{
printf("%4.2f ", b[n][m]);
}
printf("\n");
}
return 0;
}
青蛙跳台阶(递归)
/*青蛙跳台阶*/
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
int num = 0;
int times = 0;
int fac(int n,int *arr)
{
if (n == 1)
{
num++;//可以作为次数
*arr = 1;
return 1;
}
else if (n == 2)
{
*(arr+1) =1+ fac(1,arr);
num += 2;//可以作为次数
return 1 + fac(1,arr);
}
else
{
if ((*(arr + n - 1)) == 0)
{
*(arr + n - 1) = fac(n - 1, arr) + fac(n - 2, arr);
return *(arr + n - 1);
}//如果执行过这次函数对应位置就不会为0,可以直接出结果不用递归\
空间复杂度加n 时间复杂度减少,具体待计算
else
return *(arr + n -1);
}
}
int main()
{
int n = 0;
int *arr;
scanf("%d", &n);
getchar();
arr = (int*)malloc((n+1) * (sizeof(int)));//申请一个n长度的内存地址
memset(arr, 0,4*(n+1));//清空数组 按照字节清空
printf("%d\n", fac(n, arr));
free(arr);//释放内存
return 0;
}
汉诺塔(递归)
#include<stdio.h>
int i = 0;
void hanoi(int n,char a,char b,char c)//a原始 b目标 c辅助(这个函数就是在\
最后只有一个棋子的时候输出a->b,这\
时侯的a->b并不是真正的a,b柱,二十\
代表了一种操作,这种操作由printf表示
{
i++;
if (n == 1)
printf("%c->%c\n", a, b);
else
{
hanoi(n - 1, a, c, b);//n-1个全部挪到辅助柱上
printf("%c->%c\n", a, b);//第n个从原始挪到目标柱
hanoi(n - 1, c, b, a);//将n-1全部从辅助挪到目标柱子
}
}
int main()
{
int n = 0;
char a = 'a';
char b = 'b';
char c = 'c';
scanf("%d", &n);
hanoi(n, a, b, c);
printf("\n%d", i);
return 0;
}