用递归编写辗转相除法求最大公约数
题目:
求a和b的最大公约数。1<=a,b<=10^18
辗转相除法:
记a,b的最大公因数为gcd(a,b)。
有定理:
gcd(a,0)=a
gcd(a,b)=gcd(b,a%b) (b!=0)
代码:
#include<stdio.h>
int gcd(int n,int m);
int main()
{
int n,m;
printf("input two integer:");
scanf("%d %d",&n,&m);
printf("the greatest common divisor gcd is %d",gcd(n,m));
return 0;
}
int gcd(int n,int m)
{
int a;
if(n<m)
{
a=n;
n=m;
m=a;
}
if(n%m==0)
return m;
else
{
a=n;
n=m;
m=a%m;
gcd(n,m);
}
}
感想:
比暴力枚举效率高多了,同是也让我对递归更加熟练了
求和
题目:
第一行读入两个整数n,m。
第二行读入n个整数。
第三行到第m+2行每行读入两个整数xi,yi。
输出m行,每行输出一个整数,表示a[xi]+a[xi+1]+…+a[yi]
代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
int n,m,i,j,a[100],xi,yi,sum[100]={0};
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)//将a1到an的和记忆下来
{
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
}
for(j=0;j<m;j++)
{
scanf("%d%d",&xi,&yi);
printf("%d\n",sum[yi]-sum[xi-1]);
}
return 0;
}