题目16:
输入两个正整数m和n,求其最大公约数和最小公倍数。
思路:
- 运用代余除法的思维求最大公约数。
- 最小公倍数是两个整数之积除以最大功公约数。
代码:
#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:
输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
思路:
- 核心在我看来就是输入的时候可以避开空格不结束输入
- 用
gets( )
即可,可这是运用于已知字符串长度。 - 若是长度未知可能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个数相加),几个数相加有键盘控制。
思路:
- 首先明晰已知的数,即a和n;
- 这给公式的计算是一个累加的过程,这个公式的每一项也是一个累加的过程。
- 把累加的过程弄清楚就行。
代码:
#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以内的所有完数。
思路:
- 完数的因子相加计算中不包含其本身。
- 找出所有因子累加计算,看结果是否与本身相等即可。
代码:
#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次反弹多高?
思路:
- 首先明晰每一次的高度和是下落加反弹。
- 然后第十次落地时的高度要在累加的高度中减去最后一次反弹的高度。
代码:
#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;
}