C语言练习(二)

第十三题:

题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数 本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。

思路解析:首先我们知道是三位数,那么我们就从100到999便利所有数字,找出符合条件的即可,再然后个依据题目意思,我们需要求出正在计算的数的百分位,十分位,个分位,使得他们的立方等于本身即可。

#include <stdio.h>
int main()
{	
	int i, x, y, z;
	int count = 0;
	for (i = 100; i <= 999; i++)
	{
		x = i % 10;
		y = i % 100 / 10;
		z = i / 100;
		if ((x * x * x+ y * y * y + z * z * z) == i)
		{
			count++;
			printf("水仙花数:%d\n", i);	
		}
	}
	//printf("\n");
	printf("个数为:%d", count);

	return 0;
}

第十四题:

题目:将一个正整数分解质因数。例如:输入 90,打印出 90=2*3*3*5。

思路解析:首先想到的是用for循环遍历2到输入的数里所有的数,当number%i为0时,意味着我们找到了所有的因数,然后不断用number/i,就是用一个while循环

#include <stdio.h>
int main()
{
	int number;
	int i;
	printf("输入数字:");
	scanf_s("%d", &number);
	for (i = 2; i <= number; i++)
	{
		while (number % i == 0)
		{
			number = number / i;
			printf("%d ", i);			
		}
	}
	return 0;
}

第十五题:

题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

思路解析:首先题目已经明确了我们药用用运算符的嵌套去完成,那么我们就肯定要使用三目运算符。

#include <stdio.h>
int main()
{
	int score;
	char data;
	printf("输入成绩:");
	scanf_s("%d", &score);
	data = (score >= 90) ? 'A' : ((score > 60) ? 'B' : 'C');
	printf("%c\n", data);
	return 0;
}

第十六题:

题目:输入两个正整数m和n,求其最大公约数和最小公倍数。

思路解析:这个在网上搜一下相关的的公式其实还蛮好写的,一开始用的直接是for循环求解,后面看官方给的思路,就是用了官方的思路

#include <stdio.h>
int main()
{
    int datax, datay;
    int max_data, min_data;
    printf("输入两个数: ");
    scanf_s("%d %d", &datax, &datay);
    
    // 保存原始值,因为后面会修改
    int original_x = datax;
    int original_y = datay;
    
    // 确保datax是较大的数
    if (datax < datay) {
        int temp = datax;
        datax = datay;
        datay = temp;
    }
    
    // 使用欧几里得算法求最大公约数
    int remainder;
    while (datay != 0) {
        remainder = datax % datay;
        datax = datay;
        datay = remainder;
    }
    max_data = datax;  // 最大公约数
    
    // 计算最小公倍数
    min_data = (original_x * original_y) / max_data;
    
    // 输出结果
    printf("最大公约数:%d\n", max_data);
    printf("最小公倍数:%d\n", min_data);
    
    return 0;
}

第十七题:

题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

思路解析:这个思路还是很好想的,但是有些细节问题要注意。首先我们读取个数,我们肯定要变量来统计,符合条件就+1,但是我们输入的是一行字符串,所以我们要考虑到‘\0’的存在,然后我们在打印换行的时候也要考虑到‘’\n的情况。然后我在输入字符串的时候一直出问题,后面发现要写成scanf_s("%[^\n]", str, (unsigned)sizeof(str));  还有在for循环的时候,一开始for (i = 0; str[i] != '\0'; i++)里面的str[i],我本能的写成了i导致一直出问题,后面调试发现这个条件不会成立的

#include <stdio.h>
int main()
{
	char str[100];
	int i, c;
	int english = 0, space = 0, number = 0, other = 0;
	printf("输入一行字符:");
	scanf_s("%[^\n]", str, (unsigned)sizeof(str));  // 读取直到换行符
	for (i = 0; str[i] != '\0'; i++)
	{
		c = str[i];
		if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
		{
			english++;
		}
		else if (c >= '0' && c <= '9')
		{
			number++;
		}
		else if (c == ' ')
		{
			space++;
		}
		else
		{
			if (c != '\n' && c != '\0')
			{
				other++;
			}
		}

	}	
	printf("英文字母:%d\n", english);
	printf("数字:%d\n", number);
	printf("空格:%d\n", space);
	printf("其他字符:%d\n", other);

	return 0;
}

第十八题:

题目:求 s=a+aa+aaa+aaaa+aa...a 的值,其中 a 是一个数字,例如 2+22+222+2222+22222 (此时共有5个数相加),几个数相加有键盘控制。

思路解析:这个用循环,有几个数相加我们就循环几次,我们看举出的例子:2,22,222....这些都可以前一个数*10+2,就是我们把初始值*10+初始值就可以得到下一个数,下一个数*10+初始值就可以得到下下个数依次类推。但是要注意,int类型可能会有点小

#include <stdio.h>
int main()
{
	int sum = 0;
	int count, a, i, temp = 0;
	printf("输入几个数相加:");
	scanf_s("%d", &count);
	printf("输入初始数值:");
	scanf_s("%d", &a);
	for (i = 1; i <= count; i++)
	{
		temp = temp * 10 + a;
		sum += temp;
	}
	printf("总和:%d\n", sum);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值