f(n)=1/n的累加,这样的计算如何用程序实现呢?
注意:1/n不是整数,不可以用int,否则会变成0
#include <stdio.h>
int main ()
{
int i;
int n;
double sum = 0;
scanf("%d",&n);
for (i=1;i<=n;i++)
{
sum += 1.0/i; \\注意这里用1.0,让整个式子的结果变成浮点数
}
printf("f(%d)=%f\n",n,sum);
return 0;
}
相对于前面的问题而言,变化的只有正负号,还是交替出现的,那加入一个变量sign,让它每做完一个循环就变成了-sign.
#include <stdio.h>
int main ()
{
int i;
int n;
int sign = 1 ;
double sum = 0;
scanf("%d",&n);
for (i=1;i<=n;i++)
{
sum += sign*1.0/i;
sign = -sign;
}
printf("f(%d)=%f\n",n,sum);
return 0;
}
最大公约数
方法一:枚举法
#include <stdio.h>
int main ()
{
int a,b;
int min;
scanf("%d %d",&a,&b);
if(a>b){
min = b;
}else{
min = a;
}
int ret = 0;
int i;
for (i=1;i < min; i++){
if(a%i == 0) {
if(b%i == 0){
ret = i;
}
}
}
printf("%d和%d的最大公约数是%d\n",a,b,ret);
}
方法二:辗转相除法
欧几里德算法又称辗转相除法。计算公式gcd(a,b) = gcd(b,a mod b)。有赖于定理:两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。
由以上得步骤:
- 如果b等于0,计算结束,a就是最大公约数;
- 否则,计算a除以b的余数,然后令a=b,b=余数;
- 回到第一步;
#include <stdio.h>
int main ()
{
int a,b;
int t;
scanf("%d %d",&a,&b);
while (b!=0){
t = a%b;
a = b;
b = t;
}
printf("gcd=%d\n",a);
}
以上来自翁恺老师的慕课
by the way ,辗转相除法的证明:
a可以表示成a = kb + r(a,b,k,r皆为正整数,且r<b),则r = a mod b
假设d是a,b的一个公约数,记作d|a,d|b,即a和b都可以被d整除。
而r = a - kb,两边同时除以d,r/d=a/d-kb/d=m,由等式右边可知m为整数,因此d|r
因此d也是b,a mod b的公约数
假设d是b,a mod b的公约数, 则d|b,d|(a-k*b),k是一个整数。
进而d|a.因此d也是a,b的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。
正序整数分解
例如:12345,输出变成 1 2 3 4 5
#include <stdio.h>
int main ()
{
int x;
scanf("%d",&x);
int mask = 1;
int t = x;
while(t>9){
t /=10;
mask *=10;
}
printf("x=%d,mask=%d\n",x,mask);//x不变,mask可以看出x几位数
do{
int d =x/mask;
printf("%d",d);
if(mask>9){
printf("");
}
x %= mask;
mask /=10;
}while(mask > 0);
printf("\n");
}