【C语言】练习题及答案(4月26号及以前)

练习题及其答案:

【4月26号更新】(备忘)

//         day_16

//***********************

//1.递归和非递归分别实现求第n个斐波那契数。

//非递归
#include <stdio.h>

int Fib(int n)
{
    int ret = 1;
    if(n <= 2)
    {   
        return ret;
    }   
    else
    {   
        int i = 0;
        int a = 1;
        int b = 1;

        for(i = 2; i < n; i++)
        {   
            ret = a + b;
            a = b;
            b = ret;
        }   
        return ret;
    }   
}

int main()
{
    int ret = 0;
    ret = Fib(6);
    printf("%d\n", ret);
    
    return 0;
}


//递归
#include <stdio.h>

int Fib(int n)
{
    if(n <= 2 ) 
    {   
        return 1;
    }   
    else
    {   
        return Fib(n - 1) + Fib(n - 2); 
    }   
}

int main()
{
    int ret = Fib(6);
    printf("%d\n", ret);
    return 0;
}

//2.编写一个函数实现n^k,使用递归实现 

//递归
#include <stdio.h>

int Exp(int n , int k)
{
    if((n == 1) || (k == 0)) 
        return 1;
    else if(k >= 1)
        return n * Exp(n, k - 1); 
}

int main()
{
    int ret = Exp(2, 8); 
    printf("%d\n", ret);
    return 0;
}



//3.写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
//递归
#include <stdio.h>

int DigitSum(int n)
{
    if(n/10)
        return (n % 10) + DigitSum(n/10);
    else
        return n;
}

int main()
{
    int ret = DigitSum(12345);
    printf("%d\n", ret);

    return 0;
}


//4.编写一个函数reverse_string(char * string)(递归实现) 
//实现:将参数字符串中的字符反向排列。 
//要求:不能使用C函数库中 
//的字符串操作函数。
//
#include <stdio.h>

void reverse_string(char* str)
{
    if(*str)
    {   
        reverse_string(str+1);
        putchar(*str);
    }   
}

int main()
{
    char str[10] = "hello bit";
    reverse_string(str);
    printf("\n");

    return 0;
}





//5.递归和非递归分别实现strlen 
//递归
#include <stdio.h>
#include <assert.h>

int my_strlen(const char *str)
{
    assert(str != NULL);

    if(*str == '\0')
        return 0;
    else
        return 1 + my_strlen(str + 1); 
}
int main()
{
    int ret = my_strlen("hello bit");
    printf("%d\n", ret);
    return 0;
}

//非递归
#include <stdio.h>
#include <assert.h>

int my_strlen(const char* str)
{
    int count = 0;

    assert(str != NULL);
    while(*str != '\0')
    {   
        count++;
        str++;
    }   

    return count;
}

int main()
{
    int ret = my_strlen("hello bit");
    printf("%d\n", ret);

    return 0;
}

//6.递归和非递归分别实现求n的阶乘
//递归
#include <stdio.h>

int fac(int n)
{
    if(n == 0)
        return 1;
    else if(n >= 1)
        return n * fac(n - 1); 
}

int main()
{
    int ret = fac(5);
    printf("%d\n", ret);
    return 0;
}


//非递归
#include <stdio.h>

int fac(int n)
{
    int ret = 1;

    while(n)
    {   
        ret *= ((n -= 1) + 1); 
    }   
    
    return ret;
}

int main()
{
    int ret = fac(5);
    printf("%d\n", ret);
    return 0;
}



//7.递归方式实现打印一个整数的每一位
//递归
#include <stdio.h>

void print_int(int n)
{
    if(n/10)
    {   
        printf("%d ", n % 10);
        print_int(n / 10);
    }   
    else
        printf("%d\n", n); 
}

int main()
{
    int a = 1234;
    print_int(a);
    return 0;
}







【4月25号更新】(备忘)

//          day_15

//******************

#define _CRT_SECURE_NO_WARNINGS 1

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

//******************
//2.使用可变参数,实现函数,求函数参数的平均值。

int average(int number, ...)
{
	va_list arg;
	int i = 0;
	int sum = 0;
  _crt_va_start(arg, number);
	for (i = 0; i < number; i++)
	{
		sum += _crt_va_arg(arg, int);
	}

	_crt_va_end(arg);
	return sum/number;
}

//******************
//3.使用可变参数,实现函数,求函数参数的最大值

int Max(int number, ...)
{
	va_list arg;
	int i = 0;
	int max = 0;

	_crt_va_start(arg, number);
	max = _crt_va_arg(arg, int);
	for (i = 1; i < number; i++)
	{
		int mid = _crt_va_arg(arg, int);
		if (max < mid)
		{
			int tmp = mid;
			mid = max;
			max = tmp;
		}
	}

	_crt_va_end(arg);
	return max;
}

//******************
//4.1.模拟实现printf函数,可完成下面的功能
// 
//能完成下面函数的调用。 
//print("s ccc d.\n","hello",'b','i','t',100); 
//函数原型: 
//print(char *format, ...) 
// 

void print(const char *str, ...)
{
	va_list arg;

	assert(str != NULL);

	_crt_va_start(arg, str);
	while (*str)
	{
		switch (*str)
		{
		case 'd':
			{
				int i = 0;
				char arr[10] = { 0 };
				int tmp = _crt_va_arg(arg, int);

				_itoa(tmp, arr, sizeof(arr) / sizeof(arr[0]));

				while (arr[i] != '\0')
					putchar(arr[i++]);
			}
			break;
		case 's':
			{
				int i = 0;
				char a[100];
				strcpy(a, _crt_va_arg(arg, char*));
				while (a[i])
				{
					putchar(a[i++]);
				}
			}
			break;
		case 'c':
			{
				char a = _crt_va_arg(arg, char);

				putchar(a);
			}
			break;
		default :
			{
				putchar(*str);
			}
			break;
		}
		str++;
	}
	_crt_va_end(arg);
	return ;
}

int main()
{
	int ave = average(3, 2, 3, 7);
	print("d\n", ave);

	print("s ccc d.\n", "hello", 'b', 'i', 't', 100);

	int max = Max(3, 16, 23, 24);
	print("d\n", max);

	return 0;
}







【4月19号更新】(备忘)

//输入参数price为某件商品的原始价格

//返回值:
//当price为30以下时,不打折,返回原价格
//当price为30 - 90时,打5折
//当price大于90时,打8折
/*
double  discount(double price)
{
	if (price < 30)
	{
		return price;
	}
	else if (price >= 30 && price <= 90)
	{
		return price / 2;
	}
	else
	{
		return price * 0.8;
	}
}


//输入两个数,然后交换他们输出

int a , b;
scanf_s("%d,%d", &a,&b);
printf("你输入了:%d,%d\n", a, b);
printf("程序输出:%d,%d\n", b, a);
return 0;

//输出一个数的立方

double a, b = 0.0;
printf("输入:");
scanf_s("%lf", &a);
b = a*a*a;
printf("输出:%.2lf\n", b);
return 0;

//以年-月-日的形式输出

int years, months, days;
printf("请输入年:");
scanf_s("%d", &years);
printf("请输入月:");
scanf_s("%d", &months);
printf("请输入日:");
scanf_s("%d", &days);
printf("日期为:%04d-%02d-%02d\n", years, months, days);
return 0;

//输出一个数组里的每个数

char eggs[5] = { 7, 7, 8, 10, 3 };
printf("%d,%d,%d,%d,%d\n", eggs[0], eggs[1], eggs[2], eggs[3], eggs[4]);
return 0;

//输出一个整型数组里第一个数和第三个数的和

int arr[3] = { 1, 2, 3 };
int b = arr[0] + arr[2];
printf("%d\n", b);
return 0;

//用7替换数组内的每个数

int arr[3] = { 4, 5, 6 };
for (int i = 0; i < 3; i++)
{
arr[i] = 7;
}
printf("%d,%d,%d\n", arr[0], arr[1], arr[2]);
return 0;

//整形数组中所有元素求和

int  arr[4] = { 12, 32, 22, 98 };
int  sum = 0;
for (int i = 0; i < 4; i++)
{
    sum += arr[i];
}
printf("%d\n", sum);
return 0;

//交换整形数组中的第一,第三个数

int arr[3] = { 4, 5, 6 };
int a = arr[0];
arr[0] = arr[2];
arr[2] = a;
printf("%d,%d\n", arr[0], arr[2]);
return 0;

//将2插入到整型数组的最前面

int arr[4] = { 1, 3, 4 };
arr[3] = arr[2];
arr[2] = arr[1];
arr[1] = 2;
return 0;

//定义一个整形数组,定义一个双精度浮点型数组

int students[13] = { 20130101, 20130102, 20130103, 20130104, 20130105, 20130106, 20130107, 20130108, 20130109, 20130110, 20130111, 20130112, 20130113 };

double scores[13] = { 98.5, 94, 97, 87, 84, 83, 82, 89, 80.5, 78, 76, 73, 73.5 };
return 0;

//定义一个整形数组,然后将他们输出

int numbers[3];

printf("input a number : ");
scanf_s("%d", &numbers[0]);
printf("input a number : ");
scanf_s("%d", &numbers[1]);
printf("input a number : ");
scanf_s("%d", &numbers[2]);
printf("now we have : %d,%d,%d\n", numbers[0], numbers[1], numbers[2]);
return 0;

//定义一个字符型数组 并初始化为{'A', 'E', 'I', 'O', 'U'},然后输出他们的ASCII值

char aaa[6] = { 'A', 'E', 'I', 'O', 'U' };
int i = 0;

for (i = 0; i < 5; i++)
{
    printf("%d\n", aaa[i]);
}
return 0;
//将字符'L'转换成小写'l'
//int main()
//{
//	char  ch = 'L';
//	char  ch2 = 'L' + 32;
//	printf("%c\n", ch2);
//	return 0;
//}

//         day_1
//******************************
//打印100~200之间的素数
//int main()
//{
//
//	int	i,j;
//	int count = 0;
//	for (i = 101; i < 200; i+=2)
//	{
//		for (j = 2; j <sqrt(i); j++)
//		{
//			if (i%j == 0)
//			{
//				break;
//			}
//		}
//		if (i%j != 0)
//		{
//			count++;
//			printf("%d\n", i);
//		}
//	}
//	printf("%d\n", count);
//	return 0;
//}
//


//*****************************
//输出乘法口诀表
//int main()
//{
//	int i = 0;
//	int j = 0;
//	for (i = 1; i < 10; i++)
//	{
//		for (j = 1; j <= i; j++)
//		{
//			printf("%d*%d=%2d   ", i, j, i*j);
//		}
//		printf("\n");
//	}
//	return 0;
//}
//


//*****************************
//判断1000年-2000年之间的闰年
//int main()
//{
//	int i, j;
//	int count = 0;
//	for (i = 1000; i <= 2000; i++)
//	{
//		if (i % 4 == 0 && i % 100 != 0)
//		{
//			count++;
//			printf("%d\n", i);
//		}
//		if (i % 400 == 0)
//		{
//			count++;
//			printf("%d\n", i);
//		}
//	}
//	printf("%d\n", count);
//	return 0;
//}


//         day_2
//*****************************
//给定两个整形变量的值,将两个变量的值进行交换
//
//____________法一______________
//int main()
//{
//	int num1 = 10;
//	int num2 = 20;
//	int num3 = 0;
//	printf("num1 = %d, num2 = %d\n", num1, num2);
//	num3 = num1;
//	num1 = num2;
//	num2 = num3;
//	printf("num1 = %d, num2 = %d\n", num1, num2);
//	return 0;
//}
//
//____________法二______________
//int main()
//{
//	int num1 = 10;
//	int num2 = 20;
//	printf("num1 = %d, num2 = %d\n", num1, num2);
//	num1 += num2;
//	num2 = num1 - num2;
//	num1 = num1 - num2;
//	printf("num1 = %d, num2 = %d\n", num1, num2);
//	return 0;
//}
//
//____________法三______________(这个方法是真的华丽)
//int main()
//{
//	int num1 = 10;
//	int num2 = 20;
//	printf("num1 = %d, num2 = %d\n", num1, num2);
//	num1 = num1^num2;
//	num2 = num1^num2;
//	num1 = num1^num2;
//	printf("num1 = %d, num2 = %d\n", num1, num2);
//	return 0;
//}


//*****************************
//求10个整数中最大值
//
//____________法一______________
//int main()
//{
//	int arr[10] = { 10, 16, 54, 38, 69, 72, 28, 95, 63, 34 };
//	int max = arr[0];
//	for (int i = 1; i < sizeof(arr) / sizeof(arr[0]); i++)
//	{
//		if (max < arr[i])
//		{
//			max = arr[i];
//		}
//	}
//	printf("%d\n", max);
//	return 0;
//}
//
//____________法二______________
//int main()
//{
//	int arr[10] = { 10, 16, 54, 38, 69, 72, 28, 95, 63, 34 };
//	int i = 0;
//	int max = 0;
//	while (i < 9)
//	{
//		if (max < arr[i])
//		{
//			max = arr[i];
//		}
//		i++;
//	}
//	printf("%d\n", max);
//	return 0;
//}


//*****************************
//将三个数按从大到小输出
//int main()
//{
//	int arr[3] = { 15, 69, 23 };
//
//	for (int i = 1; i < sizeof(arr) / sizeof(arr[0]); i++)
//	{
//		if (arr[i - 1] < arr[i])
//		{
//			//交换两个数的值
//			arr[i - 1] ^= arr[i];
//			arr[i] ^= arr[i - 1];
//			arr[i - 1] ^= arr[i];
//		}
//	}
//	for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
//	{
//		printf("%d\n", arr[i]);
//	}
//	return 0;
//}


//*****************************
//求两个数的最大公约数
//int main()
//{
//	int num1 = 319;
//	int num2 = 377;
//	int max_cod = 0;
//	辗转相除法(欧几里德算法)[百度百科:最大公约数]//结果:29
//	if (num1 / num2 == 0)
//	{
//		while (num2%num1 != 0)
//		{
//			num1 = num2 % num1;
//		}
//		printf("最大公约数:%d\n", num1);
//	}
//	else
//	{
//		while (num1%num2 != 0)
//		{
//			num2 = num1 % num2;
//		}
//		printf("最大公约数:%d\n", num2);
//	}
//	更相减损法《九章算术》 //结果:29
//	int tmp = 0;
//	if (num1 % 2 != 0 || num2 % 2 != 0)
//	{
//		if (num1 < num2)
//		{
//			while (num1 != num2)
//			{
//				tmp = num2 - num1;
//				if (tmp < num1)
//				{
//					num2 = num1;
//					num1 = tmp;
//				}
//				else
//				{
//					num2 = tmp;
//				}
//			}
//		}
//		else
//		{
//			while (num1 != num2)
//			{
//				tmp = num1 - num2;
//				if (tmp < num1)
//				{
//					num1 = num2;
//					num2 = tmp;
//				}
//				else
//				{
//					num1 = tmp;
//				}
//			}
//		}
//	}
//	printf("%d\n", num1);
//	return 0;
//}




//          day_3
//*****************************
//将数组A中的内容和数组B中的内容进行交换。(数组一样大)
//int main()
//{
//	int A[4] = { 12, 13, 15, 19 };
//	int B[4] = { 25, 76, 58, 69 };
//	for (int i = 0; i < sizeof(A) / sizeof(A[0]); i++)
//	{
//		A[i] = A[i] + B[i];
//		B[i] = A[i] - B[i];
//		A[i] = A[i] - B[i];
//	}
//	return 0;
//}


//*****************************
//计算1/1-1/2+1/3-1/4+1/5......+1/99-1/100的值。
//int main()
//{
//	int n = 0;
//	double sum = 0.0;
//	int k = 1;
//	scanf_s("%d", &n);
//	for (int i = 1; i < (n + 1); i++)
//	{
//		sum = sum + k*(1.0 / i);
//		k = -k;
//	}
//	printf("%lf\n", sum);
//	return 0;
//}


//*****************************
//编写程序数一下1到100的所有整数中出现多少次数字9.
//int main()
//{
//	int count = 0;
//	for (int i = 1; i < 100; i++)
//	{
//		if (i % 10 == 9)
//		{
//			count++;
//		}
//		if (i / 10 == 9)
//		{
//			count++;
//		}
//	}
//	printf("%d\n", count);
//	return 0;
//}




//          day_4
//*****************************
//在屏幕上同*号输出菱形图案。
//int main()
//{
//	int i = 0;
//	int n = 0;
//	scanf_s("%d", &n);
//	for (i = 1; i < n; i++)
//	{
//		for (int j = 1; j < n - i; j++)
//		{
//			printf(" ");
//		}
//		for (int j = 1; j < 2*i; j++)
//		{
//			printf("*");
//		}
//		printf("\n");
//	}
//	for (i = 1; i < n - 1; i++)
//	{
//		for (int j = 0; j < i; j++)
//		{
//			printf(" ");
//		}
//		for (int j = 0; j < 2 * (n - 1 - i) - 1; j++)
//		{
//			printf("*");
//		}
//		printf("\n");
//	}
//	printf("\n");
//	return 0;
//}


//*****************************
//求出0~999之间的所有“水仙花数”并输出。
//int main()
//{
//	for (int i = 153; i < 1000; i++)
//	{
//		int count = 1;
//		int sum = 0;
//		int tmp1 = i;
//		int tmp2 = 0;
//		while (tmp1 / 10 != 0)
//		{
//			count++;
//			tmp1 /= 10;
//		}
//		tmp1 = i;
//		for (int j = 0; j < count; j++)
//		{
//			tmp2 = tmp1 % 10;
//			sum += pow(tmp2, count);
//			tmp1 /= 10;
//		}
//		if (sum == i)
//		{
//			printf("%d\n", i);
//		}
//	}
//	return 0;
//}


//*****************************
//求Sn=a+aa+aaa+aaaa+aaaaa的前五项之和,其中a是一个数字。
//int main()
//{
//	int Sn = 0;
//	int a = 2;
//	int tmp = 0;
//	//scanf_s("%d", &a);
//	int i = 0;
//	while (i < 5)
//	{
//		tmp += a * pow(10, i);
//		Sn += tmp;
//		i++;
//	}
//	printf("%d\n", Sn);
//	return 0;
//}


//*****************************
//编写一个程序,它从标准输入读取C源代码,并验证所有的花括号都正确的成对出现。
//int main()
//{
//	char ch1 = 0;
//	int count = 0;
//	while ((ch1 = getchar()) != EOF)
//	{
//		if (ch1 == '{')
//		{
//			count++;
//		}
//		if (ch1 == '}')
//		{
//			count--;
//		}
//		if (count == -1)
//		{
//			printf("结果不匹配\n");
//			break;
//		}
//	}
//	if (count == -1)
//	{
//		;
//	}
//	else if (count == 0)
//	{
//		printf("结果匹配\n");
//	}
//	else
//	{
//		printf("结果不匹配\n");
//	}
//	return 0;
//}




//          day_5
//*****************************
//完成猜数字游戏。 
//void menu() //主界面函数
//{
//	printf("******* 欢迎来到猜数字游戏 *******\n");
//	printf("\n");
//	printf("\n");
//	printf("**********************************\n");
//	printf("*******    1.开始游戏    *********\n");
//	printf("*******    2.游戏规则    *********\n");
//	printf("*******    0.退出游戏    *********\n");
//	printf("**********************************\n");
//}
//void rule() //规则函数
//{
//	Sleep(1000);
//	printf("******* 欢迎来到猜数字游戏 *******\n");
//	printf("*** 下面是猜数字游戏的游戏规则 ***\n");
//	printf("\n");
//	printf("\n");
//	printf("**********************************\n");
//	printf("**     游戏开始时,请先猜       **\n");
//	printf("**     一个0到100以内的数       **\n");
//	printf("**     字,游戏会提示你猜       **\n");
//	printf("**     到的数字偏大或者偏       **\n");
//	printf("**     小,然后允许你再进       **\n");
//	printf("**     行猜数字过程,直到       **\n");
//	printf("**     你猜到正确答案。         **\n");
//	printf("**********************************\n");
//	printf("\n");
//	printf("\n");
//	system("pause");
//}
//void game() //游戏函数
//{
//	int rand1 = 0;
//	int num = 0;
//	rand1 = rand()%100;
//	while (1)
//	{
//		printf("\n请猜一个数字:>");
//		scanf_s("%d", &num);
//		if (rand1 < num)
//		{
//			printf("\n您猜的数字偏大\n");
//		}
//		else if (rand1 > num)
//		{
//			printf("\n您猜的数字偏小\n");
//		}
//		else
//		{
//			printf("\n恭喜您!猜对了!\n");
//			printf("\n");
//			printf("\n");
//			system("pause");
//			break;
//		}
//	}
//}
//int main()
//{
//	int input = 0;
//	srand((unsigned)time(NULL));
//	do
//	{
//		printf("\n");
//		menu();
//		printf("\n请选择想要进行的动作:>");
//		scanf_s("%d", &input);
//		printf("\n");
//		switch (input)
//		{
//		case 1:   game();
//			break;
//		case 2:   rule();
//			break;
//		case 0:   printf("\n退出游戏\n");
//			break;
//		default:
//			{
//				printf("\n您的选择已超越游戏规则,请重新选择。\n");
//				printf("\n");
//				printf("\n");
//				system("pause");
//			}
//			break;
//		}
//	} while (input);
//	return 0;
//}




//*****************************
//写代码可以在整形有序数组中查找想要的数字,找到了返回下标,找不到返回-1(折半查找法)
//int binary_search(int arr[], int key, int length)
//{
//	int left = 0;
//	int right = 0;
//	right = length - 1;
//	int mid = 0;
//	while (left <= right)
//	{
//		mid = left + (right - left)/2;
//		if (arr[mid] > key)
//		{
//			right = mid - 1;
//		}
//		else if (arr[mid] < key)
//		{
//			left = mid + 1;
//		}
//		else
//		{
//			return mid;
//		}
//	}
//	return -1;
//}
//int main()
//{
//	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//	int length = sizeof(arr) / sizeof(arr[0]);
//	int result = binary_search(arr, 7, length);
//	printf("%d\n", result);
//	return 0;
//}




//*****************************
//编写代码模拟三次密码输入的场景。 
//最多能输入三次密码,密码正确,提示“登录成功”, 密码错误,可以重新输入,最多输入三次。三次均错,则提示退出程序。
//int main()
//{
//	char code[7] = { 0 };
//	int i = 0;
//	while (i < 3)
//	{
//		printf("请输入密码(您有%d次输入机会):>", 3-i);
//		scanf("%s", &code);
//		if ((strcmp(code, "123456")) == 0)
//		{
//			printf("输入正确,正在登陆中......\n");
//			break;
//		}
//		else
//		{
//			printf("密码错误,请重新输入\n");
//			i++;
//		}
//	}
//	if (i == 3)
//	{
//		printf("退出程序\n");
//	}
//	return 0;
//}




//*****************************
//编写一个程序,可以一直接收键盘字符,如果是小写字符就输出对应的大写字符,如果接收的是大写字符,就输出对应的小写字符,如果是数字不输出。
//int main()
//{
//	int ch = 0;
//	while ((ch = getchar()) != EOF)
//	{
//		if (ch>='A' && ch<='Z')
//		{
//			putchar(ch + 32);
//		}
//		else if (ch>='a' && ch<='z')
//		{
//			putchar(ch - 32);
//		}
//		else if (ch>='0' && ch<='9')
//		{
//			;
//		}
//		else
//		{
//			putchar(ch);
//		}
//	}
//	return 0;
//}




//          day_6
//*****************************
//1.写一个函数返回参数二进制中 1 的个数 
//比如: 15 (0000 1111) 4 个 1
//程序原型:
//int count_one_bits(unsigned int value)
//{
// // 返回 1的位数 
//}
//
//int count_one_bits(unsigned int value)
//{
//	int i = 1;
//	int j = 1;
//	int count = 0;
//	while (i < 8)
//	{
//		if ((value&j) == j)
//		{
//			count++;
//		}
//		j = j << 1;
//		i++;
//	}
//	return count;
//}
//
//int main()
//{
//	int result = 0;
//	int value = 15;
//	result = count_one_bits(value);
//	printf("%d\n", result);
//	return 0;
//}


//*************************
//2.获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。
//int main()
//{
//	int odd[16] = { 0 };
//	int even[16] = { 0 };
//	int value = 16;
//	int j = 1;
//	for (int i = 0; i < 16; i++)
//	{
//		if ((value & j) == j)
//		{
//			odd[i] = 1;
//		}
//		else
//		{
//			odd[i] = 0;
//		}
//		j = j << 2;
//	}
//	j = 2;
//	for (int i = 0; i < 16; i++)
//	{
//		if ((value & j) == j)
//		{
//			even[i] = 1;
//		}
//		else
//		{
//			even[i] = 0;
//		}
//		j = j << 2;
//	}
//	printf("odd: ");
//	for (int i = 15; i >= 0; i--)
//	{
//		printf("%d", odd[i]);
//	}
//	printf("\n");
//	printf("even:");
//	for (int i = 15; i >= 0; i--)
//	{
//		printf("%d", even[i]);
//	}
//	printf("\n");
//	return 0;
//}


//*************************
//3. 输出一个整数的每一位。
//int main()
//{
//	int value = 15;
//	int arr[32] = { 0 };
//	int j = 1;
//	for (int i = 0; i < (sizeof(value) * 8); i++)
//	{
//		if ((value & j) == j)
//		{
//			arr[i] = 1;
//		}
//		else
//		{
//			arr[i] = 0;
//		}
//		j = j << 1;
//	}
//	for (int i = (sizeof(value) * 8) - 1; i >= 0; i--)
//	{
//		printf("%d", arr[i]);
//	}
//	printf("\n");
//	return 0;
//}


//*************************
//4.编程实现:
//两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
//输入例子 :
//1999 2299
//输出例子 : 7
//int main()
//{
//	int m = 1999;
//	int n = 2299;
//	int tmp = m^n;
//	int j = 1;
//	int count = 0;
//	for (int i = 0; i < sizeof(m) * 8; i++)
//	{
//		if ((tmp&j) != 0)
//		{
//			count++;
//		}
//		j = j << 1;
//	}
//	printf("%d\n", count);
//	return 0;
//}




//          day_7
//*****************************
//实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定,输入9,输出9*9口诀表,输出12,输出12*12的乘法口诀表。
//void mul_table(int num)
//{
//	for (int i = 1; i <= num; i++)
//	{
//		for (int j = 1; j <= i; j++)
//		{
//			printf("%2d * %2d = %3d  ", i, j, i*j);
//		}
//		printf("\n");
//	}
//}
//
//int main()
//{
//	int num = 0;
//	scanf_s("%d", &num);
//	mul_table(num);
//	return 0;
//}
//


//*****************************
//使用函数实现两个数的交换
//int Swap(int *x, int *y)
//{
//	int tmp = 0;
//	tmp = *x;
//	*x = *y;
//	*y = tmp;
//}
//
//int main()
//{
//	int a = 10;
//	int b = 20;
//	printf("a = %d b = %d\n", a, b);
//	Swap(&a, &b);
//	printf("a = %d b = %d\n", a, b);
//	return 0;
//}
//


//*****************************
//实现一个函数判断year是不是闰年
//int is_leap(int year)
//{
//	return ((y % 4 == 0) && ( y % 100 != 0))||( y % 400 == 0);
//}
//
//int main()
//{
//	for (int i = 1000; i <= 2000; i++)
//	{
//		if ((is_leap(i)) == 1)
//		{
//			printf("%d\n", i);
//		}
//	}
//	return 0;
//}
//


//*****************************
//创建一个数组,
//实现函数init()初始化数组、
//实现empty()清空数组、
//实现reverse()函数完成数组元素的逆置。(要求:自己设计函数的参数,返回值。)
//void init(int arr[], int value, int length)  //用指定值初始化数组
//{
//	int i = 0;
//	for (i = 0; i < length; i++)
//	{
//		*(arr + i) = value;
//	}
//}
//
//void empty(int arr[], int length)  //清空数组
//{
//	int i = 0;
//	for (i = 0; i < length; i++)
//	{
//		*(arr + i) = 0;
//	}
//}
//
//void reverse(int arr[], int length) //完成数组元素的逆置
//{
//	int i = 0;
//	int j = length - 1;
//	int tmp;
//	while (i < j)
//	{
//		tmp = *(arr + i);
//		*(arr + i) = *(arr + j);
//		*(arr + j) = tmp;
//		i++;
//		j--;
//	}
//}
//
//int main()
//{
//	int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int i = 0;
//	reverse(arr, sz);
//	
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	printf("\n");
//	
//	init(arr, 5, sz);
//	for (i = 0; i < sz;i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	printf("\n");
//	
//	empty(arr, sz);
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	printf("\n");
//
//	return 0;
//}


//*****************************
//实现一个函数,判断一个数是不是素数。 
//int is_prime(int value)
//{
//	int i = 0;
//	for (i = 2; i < sqrt(value); i++)
//	{
//		if ((value%i) == 0)
//		{
//			return 0;
//		}
//	}
//	return 1;
//}
//
//int main()
//{
//	int value = 0;
//	scanf_s("%d", &value);
//	if (is_prime(value))
//	{
//		printf("%d是素数\n", value);
//	}
//	else
//	{
//		printf("%d不是素数\n", value);
//	}
//	return ;
//}



//main()函数被下面这个函数调用
//__tmainCRTStartup
//__tmainCRTStartup()  函数被下面这个函数调用
//mainCRTStartup

//                 day_11
//****************************
//写一个宏可以将一个数字的奇数位和偶数位交换。
//#define CHANGE(x) (((x) % 10) * 10) + ((x)/10)
//
//int main()
//{
//	int x = 21;
//	x = CHANGE(x);
//	printf("%d\n", x);
//	return 0;
//}


//使用宏实现两个数中求较大值。

//#define MAX(x, y) (x)>(y)?(x):(y)


//                 day_13

//*********************************
//1.调整数组使奇数全部都位于偶数前面。
//
//题目:
//
//输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。


//2.


//杨氏矩阵 
//有一个二维数组.
//数组的每行从左到右是递增的,每列从上到下是递增的.
//在这样的数组中查找一个数字是否存在。
//时间复杂度小于O(N);
//
//数组:
//1 2 3
//2 3 4
//3 4 5
//
//
//1 3 4
//2 4 5
//4 5 6


//          day_12
//*****************************
//1.
//这个函数的返回 值value的二进制位模式从左到右翻转后的值。 
//
//如: 
//在32位机器上25这个值包含下列各位: 
//00000000000000000000000000011001 
//翻转后:(2550136832) 
//10011000000000000000000000000000 
//程序结果返回: 
//2550136832 
#include <stdio.h>

unsigned int reverse_bit(unsigned int value)
{
     int i = 0;
     int j = 0;
     int tmp = 0;
     int div = 1;
 
     for(i = 0, j = (sizeof(int)*8 - 1); i < j; i++, j--)
     {
         if((value & (div << i)) != (value & (div << j)))
         {
           if(value & (div << i))
            {
                 value -= (div << i);
                 value = value | (div << j);
            }
             else
             {
                 value -= (div << j);
                 value = value | (div << j);
             }
         }
     }
     return value;
}
 
int main()
{
    unsigned int value = 25;


    value = reverse_bit(value);
    printf("value = %u\n", value);
 
    return 0;
}



//2.不使用(a+b)/2这种方式,求两个数的平均值。 

#include <stdio.h>

int main(void)
{
    int a = 15; 
    int b = 24; 
    double aver = 0;

    if(a > b)
    {   
        aver = b + (a - b) / 2.0;
    }   
    else
    {   
        aver = a + (b - a) / 2.0;
    }   

    printf("aver = %lf\n", aver);
    return 0;
}


//3.编程实现: 
//一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。 
//请找出这个数字。(使用位运算) 
#include <stdio.h>


int main()
{
    int arr[9] = {12,24,38,12,48,66,38,24,66};
    int i = 0;
    int j = 0;


    for(i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
    {   
        for(j = 0; j < sizeof(arr) / sizeof(arr[0]); j++)
        {   
            if(!(arr[i] ^ arr[j]) && (i != j)) 
                break;
        }   
        if(j == sizeof(arr) / sizeof(arr[0]))
            break;
    }   


    printf("value = %d\n", arr[i]);
    return 0;
}



//4. 
//有一个字符数组的内容为:"student a am i",请你将数组的内容改为"i am a student". 
//要求: 
//不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。 
#include <stdio.h>


int main()
{


    int i = 0;
    int j = 0;
    char s[] = "student a am i";
    char a[] = "student a am i";
    int count = 0;
    int tmp = 0;


    for(i = 0; s[i] != '\0'; i++)  //求出字数串长度
    {   
        count++;
    }   


    tmp = count;  //定位字符串中上一个‘ ’的位置


    for(i = count - 1; i >= 0; i--)  //实现将字符数组中的单词倒序放入另一个数组中
    {   
        if(s[i] == ' ')
        {   
            int m = 0;
            for(m = i + 1;m < tmp; j++, m++)
            {   
                a[j] = s[m];
            }   
            a[j] = ' ';
            j++;
            tmp = i;
        }   
        else if(i == 0)
        {   
            int m = 0;
            for(m = i; m < tmp; j++, m++)
            {   
                a[j] = s[m];
            }   
        }   
    }   


    printf("%s\n", a);  //缺点,无法在任意字符串中实现,(不会在没有库函数的情况下制作用程序制作一个相同字符串)


    return 0;
}

    【4月20号更新】

//                      day_14

//************************************

//1.实现一个函数,可以左旋字符串中的k个字符。 

//ABCD左旋一个字符得到BCDA 
//ABCD左旋两个字符得到CDAB 
#include <stdio.h>

#define VALUE 6

void left_rotate(char target[], char resource[], int length, int number)
{
    int i = 0;
    int j = 0;

    for(i = number; i < length - 1; i++, j++)
    {
        *(target + j) = *(resource + i);
    }
    for(i = 0; i < number; i++, j++)
    {
        *(target + j) = *(resource + i);
    }

    *(target + j) = '\0';

    return ;
}

int main()
{
	char s1[VALUE] = "ABCD";
	char s[VALUE];

	left_rotate(s, s1, VALUE, 2);
	printf("%s\n", s);

	return 0;
}


//2.判断一个字符串是否为另外一个字符串旋转之后的字符串。 
//例如:给定s1 = AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0. 

//AABCD左旋一个字符得到ABCDA 
//AABCD左旋两个字符得到BCDAA 
//AABCD右旋一个字符得到DAABC


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

#define VALUE 6

void left_rotate(char target[], char resource[], int length, int number)
{
    int i = 0;
    int j = 0;

    for(i = number; i < length - 1; i++, j++)
    {
        *(target + j) = *(resource + i);
    }
    for(i = 0; i < number; i++, j++)
    {
        *(target + j) = *(resource + i);
    }

    *(target + j) = '\0';

    return ;
}

int is_rotate(char s1[], char s2[],const int length)
{
    char s[length];
    int i = 0;

    for(i = 0; i < length; i++)
    {
        left_rotate(s, s1, length, i);
        if((strcmp(s2, s)) == 0)
        {
            return 1;
        }
    }

    return 0;
}

int main(void)
{
    char s1[VALUE] = "abcdf";
    char s2[VALUE] = "cdfab";

    (is_rotate(s1, s2, VALUE)) ? (printf("是子串\n")) : (printf("不是子串\n"));

    return 0;
}



猜你喜欢

转载自blog.csdn.net/qq_41866437/article/details/80004830