C练习实例16-20题打卡

题目16:

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

思路:

  1. 运用代余除法的思维求最大公约数。
  2. 最小公倍数是两个整数之积除以最大功公约数。

代码:

#include"stdio.h"
int main()
{
	int m,n,i,j,max,min;
	scanf("%d%d",&m,&n);
	i=m>n?m:n;
	j=m<n?m:n;
	while(i%j!=0)
	{
		max=i%j;
		i=j;
		j=max;
	}
	max=j;
	min=(m*n)/max;
	printf("最大公约数=%d\t最小公倍数=%d",max,min);
}

结果:

在这里插入图片描述

题目17:

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

思路:

  1. 核心在我看来就是输入的时候可以避开空格不结束输入
  2. gets( )即可,可这是运用于已知字符串长度。
  3. 若是长度未知可能getchar( )更为合适。

代码:

法一:

#include"stdio.h"
int main()
{
	int num1=0,num2=0,num3=0,num4=0,i=0;
	char a[80];
	gets(a);
	while(*(a+i)!='\0')
	{
		if(*(a+i)>='a'&&*(a+i)<='z')
		num1++;
		else if(*(a+i)>='A'&&*(a+i)<='Z')
		num1++;
		else if(*(a+i)>='0'&&*(a+i)<='9')
		num2++;
		else if(*(a+i)==' ')
		num3++;
		else
		num4++;
		i++;
	}
	printf("字母个数=%d\t数字个数=%d\t空格个数=%d\t其他字符个数=%d",num1,num2,num3,num4);
	return 0;
}

法二:

#include"stdio.h"
int main()
{
	int num1=0,num2=0,num3=0,num4=0,i=0;
	char a;
	while((a=getchar())!='\n')
	{
		if(a>='a'&&a<='z')
		num1++;
		else if(a>='A'&&a<='Z')
		num1++;
		else if(a>='0'&&a<='9')
		num2++;
		else if(a==' ')
		num3++;
		else
		num4++;
		i++;
	}
	printf("字母个数=%d\t数字个数=%d\t空格个数=%d\t其他字符个数=%d",num1,num2,num3,num4);
	return 0;
}

结果:

在这里插入图片描述
在这里插入图片描述

题目18:

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

思路:

  1. 首先明晰已知的数,即a和n;
  2. 这给公式的计算是一个累加的过程,这个公式的每一项也是一个累加的过程。
  3. 把累加的过程弄清楚就行。

代码:

#include"stdio.h"
int main()
{
	int a,s=0,n,i;
	scanf("%d%d",&a,&n);
	int b=a;
	for(i=1;i<=n;i++)
	{
		s+=a;
		b=b*10;
		a+=b;
	}
	printf("%d",s);
	return 0; 
}

结果:

在这里插入图片描述

题目19:

一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。

思路:

  1. 完数的因子相加计算中不包含其本身。
  2. 找出所有因子累加计算,看结果是否与本身相等即可。

代码:

#include"stdio.h"
int main()
{
	int a,i,s;
	for(a=2;a<=1000;a++)
	{
		s=0;
		for(i=1;i<a;i++)
		{
			if(!(a%i))
			{
				s+=i;
			}
		}
		if(s==a)
		  printf("%d\t",a);
	}
}

结果:

在这里插入图片描述

题目20:

一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

思路:

  1. 首先明晰每一次的高度和是下落加反弹。
  2. 然后第十次落地时的高度要在累加的高度中减去最后一次反弹的高度。

代码:

#include"stdio.h"
int main()
{
	float a=100,s=0,i=a*1/2;
	int k;
	for(k=0;k<10;k++)
	{
		s+=a+i;
		a=i;
	    i=i*1/2;
	}
	printf("%f\t%f",s-a,a);
	return 0;
}

结果:

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值