C语言笔记 10

求前n项之和


程序设计

  • f(n)=1+\frac{1}{2}+\frac{1}{3}+\frac{1}{4}+…+\frac{1}{n}

起点终点数字已知,用for循环最合适

#include <stdio.h>

int main()
{
    int n;
    int i;
    double sum = 0.0;

    scanf("%d", &n);
    for ( i=1; i<=n; i++ ) {
        sum += 1.0/i;
    }

    pritnf("f(%d)=%f\n", n, sum);

    return 0;
}

int n;

int i;

double ret=0.0;

 

scanf("%d", &n);

for ( i=1; i<=n; i++ ) {

        ret += 1.0/i;

}

printf("%f\n", ret);

  • f(n)=1-\frac{1}{2}+\frac{1}{3}-\frac{1}{4}+…+\frac{1}{n}

法一 

#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 += sign*1.0/i;
        sign = -sign;
    }
    printf("f(%d)=%f\n", n, sum);

    return 0;
}

法二

#include <stdio.h>

int main()
{
    int n;
    int i;
    double sum=0.0;
    double sign=1.0;

    scanf("%d", &n);
    for( i=1; i<=n; i++ ) {
        sum += sign/i;
        sign = -sign;
    }

    printf("f(%d)=%f\n", n, sum);

    return 0;
}

整数分解


正序分解整数

输入一个非负整数,正序输出他的每一位数字

eg.输入:13425;输出:1 3 4 2 5

step1.逆序输出

#include <stdio.h>

int main()
{
    int x;
    scanf("%d", &x);

    do {
        int d = x%10;
        printf("%d", d);
        x /= 10;
    } while ( x>0 );

    return 0;
}

此时,输出结果最末尾的1(以13425为例)后面也会有空格

改进:

#include <stdio.h>

int main()
{
    int x;
    scanf("%d", &x);

    do {
        int d = x%10;
        printf("%d", d);
        if( x > 9 ) {
            printf(" ");
        }
        x /= 10;
    } while ( x>0 );
    printf("\n");

    return 0;
}

现在1后就没有空格了 


step2.将逆序正过来

先逆序再逆序

#include <stdio.h>

int main()
{
    int x;
    scanf("%d", &x);

    do {
        int d = x%10;
        printf("%d", d);
        if ( x>9 ) {
            printf(" ");
        }
        x /= 10;
    } while ( x>0 );
    printf("\n");

    return 0;
}

但是,当输入值为70000时,输出结果是7而不是想要的00007,上述程序只适用于末尾不是0的数字

改进:

x =13425;

13425 / 10000  >>  1;

13425 % 10000  >>  3425;

10000 / 10  >>  1000;

3425 / 1000  >>  3;

3425 % 1000  >>  425;

1000 / 10  >>  100;

425 / 100  >>  4;

425 % 100  >>  25;

100 / 10  >>  10;

25 / 10  >>  2;

25 % 10  >>  5;

10 / 10  >>  1;

5 / 1  >>  5;

5 % 1  >>  5;

1 / 10  >>  0;

#include <stdio.h>

int main()
{
    int x;
    scanf("%d", &x);

    x=13425;
    int mask=10000;
    do {
        int d = x/mask;
        printf("%d", d);
        if( x>9 ) {
            printf(" ");
        }
        x %= mask;
        mask /= 10;
    } while ( x>0 );

    printf("\n");

    return 0;
}

输入70000,结果依旧是7

原因:

70000 / 10000  >>  7

70000 % 10000  >>  0

改进:

#include <stdio.h>

int main()
{
    int x;
    scanf("%d", &x);

    x=13425;
    int mask=10000;
    do {
        int d = x/mask;
        printf("%d", d);
        if( mask>9 ) {
            printf(" ");
        }
        x %= mask;
        mask /= 10;
    } while ( mask>0 );

    printf("\n");

    return 0;
}

step3.将mask改成可以自己变的值

法一:pow

#include <stdio.h>

int main()
{
    int x;
    scanf("%d", &x);

    int cnt=0;
    do {
        x /= 10;
        cnt++;
    } while (x>0);
    printf("cnt=%d/n", cnt);
    int mask = pow(10, cnt-1);
    do {
        int d=x/mask;
        printf("%d", d);
        if( mask>9 ){
            printf(" ");
        }
        x %= mask;
        mask /= 10;
    }while (mask>0);

    printf("\n");

    return 0;
}

法二:

#include <stdio.h>

int main()
{
    int x;
    scanf("%d", &x);

    int cnt=0;
    int mask=1;
    int t=x;
    while( t>9) {
        t /= 10;
        mask *= 10;
    } 
    printf("mask=%d/n", mask);
    int mask = pow(10, cnt-1);
    do {
        int d=x/mask;
        printf("%d", d);
        if( mask>9 ){
            printf(" ");
        }
        x %= mask;
        mask /= 10;
    }while (mask>0);

    printf("\n");

    return 0;
}

求最大公约数


枚举

  1. 设t为2
  2. 如果u和v都能被t整除,则记下这个t
  3. t加1后重复第2步,直到t等于u或v
  4. 曾经记下的最大的可以同时整除u和v的t就是gcd

int a,b;

int min;

 

scanf("%d %d", &a, &b);

if( a<b ) {

        min = a;

}else{

        min = b;

}

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);

辗转相除

  1. 如果b等于0,计算结束,a就是最大公约数
  2. 否则,计算a除以b的余数,让a等于b,而b等于那个余数
  3. 回到第一步

 a               b                t

12             18              12

18             12               6

12              6                0

 6               0

最大公约数=a=6

#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);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值