例1 求前n项和
1+1/2+1/3+1/4+
有起点有终点 用for循环比较合适
#include<stdio.h>
int main()
{
int n;
int i;
double sum;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
sum+=1.0/i;
}
printf("%f",sum);
return 0;
}
如果是1-1/2+1/3-1/4+1/5+
设立一个符号位
#include<stdio.h>
int main()
{
int n;
int i;
double sum=0.0;
int sign=1;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
sum+=1/i;
sign=-sign;
}
printf("%f",sum);
return 0;
}
例2 求最大公约数
方法一 枚举
#include<stdio.h>
int main()
{
int a,b;
int min;
int i,t;
scanf("%d %d",&a,&b);
if(a>min){
min=b;
}else{
min=a;
}
for(i=1;i<=min;i++){
if(a%i==0){
if(b%i==0){
t=i;
}
}
}
printf("%d",t);
return 0;
}
方法2 辗转相除法
#include<stdio.h>
int main()
{
int a,b;
scanf("%d %d",&a,&b);
int t;
while(b!=0){
t=a%b;
a=b;
b=t;
}
printf("%d",a);
return 0;
}
整数分解
1 逆序分解
#include<stdio.h>
int main()
{
int n;
int d;
scanf("%d",&n);
do{
d=n%10;
printf("%d",d);
if(n>9){
printf(" ");
}
n/=10;
}while(n>0);
printf("\n");
return 0;
}
中间的空格 最后没空格
如果要是正序分解呢
思路一 先逆序 再用上面逆序输出
#include<stdio.h>
int main()
{
int n;
int d;
scanf("%d",&n);
int t,r;
//先把n逆序
do{
r=n%10;
t=t*10+r;
n/=10;
} while(n>0);
printf("%d\n",t);
//再逆序输出每位数
do{
d=t%10;
printf("%d",d);
if(t>9){
printf(" ");
}
t/=10;
}while(t>0);
printf("\n");
return 0;
}
看似可以 7000 只能输出 7
而且不好 换个想法
#include<stdio.h>
int main()
{
/*12345/1000 -> 1
12345%1000->2345*/
int x,t;
scanf("%d",&x);
t=x;
//求出被除数
int mask=1;
while(x>9){
x/=10;
mask*=10;
}
//printf("%d\n",mask);
//输出每一位 最后不带空格
int d;
do{
d=t/mask;
printf("%d",d);
if (mask>0){
printf(" ");
}
t%=mask;
mask/=10;
}while(mask>0);
return 0;
}