C语言习题详解2.0

目录

C语言习题1.0

找一个数字的连续因子

求N个分数的和

正整数A+B

递归

青蛙跳台阶问题

汉诺塔问题

函数

预处理

文件处理

操作符


C语言习题1.0

C语言习题详解_字符串%s向前移动2位显示-优快云博客文章浏览阅读1.6k次,点赞26次,收藏24次。习题覆盖了数组、指针、结构体、函数等,挑战读者的逻辑思维和编程技巧,不仅能够提高编程能力,还能为将来的编程挑战打下坚实的基础。_字符串%s向前移动2位显示 https://blog.youkuaiyun.com/2401_87944878/article/details/144518215

找一个数字的连续因子

设置两个循环,第一个是从哪开始找,第二个是向后找几个。从2开始向后找连续因子,一直到sqrt(a); 

//找连续因子,及其个数
int main()
{
	int a;
	scanf("%d", &a);
	int num = 0;  //储存连续因子的个数
	int min = 0;   //储存连续因子的起始位置
	int m;

	//从i开始向后找连续因子
	for(int i=2;i<sqrt(a);i++)
	{
		int t = a;
		for (m = i; m < a; m++)
		{
			if (t % m == 0)
				t /= m;
			else
				break;
		}
		if (m - i > num)
		{
			num = m - i;
			min = i;
		}
	}
	printf("%d\n", num);
	for (int i = min; i < min + num - 1; i++)
		printf("%d*", i);
	printf("%d", min + num - 1);
	
	return 0;
}

求N个分数的和

求N个分数的和,结果以整数和真分数的形式打印

此题关键在于对分子和分母的通分和化简上面。 

//求N个分数的和

int gys(int x, int y)
{
	int t = x % y;
	while (t)
	{
		x = y;
		y = t;
		t = x % y;
	}
	return y;
}

int main()
{
	int a, b;
	int num;
	scanf("%d", &num);//读取有几个分数
	scanf("%d/%d", &a, &b);//先读取第一个分数
	int fz = 0, fm = 0;

	for (int i = 1; i < num; i++)
	{
		int c, d;
		scanf("%d/%d", &c, &d);  //读取第二个分数
		
		//求两个分母的最大公因数
		int gony = gys(b, d);
		//求最小公倍数即分母
		 fm = b * d / gony;
		//将分子通分
		 fz = a * fm / b + c * fm / d;
		 a = fz, b = fm;
	}
	//此时所有的分子和分母多完成相加了
	//对分式进行化简,先找到最大公因数
	int t = gys(fz, fm);
	if (t)
	{
		fz /= t;
		fm /= t;
	}

	if (fz % fm == 0)   //能被整除
		printf("%d\n", fz / fm);
	else if (fz / fm == 0)   //是一个真分式
		printf("%d/%d\n", fz, fm);
	else          //是一个假分数
		printf("%d %d/%d", fz / fm, fz%fm, fm);

	return 0;
}

正整数A+B

 1)判断是否是有效数字;2)记录A;3)判断完第一个数字后,找空格后的第二个数字,判断第二个是否为有效数字;4)记录B;5)输出结果。

//整数A+B
int main()
{
	char put[500];
	gets(put);
	int m1 = 1; //用m1来记录数字是否有效
	int m2 = 1;
	int t1 = 0, t2 = 0;   // 用t1和t2来保留数字
	int j=0;

	int num = strlen(put);
	//查找第一个数字
	for (int i = 0; i < num; i++)
	{
		if (put[i] == ' ')//如果等于空格
		{
			//首字符是空格则m1为0,即A为无效数字
			if (i == 0)
			{
				m1 = 0;
			}
			j = i + 1;   //第二个数字要从i+1开始查找
			break;
		}
		else if (put[i] >= '0' && put[i] <= '9')
		{
			t1 = t1 * 10 + put[i] - '0';
		}
		else   //其他情况就是包含无效字符,则A为无效数字
		{
			m1 = 0;
		}
	}

	//查找第二个数字
	for (int i = j; i < num; i++)
	{
		if (put[i] >= '0' && put[i] <= '9')
			t2 = t2 * 10 + put[i] - '0';
		else
		{
			m2 = 0;
			break;
		}
	}

	//打印
	//先答应A
	if (m1 == 0 || t1 < 1 || t1>1000)
		printf("? + ");
	else
		printf("%d + ", t1);
	//再打印B
	if (m2 == 0 || t2 < 1 || t2>1000)
		printf("? = ");
	else
		printf("%d = ", t2);
	//打印结果
	if ((m1 == 0 || t1 < 1 || t1>1000) || (m2 == 0 || t2 < 1 || t2>1000))
		printf("?");
	else
		printf("%d", t1 + t2);


	return 0;
}

递归

青蛙跳台阶问题

问题:有一只青蛙要跳上有n阶台阶的楼梯,青蛙一次可以跳1个台阶,也可以跳2个台阶,

问青蛙跳上去一共有多少种方法?

此题利用递归最直接,青蛙跳上n个台阶方法是F(n),则F(n)=F(n-1)+F(n-2),可以直接从倒数第二个台阶直接跳两步,也可以从倒数第一个台阶跳一步。注意:F(n-1)包含了从倒数第二个台阶跳2个1步的结果。

int FrogStep(int n)
{
	if (n == 1)
		return 1;
	if (n == 2)
		return 2;

	return FrogStep(n - 1) + FrogStep(n - 2);
}

汉诺塔问题

有三个柱子A,B,C,要将A柱子上面的圆盘全部移到C上去,移动后还是大盘在小盘的下面。要求:每次移动后,不论是那一根柱子,都要满足大盘在小盘的下面。问:一共要移动多少次才能使盘子全部移动到C上买了去?

将A上面的N个盘子,看成两部分,最下面的大盘和最其余的N-1个盘子 ;先将N-1个全部移动到B上去,再将最大的移动到C上去;再将B上的n-1个全部移动到C上去。

F(n)=2*F(n-1)+1;

int HLT(int n)
{
	if (n == 1)
		return 1;

	else
	{
		return 2*HLT(n - 1) + 1;
	}
}

函数

(C语言)函数-优快云博客https://blog.youkuaiyun.com/2401_87944878/article/details/143407095

1)函数的定义可以放在任意位置,函数的声明必须放在函数使用之前;

2)自定义函数具有高内聚低耦性:函数与函数之间的联系应该尽量小,函数内应尽量少的使用全局变量;

3)使用指针访问的时候,char*一次访问一个字节,short*一次访问两个字节;

4)在打印的时候,%d一次读取四个字节;%lld和%llx等整形即%f,%lf一次读取8个字节;

5)C语言中一个变量可以被多次定义,在不同函数中;

6)将14.99四舍五入为15————printf("%.0f",14.99);

预处理

预处理详解-优快云博客https://blog.youkuaiyun.com/2401_87944878/article/details/143951068

1)#define宏定义;

2)#if,#ifdef,#ifndef,#else,#elif,除此之外还有#if defined ....的用法。都属于条件编译指令。#pragme是一个比较复杂的预编译指令;

3)ifndef,define,endif是用来解决同一文件重复包含相同文件的;

4)预处理只会处理#开头的语句,编译阶段只校验语法,链接时才会找实体。

文件处理

(C语言)文件操作-优快云博客https://blog.youkuaiyun.com/2401_87944878/article/details/143895631

1)文件名可以不包含后缀名,后缀名决定了文章的打开方式;

2)realloc函数可调整动态申请空间的大小,可大可小;

操作符

(C语言)操作符(全网最全,最详细)_c语言操作符大全-优快云博客https://blog.youkuaiyun.com/2401_87944878/article/details/143274246

1)用n|(n+1)来计算一个数二进制中0的个数,n&(n-1)来计算一个数中二进制中1的个数;

2)==的优先级比=高;

3)注意是传值还是传址;

4)new和delete成对使用,malloc和free成对使用;

5)字符常量用' ',字符串用''  '';

6)12a315156,在用%3d读取12a的时候,a是无效数字,不会被读取,但是也不会被舍去,会保留下来让下一个读取指令读取;

7)[  ]的优先级比*高;

8)getchar不像scanf一样,getchar会读取回车;

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半桔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值