C语言初阶小练习(2)

目录

//编写一个函数实现n的k次方(递归)

//计算一个数的每位之和(递归)

//数组的输入与输出  !!!

//利用格里高利公式编程求π的值

//利用迭代法求a的平方根x

//用二分法求一元三次方程3x^3- 2x^2+5x- 16=0在(-2,4)之间的根

//打印出0~999内所有水仙花数

//水仙花进阶:求0~100000中的水仙花数 


接上次 C语言小练习(1)http://t.csdn.cn/esgeo

关于上次几题没有使用函数递归这次来补一下

//编写一个函数实现n的k次方(递归)

分类讨论:k<0;k=0;k>0

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
double Pow(int n, int k)
{
	if (k == 0)
		return 1.0;
	else if (k > 0)
	{
		return n * Pow(n, k - 1);
	}
	else 
	{
		return 1.0 / Pow(n, -k);
	}
}
int main()
{
	int a, b;
	scanf("%d %d", &a, &b);
	double ret = Pow(a, b);
	printf("%lf\n", ret);
	return 0;
}

//计算一个数的每位之和(递归)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int DigitSum(int n)
{
	if (n > 9)
		return DigitSum(n / 10) + n % 10;
	else
		return n;
}
int main()
{
	int a = 0;
	scanf("%d", &a);
	int b = DigitSum(a);
	printf("%d\n", b);

	return 0;
}

//数组的输入与输出  !!!

若没有输足十组数据,编译器不停止。

//输入10科成绩,换行显示输入的10科成绩。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
    int score[10] = { 0 };//初始化
    int i = 0;
    for (i = 0; i < 10; i++)
    {
        scanf("%d", &score[i]);//这里是具体某一个元素,不是数组,要加&
        printf("%d ", score[i]);
    }
    return 0;
}

//利用格里高利公式编程求π的值

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void main(void)
{
	double pi = 0, t = 1;
	int i = 1, flag = 1;
	while (t > 1e-6)
	{
		pi += flag * t;
		flag = -flag;
		i += 2;
		t = 1.0 / i;//注意这里不能写 1 / i ,否则结果为4而不是3.14……
	}
	// 	pi += flag * t;
	printf(" pi = %lf\n", pi * 4);
}

//利用迭代法求a的平方根x

do-while 循环语句的使用

这个公式不要问我为什么,我也不知道,想深究可问数学老师~~ 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int main()
{
	double a, x0, x1;
	printf("请输入一个数:");
	scanf("%lf", &a);
	x1 = a / 2;
	do 
	{
		x0 = x1;
		x1 = (x0 + a / x0) / 2;
	} while (fabs(x0 - x1) >= 1e-6);
	printf("The square root of %5.2f is %5.2\n", a, x1);
	return 0;
}

 咋觉得这题本质上是一道数学题,里面好多公式我都看不懂呜呜呜,先搁这放着吧……

//用二分法求一元次方程3x^3- 2x^2+5x- 16=0(-2,4)之间的根

do-while 循环语句的使用

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int main()
{
	double x0, x1, x2, y0, y1, y2;
	do
	{
		scanf("%lf %lf", &x1, &x2);//注意使用%lf而不是%d
		y1 = 3 * x1 * x1 * x1 - 2 * x1 * x1 + 5 * x1 - 16;
		y2 = 3 * x2 * x2 * x2 - 2 * x2 * x2 + 5 * x2 - 16;
	} while (y1 * y2 > 0);
	
	do
	{
		x0 = (x1 + x2) / 2;
		y0 = 3 * x0 * x0 * x0 - 2 * x0 * x0 + 5 * x0 - 16;
		if (y0 * y1 < 0)
		{
			x2 = x0;
		}
		else
		{
			x1 = x0;
		}
	} while (fabs(y0)>=10e-6);//绝对值
	printf("The root is %lf", x0);
	return 0;
}

//打印出0~999内所有水仙花数

"水仙花数"是指一个3位数,其各位数字的立方和等于该数本身,如153是一个"水仙花数",因为153=1*1*1+5*5*5+3*3*3

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int n = 0;
	for (n = 100; n <= 999; n++)
	{
		int h = n / 100;
		int s = (n - 100 * h) / 10;
		int t = n - h * 100 - s * 10;
		if (h * h * h + s * s * s + t * t * t == n)
		{
			printf("%d ", n);
		}
	}
	return 0;
}

//水仙花进阶:求0~100000中的水仙花数 

难难难,比上面那个难多了。。。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<math.h>
int main()
{
	int n = 0;//0~100000的数
	int count = 0;//求n有几位数
	int m = 0;//为了n不改变,作为n的暂存地
	int sum = 0;//存放相加结果
	for (n = 0; n <= 100000; n++)
	{
		sum = 0;//每用完一次sum要重置为0
		count = 1;//至少有一位数
		m = n;
		while (m/=10)
		{
			count++;//求n有几位数
		}
		m = n;
		while (m)
		{
			sum = sum + pow(m % 10, count);
			m = m / 10;
		}
		if (sum == n)
		{
			printf("%d ", n);
		}
	}
	return 0;
}

与其说这是小练习,倒不如说是我的错题本,课上课下不太会的都会收录进来,然后自己再敲一遍加深下印象,争取下次会写。

又是努力成为大牛的几天呢~~

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值