C语言复习查漏之循环

 

  • while/do while

问题引入:输入一个数,输出这个数的位数。

考虑用while循环去做:

#include 
int main(){
    int i=0;
    int x;
    scanf("%d", &x);

    i++;        //这两条语句是满足输入0时的情况,无论输入是什么都先给计数器i加一
    x /= 10;

    while(x > 0){
        i++;
        x /= 10;       //通过不断除以10划去最右边的一位数,并使i加一

}
printf("%d\n", i);
    return 0;
}

考虑用do while循环去实现:

#include 
int main(){
    int i=0;
    int x;
    scanf("%d", &x);
    do{
        i++;            //使用do while循环可以使得不论输入什么数字都先执行一次循环体
        x /= 10;
}while(x>0);            //当括号内的条件满足时继续循环。
   printf("%d\n", i);
   return 0;
}
  • for循环

问题:输入一个数字n,输出n的阶乘。

用while循环是这样实现的:

#include 
int main(){
    int i = 1;
    int fact = 1;
    int n;
    scanf("%d", &n);
    while(i <= n){
    fact *= i;
    i++;
}
    printf("%d\n", fact);
    return 0;
}

用for循环是这样实现的:

#include 
int main(){
    int i;
    int fact = 1;
    int n;
    scanf("%d", &n);
    for(i = 1; i <= n; i++ ){
    fact *= i;
}
    printf("%d\n", fact);
    return 0;
}

循环变量i只在for循环内部使用了,所以我们可以将i的定义放在for循环内部,这只在C99中被允许。

即:for(int i = 1; i <= n; i++){}

另外的一个改进就是既然乘以1等于不乘,我们就可以使i从2开始递增,这样可以少跑一轮循环。

for中的每一个表达式都是可以省略的,而for(;条件;)==while(条件)

最后,如果有固定的循环次数,用for循环;如果必须执行一次的话用do-while;其他情况的话就用while。

  • 循环的应用

题一:编程实现如下函数的累加

#include 

int main(){
    int n;
    int i;
    double func = 1.0;
    scanf("%d", &n);
    for(i=2; i<=n; i++){
        func += 1.0/i;
}
    printf("f(n)=%f\n", func);
    return 0;
}

题二:若函数为下式则有:

#include 

int main(){
    int n;
    int i;
    double func = 1.0;
    scanf("%d", &n);
    for(i=2; i<=n; i++){
        if(i%2 == 0)
        func += -1.0/i;
        else func += 1.0/i;
}
    printf("f(n)=%f\n", func);
    return 0;
}

//或者这样
#include 

int main(){
    int n;
    int i;
    double func = 1.0;
    double sign = -1;
    scanf("%d", &n);
    for(i=2; i<=n; i++){
        func += 1.0*sign/i;
        sign = -sign;            //直接设置一个标志每次循环取反
}
    printf("f(n)=%f\n", func);
    return 0;
}

题三:正序分解整数:输入一个非负整数,正序输出它的每一位数字

一般的思路可以是先将整数逆序,然后逐个取各位数输出,但是不适合末尾是0的整数。将整数逆序的程序实现如下:

#include 

int main(){
    int x;
    int t=0;
    scanf("%d", &x);
    do{
        int d = x%10;
        t = t*10+d;        //记录逆序后的t值
        x /= 10;
}while(x>0);
    printf("%d", t);
    return 0;
}
//所以正确的实现方法为设置一个mask解决
#include 

int main(){
    int x;
    int i;
    int mask = 1;
    int t;
    int d;
    scanf("%d", &x);
    t = x;

//先求得mask的值,利用求整数位数的小程序
    do{
        t /= 10;
        mask *= 10;
}while(t > 9);
// printf("%d\n", mask);

//正序输出各位数小程序
    do{
        d = x/mask;
        printf("%d", d);
        if(x > 9)         //处理最后需要输出的空格,即只允许x不是各位数时才输出空格。
            printf(" ");
        x %= mask;
        mask /= 10;
}while(mask > 0);
    printf("\n");
    return 0;
}

题四:求最大公约数

方法一:穷举法

#include 

int main(){
    int a, b;
    int min;
    int ret;
    int i;
    scanf("%d %d", &a, &b);
    if(a < b) min = a;
    else min = b;
    for(i=min; i>1; i--){
        if(a%i == 0){
        if(b%i == 0){
            ret = i;
            break;
}
}
}
    printf("%d", ret);
    return 0;
}

方法二:辗转相除法

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

#include 

int main(){
    int a, b;
    int t;
    int ret;
    scanf("%d %d", &a, &b);
    do{
        t = a%b;
        a = b;
        b = t;
}while(b != 0);   //循环终止条件是b==0
     ret = a;
     printf("%d\n", ret);
     return 0;
}

整理自MOOC

你可能感兴趣的:(C语言复习)