函数题目练习

1.乘法口诀表

        用一个函数,打印乘法口诀表,口诀表的行数和列数自己指定
        如:输入9,输出9*9乘法口诀表,输入12,输出12*12乘法口诀表 

void Print_MulTable(int N)
{
	for (int i = 1; i <= N; ++i)
	{
		for (int j = 1; j <= i; ++j)
		{
			printf("%d*%d=%2d ", j, i, j*i);
		}
		printf("\n");
	}
}

         利用两个循环嵌套即可解决问题

2.交换两个整数

        实现一个函数来交换两个整数的内容。

void Swap(int *pa, int *pb)
{
    int tmp = *pa;
    *pa = *pb;
    *pb = tmp;
}

         参数传递的是指针,否则将无法通过形参交换实参的变量。

3.判断闰年

        实现函数判断year是不是闰年。 

int is_leap_year(int year)
{
	if(((0 == year%4)&&(0!=year%100))||(0==year%400))
    {
		return 1;
    }
	else
    {
		return 0;
    }
}

        可以简化成下面这样

int is_leap_year(int year)
{
	return ((0 == year%4)&&(0!=year%100))||(0==year%400);
}

4.判断素数

        实现一个函数,判断一个数是不是素数。
        利用上面实现的函数打印100到200之间的素数。

int is_prime(int n)
{
	int i = 0;
	for(i=2; i<=sqrt(n); i++)
    {
		if(0 == n%i)
		{
			return 0;
		}
	}
	return 1;
}

 开平方是做了一个时间上的优化,让函数在调用时,尽量少做无意义的运算,提高效率

 5.n的k次方

        递归实现求出n的k次方

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

 6.递归实现计算一个数的每位之和

        写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和

        例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19

        输入:1729,输出:19

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

7.实现字符串逆序

        编写一个函数 reverse_string(char * string)(递归实现)

        实现:将参数字符串中的字符反向排列,不是逆序打印。

        要求:不能使用C函数库中的字符串操作函数。

        比如:char arr[] = “abcdef”; 逆序之后数组的内容变成:fedcba

 

//非递归
void reverse_string(char* arr)
{
	char *left = arr;
	char *right = arr+strlen(arr)-1;

	while(left<right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
//递归
void reverse_string(char* arr)
{
	int len = strlen(arr);
	char tmp = *arr;

	*arr = *(arr+len-1); 
	*(arr+len-1) = '\0';
	if(strlen(arr+1)>=2)
		reverse_string(arr+1);
	*(arr+len-1) = tmp;
}

8.实现strlen的模拟

//非递归
int my_strlen(char* str)
{
    int count = 0;
    while('\0' != *str)
    {
        count++;
        str++;
    }
    return count;
}
//递归
int my_strlen(char *str)
{
    if('\0' == *str)
	{    
        return 0;
    }
	else
	{	
        return 1+my_strlen(1+str);
    }
}

9.求阶乘

//非递归
long long Fac(int N)
{
    long long ret = 1;
    for(int i = 2; i <= N; ++i)
    {
        ret *= i;
    }
    return ret;
}
//递归
long long Fac(int N)
{
    if(N <= 1)
        return 1;
    return Fac(N-1)*N;
}

10.打印一个数的每一位

void print(unsigned int n)
{
    if(n>9)
        print(n/10);
    printf("%d ", n%10);
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值