一.求两个数最大公约数
问题描述
输入两个数,输出这两个数的最大公约数
解题思路
辗转相除法;它的具体做法是:用较大数除较小数,再用除数去除出现的余数(第一余数),再用第一余数去除出现的余数(第二余数),如此反复,直到最后余数是0为止。那么最后的除数就是这两个数的最大公约数。比如有两个数24和18,24/18=1·····6;再用18/6=3·····0;这时余数已经是0了,那么最大公约数就是最后一个除数6;
画个图理解一下:
代码:
#include<stdio.h>
int main()
{
int a=0,b=0;
scanf("%d %d",&a,&b);
int max1,min1;
if(a>b)
{
max1=a;
min1=b;
}
else
{
max1=b;
min1=a;
}
int yu;
while(max1%min1)//只要余数不为0,就为真就一直循环
{
yu=max1%min1;
max1=min1;
min1=yu;
}
printf("最大公约数是:%d\n",min1);//只有当余数为0时,才会执行这一步
}
运行结果是:
二.求正负号变化的分数之和
问题描述
解题思路
法一
1.符号一直在有规律变化,那么我们干脆分开来算,把所有的加法和减法分开算出来,最后相减就可以了。
代码:
#include<stdio.h>
int main()
{
double sum1=0.0;
double a=0.0;
for(int i=1;i<=100;)
{
a=1.0/i;//这里一定要是1.0而不能是1,如果是1那就默认是整数型了,a的值就一直会是0
sum1=sum1+a;
i=i+2;
}
double b=0;
double sum2=0;
for (int j=2;j<=100;)
{
b=1.0/j;
sum2=sum2+b;
j=j+2;
}
printf("分母是奇数的和是%lf 分母是偶数的和是%lf\n",sum1,sum2);
printf("最终的结果是:%lf",sum1-sum2);
}
运行结果是:
法二
我们发现加减法的变换是有规律的,那么我们可以定义一个flag值,让其随之变化1,-1即可。
代码:
#include<stdio.h>
int main()
{
double a,b,sum;
int flag=1;
for (int i=1;i<=100;i++)
{
a=1.0/i;
b=flag*a;
sum=sum+b;
flag=-flag;//加减号是轮流来的,所以每循环一次换一次就可以了
}
printf("最后结果是:%lf",sum);
}
运行结果是:
两种方法结果相同