【程序16】
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
分析:首先介绍一种方法叫辗转相除法(欧几里得算法);
从原理可以看出,有两个循环:
1.最后的余数要等于0;——>对应一个while(r !=0)的循环
2.除数和余数的辗转相除。——>替换变量反复相除的循环
因为最后有用的只有b和r的值,所以可以将b的值赋给a,再将r的值赋给b。
#include
int main(int argc, char* argv[])
{
int m,n,i;
int num1,num2;
printf("请输入第一个正整数m:");
scanf("%d",&m);
printf("请输入第二个正整数n:");
scanf("%d",&n);
num1 = m;
num2 = n;
//注意这里要换一个变量,以便于之后用到原来的m和n的值;
if(num1 > num2)
{
i = num1;
num1 = num2;
num2 = i;
}//这样就保证了被除数num2 比 除数num1 大
while(num1 !=0)
{
i = num2 % num1;
num2 = num1;
num1 = i;
}
printf("两个数的最大公约数是:%d",num2);
//最大公约数*最小公倍数 = 两个数的乘积;
printf("两个数的最小公倍数是:%d",(m*n) / num2);
printf("\n");
}
【程序17】
题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
#include
int main(int argc, char* argv[])
{
printf("请输入一串字符,输入回车符即止:");
int letters =0;
int digits = 0;
int spaces =0;
int others = 0;
char c;
while((c=getchar()) != '\n')
{
if(((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')))
{
letters++;
}
else if((c >'0') && (c < '9'))
{
digits ++;
}
else if(c ==' ')
{
spaces++;
}
else
others ++;
}
printf("字母有:%d,数字有:%d,空格有:%d,其他字符有:%d",letters,digits,spaces,others);
}
注意:是单引号不是双引号!还有字母判断要加上等于号!
运行结果:
【程序18】
题目:求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制。
#include
#include
int main(int argc, char* argv[])
{
int a;
int n;
int i;
int sum = 0;
int b = 0;
printf("请输入a的值:");
scanf("%d",&a);
printf("请输入相加的个数:");
scanf("%d",&n);
b = a;
for(i = 0; i < n; i++)
{
if(i == 0)
{
sum = a;
}
else
{
a = b + a * 10 ;
sum = sum +a ;
}
}
printf("The total is %d",sum);
}
作为一个小白,这个题目真是纠结了好久,每次都是输出相加的最后一个数。纠结了好久要怎样才能把前面的数给加上放到sum里面,不过终于在我仔细的分析之下给编出来了。之前写的是:
for(i = 0;i < n; i++)//其中n为相加的个数
{
sum = sum + a * math.pow(10,i);//这里a是用户输入的数字
}
错误在于,没有把前面的数给加进去。(其实除了这个方法,我觉得创一个数组储存每次的数,然后再加起来也行。)
运行结果: