C语言100题练习打卡(2)

14,将一个正整数分解质因数。

例如:输入90,打印出90=2*3*3*5

#include<stdio.h>
/*分析:
* 1,如果这话质数恰巧等于(小于的时候,继续执行循环)n,
则说明分解质因数的过程已经结束,另外 打印出即可
2,但n能被k整除,则应该打印出k的之,并用n除以k的商,作为新的正整数n,
重新执行第二步
3,如果n不能被k整除,则用k+1作为k的值,重复执行第一步
*/
int main()
{
	int n, i;
	printf("请输入整数:\n");
	scanf_s("%d", &n);
	printf("%d=", n);

	for (i = 2; i <= n; i++)
	{
		while (n % i == 0)
		{
			printf("%d", i);
			n /= i;
			if (n != 1)
				printf("*");
		}
	}
	printf("\n");
	return 0;
}

15 学生成绩评价

 利用条件运算符的嵌套来完成此题:

学习成绩>=90分的同学用A来表示

60~89分之间的用B来表示,60分以下的用C来表示

方法一:

#include<stdio.h>
int main()
{
	int score;
	char grade;

	printf("请输入分数:\n");
	scanf_s("%d", &score);

	if (score >= 90)
	{
		grade = 'A';
	}
	else if(score>60)
	{
		grade = 'B';
	}
	else
	{
		grade = 'C';
	}
	printf("%c", grade);
	return 0;
}

方法二:

#include<stdio.h>
int main()
{
	int score;
	char grade;

	printf("请输入分数:\n");
	scanf_s("%d", &score);

	grade = ((score >= 90) ? 'A' : (score >= 60) ? 'B' : 'C');
	printf("%c", grade);
	return 0;
}

16 求最大公约数或最小公倍数

#include<stdio.h>
/*分析:
1,最小公倍数=输入的两个数之积除以他们的最大公倍数
2,求最大公约数用辗转相除法
证明:设c是a和b的最大公约数,记为c=gcb(a,b),a>=b,
令r=a % b
设a=kc,b=jc,则k,j互素,否则c不是最大公约数
据上,r=a-mb=kc-mjc=(k-mj)c,可知r也是c的倍数,且k-mj与j互素,否则与前述k,j互素矛盾,
由此可知,b与r的最大公约数也是c,即gcd(a,b)=gcd(b,a mod b),得证
2)算法描述:
第一步:a ÷ b,令r为所得余数(0≤r 
第二步:互换:置 a<-b,b<-r,并返回第一步。
*/
int main()
{
	int a,b,t,r,n;

	printf("请输入两个数字:\n");
	scanf_s("%d %d", &a, &b);

	if (a < b)
	{
		t = b;
		b = a;
		a = t;
	}

	r = a % b; 
	n = a * b;

	while (r != 0)
	{
		a = b;
		b = r;
		r = a % b;
	}
	printf("这两个数的最大公约数是%d,最小公倍数是%d\n", b, n / b);

	return 0;
}

17,统计字符个数

输入一行字符,分别统计其中的英文字母,空格,数字和其他字符的个数

利用while语句 

#include<stdio.h>
int main()
{
	char c;
	int letters = 0,spaces = 0,digitals = 0,others = 0;
	printf("请输入一段字符:\n");
	while ((c = getchar()) != '\n')
	{
		if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
		{
			letters++;
		}
		else if (c >= '0' && c <= '9')
		{
			digitals++;
		}
		else if (c == ' ')
		{
			spaces++;
		}
		else
		{
			others++;
		}
	}
	printf("字母=%d,数字=%d,空格=%d,其他=%d\n", letters, digitals, spaces, others);
	return 0;
}

17 多位数求和

求s=a+aa+aaa+aaaa+aaaaa的值,其中a是一个数字。

例如2+22+222+2222+22222(此时共有五个数和相加)

#include<stdio.h>
int main()
{
	int s = 0,a, n, t;
	printf("请输入 a 和n的值:\n");
	scanf_s("%d %d", &a, &n);
	
	t = a;

	while (n > 0)
	{
		s += t;
		a = a * 10;
		t += a;
		n--;
	}
	printf("a+aa+aaa+aaaa+aaaaa=%d\n", s);
	return 0;
}

 

18 计算球反弹的高度

题目:一球从100米高度自由落下,每次落地后反跳弹回高度的一半;

再落下,求它第十次落地时共经过多少米?

第十次反弹多高?

#include<stdio.h>
int main()
{
	double x = 100;//小球初始高度
	double S = 100;//小球第一次掉落路程
	
	for (int i = 0; i < 10; i++)
	{
		x = x / 2;//每次反弹的高度
		S += 2*x;//每次反弹路程是掉落的两倍+初始时候的100米
	}
	printf("小球在第十次反弹的高度:%lf\n",x);
	printf("小球十次落地,共经历%lf米\n", S);
	return 0;
}

19 猴子摘桃问题

猴子吃桃问题:

猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少 

方法一:

#include<stdio.h>

/*程序分析:
题目:采取逆向思维的方法,从后往前推:
(1)设x1为前一天桃子数,x2为第二天桃子树:
x2=x1/2-1;x1=(x2+1)*2
x2=x1/2-1;x2=(x2+1)*2

(2)从第十天可以类推到第一天,循环*/
int main()
{
	int x=1;//设最后一天只剩1个桃子

	for (int i = 1; i < 10; i++)//从第九天开始倒数,倒数到第一天
	{
		x = (x + 1) * 2;
	}
	printf("%d", x);
	return 0;
}

方法二:

int main()
{
	int day, x1 = 0, x2;
	day = 9;
	x2 = 1;

	while (day > 0)
	{
		x1 = (x2 + 1) * 2;
		x2 = x1;
		day--;
	}
	printf("桃子总数为:%d", x2);
	return 0;
}

19 打印菱形图案

方法1:

#include<stdio.h>
//前四行一个规律,后三行一个规律
int main()
{
	int i, j, k;

	for (int i = 0; i <= 3; i++)//表示打印前四行
	{
		for (j = 0; j <= 2 - i; j++)
		{
			printf(" ");
		}
		for (k = 0; k <= 2 * i; k++)
		{
			printf("*");
		}
		printf("\n");
	}

	for (int i = 0; i <= 2; i++)
	{
		for (j = 0; j <= i; j++)
		{
			printf(" ");
		}
		for (k = 0; k <= 4-2 * i; k++)
		{
			printf("*");
		}
		printf("\n");
	}
	return 0;
}

方法二:

#include<stdio.h>
//前四行一个规律,后三行一个规律
int main()
{
	int i, j, n=3;

	for (int i = 1; i <= n; i++)//表示打印前四行
	{
		for (j = n - i; j >=1; j--)
		{
			printf(" ");
		}
		for (j = 1; j <= 2 * i-1; j++)
		{
			printf("*");
		}
		printf("\n");
	}

	for (int i = n - 1; i >=1; i--)
	{
		for (j = n - i; j >= 1; j--)
		{
			printf(" ");
		}
		for (j = 1; j <= 2 * i - 1; j++)
		{
			printf("*");
		}
		printf("\n");
	}
	return 0;
}

 20 求分数序列之和

有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13....求出这个数列的前20项之和

#include<stdio.h>
int main()
{
	int i, t;
	float sum = 0;
	float a = 2, b=1;//设a为分子,b为分母

	for (int i = 1; i <= 20; i++)
	{
		sum = sum + a / b;
		t = a;//将分子赋值给t
		a = a + b;//将新的分母变成下一个数的分子
		b = t;//将新的分子变成下一个数的分母
	}

	printf("sum = %9.6f\n", sum);
	return 0;
}

 21 求1~20阶乘的和

题目:求1!+2!+3!....+20!的和

方法一:

#include<stdio.h>
int main()
{
	int i;
	long double sum=0, mix=1;

	for (i = 1; i <= 20; i++)
	{
		mix = mix * i;
		sum = sum + mix;
	}
	printf("%lf\n", sum);
	return 0;
}

21 用递归的方法求5!

#include<stdio.h>
int Fact(int n)
{
	if (n == 0)
		return 1;
	else
		return n * Fact(n - 1);
}


int main()
{
	int n = 5;
	long double ret = Fact(n);
	printf("%lf", ret);
	return 0;
}

 22 利用递归将字符反转

利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来

首先我们先正序打印:

#include<stdio.h>

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

int main()
{
	int m = 0;
	scanf_s("%d", &m);
	Print(m);
	return 0;
}

然后我们来看看反转打印:

#include <stdio.h>

// 定义递归函数用于反向输出字符串
void reversePrint(const char* str) {
    // 检查字符串是否为空
    if (*str != '\0') {
        // 先递归调用函数处理字符串的剩余部分
        reversePrint(str + 1);
        // 然后输出当前字符
        printf("%c", *str);
    }
}

int main() {
    const char* myString = "Hello, World!";
    printf("Original String: %s\n", myString);
    printf("Reversed String: ");
    reversePrint(myString);
    printf("\n");
    return 0;
}

23 用递归函数计算第五个人的年龄

题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?

#include<stdio.h>
int age(int n)
{
	int c;
	if (n == 1)
		c = 10;
	else
		c = age(n - 1) + 2;
	return c;
}

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

24 求整数的位数和反转

给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字,

#include<stdio.h>
int main()
{
	long a, b, c, d, e, x;

	printf("请输入五位数:\n");
	scanf_s("%ld", &x);

	a = x / 10000;//万位
	b = x % 10000 / 1000;//千位
	c = x % 1000 / 100;//百位
	d = x % 100 / 10;//十位
	e = x % 10;//个位

	if (a != 0)
	{
		printf("逆序打印5位数为:%ld %ld %ld %ld %ld \n", e, d, c, b, a);
	}
	else if (b != 0)
	{
		printf("逆序打印4位数为:%ld %ld %ld %ld\n", e, d, c, b);
	}
	else if (c != 0)
	{
		printf("逆序打印3位数为:%ld %ld %ld \n", e, d, c);
	}
	else if (d != 0)
	{
		printf("逆序打印2位数为:%ld %ld \n", e, d);
	}
	else if (e != 0)
	{
		printf("逆序打印1位数为:%ld  \n", e);
	}
	return 0;
}

 

 25 回文数

一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。

#include<stdio.h>
int main()
{
	long int a, b, c, d, e, x;

	printf("请输入五位数:\n");
	scanf_s("%ld", &x);

	a = x / 10000;//万位
	b = x % 10000 / 1000;//千位
	c = x % 1000 / 100;//百位
	d = x % 100 / 10;//十位
	e = x % 10;//个位

	if (a == e&& b == d)
	{
			printf("该数是回文数!");
	}
	else
	{
		printf("该数不是回文数!");
	}

	return 0;
}

 

相关推荐

  1. C语言练习(2)

    2024-04-20 10:20:03       161 阅读
  2. 假期刷总结--2

    2024-04-20 10:20:03       58 阅读
  3. C语言程序设计Day16 万年历

    2024-04-20 10:20:03       50 阅读
  4. [笔试题] C语言部分练习2

    2024-04-20 10:20:03       22 阅读
  5. 100条经典C语言第一天(1-10

    2024-04-20 10:20:03       55 阅读
  6. 100条经典C语言第二天(10-20)

    2024-04-20 10:20:03       47 阅读
  7. C语言程序10

    2024-04-20 10:20:03       26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-20 10:20:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-20 10:20:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-20 10:20:03       82 阅读
  4. Python语言-面向对象

    2024-04-20 10:20:03       91 阅读

热门阅读

  1. web server apache tomcat11-09-JNDI Datasource

    2024-04-20 10:20:03       35 阅读
  2. web server apache tomcat11-08-JNDI Resources

    2024-04-20 10:20:03       38 阅读
  3. 如何在 Linux 和 Mac 终端命令中添加别名

    2024-04-20 10:20:03       34 阅读