循环控制 例题解析

例题1.输出以下图形。

            *   

                    * * *     

                  * * * * *    

                * * * * * * *   

                  * * * * *

                    * * *  

                    *  

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

void main()
{
    int i, j, k;
    for (i = 0; i <= 3; i++)
    {
        for (j = 0; j <= 2 - i; j++)     putchar(' ');
        for (k = 0; k <= 2 * i; k++)     putchar('*');
        putchar('
');
    }
    for (i = 0; i <= 2; i++)
    {
        for (j = 0; j <= i; j++)        putchar(' ');
        for (k = 0; k <= 4 - 2 * i; k++)        putchar('*');
        putchar('
');
    }

    system("pause");
}

2. 计算n的阶乘

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

void main()
{
    int n, factorial = 1;
    scanf("%d", &n);

    while (n != 0)
    {
        factorial *= n;
        --n;
    }
    printf("%d", factorial);

    system("pause");
}

3.求 1到 100之间的奇数之和、偶数之和。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

void main()
{
    int odd_number = 0;
    int even_number = 0;
    for (int i = 1; i <= 100; i++)
    {
        if (i % 2)    //奇数
        {
            odd_number += i;
        }
        else
            even_number += i;
    }
    printf("奇数和为%d
", odd_number);
    printf("偶数和为%d", even_number);

    system("pause");
}

4. 输入一行字符,统计其中的英文字母、数字、空格和其他字符个数。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

void main()
{
    char x;
    int letter = 0, digit = 0, space = 0, other = 0;
    printf("please input a string:
"); 

    while ((x = getchar()) != '
')
    {
        if (x >= 'A'&&x <= 'Z' || x >= 'a'&&x <= 'z')
        {
            letter++;
        }
        else if (x >= '0'&&x <= '9')
        {
            digit++;
        }
        else if (x == ' ')
        {
            space++;
        }
        else
            other++;
    }

    printf("英文字符个数为%d
", letter);
    printf("数字字符个数为%d
", digit);
    printf("空格字符个数为%d
", space);
    printf("其他字符个数为%d
", other);

    system("pause");
}

5. 用循环语句编写求 20 + 21 + 22 + 23 + …… + 263 的程序。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

void main()
{
    double sum = 1;
    double temp = 1;
    for (int i = 0; i<63; i++)
    {
        temp *= 2;
        sum += temp;
    }
    printf("和为:%g", sum);  //格式字符 %e %E %g %G 与 %f 作用相同,可以互换

    system("pause");
}

6.求1! + 2! + 3! + ... + 20! 。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int factorial(int num)  //先写一个阶乘函数,然后用for循环每次调用这这个函数即可 { int sum = 1; for (int i = 1; i <= num; i++) sum *= i; return sum; } void main() { int mul = 0; for (int i = 1; i<21; i++) { mul += factorial(i); } printf("和为:%d", mul); system("pause"); }

7.计算以下公式前n 项值    1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + 1/7 - …… + 1/n-1 - 1/n+1。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

double fun(int n)
{
    int x = 1, ch = 1;
    double sum = 0;
    for (; x <= n; x++)
    {
        sum = sum + 1.0 * ch / x;
        ch = -ch;
    }
    return sum;
}

void main()
{
    int n;
    scanf("%d", &n);
    printf("%f", fun(n));

    system("pause");
}

8. 有一分数序列 2/1, 3/2, 5/3, 8/5, 13/8, 21/13求出这个数列的前20项之和。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

void main()
{
    float a[21] = { 0 };
    float sum = 0;
    a[0] = 1;
    a[1] = 2;
    for (int i = 2; i<21; i++)
    {
        a[i] = a[i - 1] + a[i - 2];
    }
for (int i = 0; i<20; i++) { sum += a[i + 1] / a[i]; } printf("前二十项之和为%f", sum); system("pause"); }

9. 判断一个数是否是素数

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int prime(int num) { for (int i = 2; i <= sqrt(num); i++) { if (num%i == 0) return 0; //返回0 非素数 } return 1; } void main() { int num; printf("Enter a integer number:"); scanf("%d", &num); if (prime(num)) printf("是素数"); else printf("不是素数"); system("pause"); }

10. 求1-100之间所有非素数的和

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int prime(int num) { for (int i = 2; i <= sqrt(num); i++) { if (num%i == 0) return 0; } return 1; }
void main() {
int sum = 0; for (int i = 1; i<101; i++) { if (!prime(i)) { sum += i; } } printf("非素数之和为:%d", sum); system("pause"); }

11.验证任意偶数为两个素数之和,并输出这两个素数。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int prime(int num)
{
    for (int i = 2; i <= sqrt(num); i++)
    {
        if (num%i == 0)
            return 0;
    }
    return 1;
}

void main()
{
    int num;
    printf("Enter a even number:");
    scanf("%d", &num);
    
    for (int i = 2; i <= num; i++)
    {
        if (prime(i))
            if (prime(num - i))
            {
                printf("%d == %d + %d
", num, num - i, i);
                break;
            }
    }

    system("pause");
}

12.输入两个正整数 m 和 n,求其最大公约数和最小公倍数。

  1)最大公约数:指两个或多个整数共有约数中最大的一个。

  2)最小公倍数:它与最大公约数的乘机为所求数之积。

  3)比如求 x,y的最大公约数和最小公倍数  x * y = 最小公倍数 * 最大公约数

辗转相除法辗转相除法

int gcd(int a, int b) //辗转相除法

{
    if (a % b == 0)
        return b;
    else
        return gcd(b, a%b);
}

         辗转相减法

int gcd(int a, int b)
{
    while (a != b)  //若a = b,则a(或b)即为两数的最大公约数
    {
        if (a > b)    a = a - b;
        else   b = b - a;
    }
    return a;
}

穷举法

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int gcd(int a, int b)
{
    int  tmp;
    tmp = (a > b) ? b : a;
    while (tmp > 0)
    {
        if (a % tmp == 0 && b % tmp == 0)//只要找到一个数能同时被a,b所整除,则中止循环
            break;
        tmp--;
    }
    return tmp;
}

int lcm(int u, int v) //求最小公倍数
{
    int tmp = gcd(u, v);
    return u * v / tmp;
}

int main(void)
{
    int m, n;
    scanf("%d%d", &m, &n);

    printf("最大公约数:%d
", gcd(m, n));
    printf("最小公倍数:%d
", lcm(m, n));

    system("pause");
}

13.打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数, 其各位数字立方和等于该数本身。

例如 153是一个水仙花数,因为 153 =13 + 53 + 33

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int fcn(int num)
{
    return num == pow((double)(num % 10), 3) 
        + pow((double)(num / 10 % 10), 3) 
        + pow((double)(num / 100), 3);
}

void main()
{
    for (int i = 100; i <= 999; i++)
    {
        if (fcn(i))        printf("%5d", i);
    }

    system("pause");
}

14.一个数恰好等于它的平方数的右端,这个数被称为同构数。如 5 的平方是25, 5是25中的右端的数, 5就是同构数。找出1~1000之间的全部同构数

#include <stdio.h>
#include <stdlib.h>

int main()
{
    long long i, j, k;
    k = 10;
    for (i = 1; i <= 100000; i++)
    {
        if (i == k) k *= 10;
        j = i*i;
        if (j%k == i) printf("%lld	%lld
", i, j);
    }
    system("pause");
}

15.完数:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,28 的因子为1、2、4、7、14而28 = 1 + 2 + 4 +7 + 14,因此28是“完数”。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int fun(int num)
{
    int arr[100] = { 0 };
    int index = 0;
    int sum = 0;
    for (int i = 1; i<num; i++)
    {
        if (num%i == 0)
        {
            sum += i;
            arr[index++] = i; //把所有的整数因子存于数组中
        }

    }
    if (sum == num)
    {
        printf("  %5d its factors are", num);
        for (int i = 0; i<index;i++)
        {
            printf("%5d", arr[i]);
        }
        return 1;
    }
    else 
        return 0;
}
void main()
{
    for (int i = 1; i <= 1000; i++)
    {
        if (fun(i))
        {
            printf("
");
        }
    }

    system("pause");
}

16.3025这个数具有一种独特的性质:将它平分为两段,即30和25,使之相加后求平方,即(30 + 25)的平方,恰好等于3025本身。请求出具有这样性质的全部四位数。

#include <stdio.h>
#include <stdlib.h>

int fun(int num)
{
    int num1 = num / 100;
    int num2 = num % 100;
    if (num == (num1 + num2)*(num1 + num2))
    {
        return 1;
    }
    else
        return 0;
}
void main()
{

    for (int i = 1000; i <= 9999; i++)
    {
        if (fun(i))
        {
            printf("%6d
", i);
        }
    }

    system("pause");
}

17.两位数13和62具有很有趣的性质:把它们个位数字和十位数字对调,其乘积不变,即13 * 62 = 31 * 26。 编程序求共有多少对这种性质的两位数。

(个位与十位相同的不在此列,如11、22,重复出现的不在此列,如 13 * 62与62 * 13)。

#include <stdio.h>
#include <stdlib.h>

int fun2(int num)
{
    return num % 10 * 10 + num / 10;
}

int fun(int num1, int num2)
{
    if (num1 / 10 == num1 % 10 && num2 / 10 == num2 % 10)        return 0;
    if (num1 * num2 == fun2(num1) * fun2(num2))        return 1;
    else
        return 0;
}

void main()
{
    int num = 0;
    for (int i = 10; i<100; i++)
    {
        for (int j = i; j<100; j++)
        {
            if (fun(i, j))
            {
                printf("%5d,%5d
", i, j);
                num++;
            }
        }
    }
    printf("共有%d对", num);

    system("pause");
}

18.给出一个不多于4位的正整数,要求:①  求出它是几位数  ②  分别打印出每一位数字   ③  按逆序打印出各位数字。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int Getweishu(int num)
{
    int count = 0;
    while (num)
    {
        count++;
        num /= 10;
    }
    return count;
}
void ReprintNum(int num) { while (num) { printf("%d ", num % 10); num = num / 10; } }
void printNum(int num) { int temp = 1; while (num / temp >= 10) { temp *= 10; } while (temp >= 1) { printf("%d ", num / temp % 10); temp /= 10; } }
void main() { int num; printf("please input num : "); scanf("%d", &num); printf("%d ", Getweishu(num)); printNum(num); printf(" "); ReprintNum(num); system("pause"); }

19.在一个程序中计算出给定误差小于0.1,0.01,0.001,0.0001,0.00001 时,下式的值

提示:本题中误差指前 n+1项之积与前 n项积之差。

#include <stdio.h>
#include <stdlib.h>
void fun(double num)
{
    double n = 1;
    double J1 = 2 * n *(2 * n + 2) / (2 * n + 1) / (2 * n + 1);
    double J2 = 2 * n *(2 * n + 2) / (2 * n + 1) / (2 * n + 1);
    do
    {
        n = n + 1;
        J1 = J2;
        J2 *= 2 * n *(2 * n + 2) / (2 * n + 1) / (2 * n + 1);

    } while (J1 - J2 > num);

    printf("结果是%f
", J1);
}
void main()
{
    fun(0.1);
    fun(0.01);
    fun(0.001);
    fun(0.0001);
    fun(0.00001);
    system("pause");
}

20.验证歌德巴赫猜想。一个充分大的偶数(大于或等于6)可以分解为两个素数之和。试编程序,将 6至50之间全部偶数表示为两个素数之和。质数(素数)是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int prime(int num)
{
    for (int i = 2; i <= sqrt((double)num); i++)
    {
        if (num%i == 0)
        {
            return 0;
        }
    }
    return 1;
}

void main()
{

    for (int i = 6; i<51; i = i + 2)
    {
        for (int j = 2; j<i; j++)
        {
            if (prime(j) && prime(i - j))
            {
                printf("%d = %d + %d
", i, j, i - j);
                break;
            }
        }
    }
    system("pause");
}

 

21.函数fun功能:计算下式前n项和作为函数值返回。

s=(1 * 3)/(2 * 2) + (3 * 5)/(4 * 4) + (5 * 7)/(6 * 6) + …… + (2 * n - 1)*(2 * n + 1) / (2 * n)*(2 * n)

double fun(int n)
{
    double s = 0;
    for (int i = 1; i <= n; i++)
    {
        s = s + (2.0 * i - 1)*(2.0 * i + 1) / ((2.0 * i)*(2.0 * i));
    }
    return s;
}

22.函数fun的功能是:计算下式前n项和作为函数值返回

s = 1 * 3 / (2 * 2) - 3 * 5 / (4 * 4) + 5 * 7 / (6 * 6) - …… + (2 * n - 1)*(2 * n + 1) / (2 * n)*(2 * n)

double fun(int n)
{
    int k = 1;
    double s = 0.0;
    for (int i = 1; i <= n; i++)
    {
        s = s + k*(2.0 * i - 1)*(2.0 * i + 1) / ((2.0 * i)*(2.0 * i)); //这里加2.0后面的0不加完全不同的两种情况
        k *= -1; //K为正负号
    }
    return s;
}

23.函数fun的功能:根据以下公式求pi的值(要求满足精度0.0005,即某项小于0.0005时停止迭代)。

pi/2=1 + 1/3 + (1 * 2) / (3 * 5) + (1 * 2 * 3)/(3 * 5 * 7)+……+ (1 * 2 * …… *n)/(3 * 5*……*(2n+1))

double fun(double eps)
{
    double s = 1.0, s1 = 1.0;
    int n = 1;
    while (s1 >= eps)//当某项精度大于要求时,继续求下一项
    {
        s1 = s1*n / (2 * n + 1);//求多项式的每一项
        s = s + s1;
        n++;
    }
    return 2 * s;
}

24.函数fun功能是求出以下分数序列的前n项和作为函数值返回。

2/1,3/2,5/3,8/5,13/8,21/13,……

double fun(int n)
{
    int a = 2, b = 1, t;
    double s = 0.0;
    for (int i = 1; i <= n; i++)
    {
        s = s + (double)a / b;
        t = a;    a = a + b;    b = t; //替换a b的值
    }
    return s;
}

25.函数fun功能:将形参n中,各位上为偶数的数取出,并按原来从高位到低位的顺序组成一个新的数,并作为函数值返回。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
unsigned int fun(unsigned int n)
{
    int mask = 1, t, res = 0;
    while (n > 0)
    {
        t = n % 10;
        if (t % 2 == 0)
        {
            res = res + t*mask;
            mask = mask * 10;
        }
        n /= 10;
    }
    return res;
}
void main()
{
    int n = -1;
    while (n > 4294967295 || n < 0)
    {
        printf("Please input(0 < n < 4294967295 : ");
        scanf("%d", &n);
    }
    printf("%d", fun(n));
    system("pause");
}

26.函数fun功能:将形参n中,各位上为偶数的数取出,并按原来从高位到低位相反的顺序组成一个新的数,并作为函数值返回。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
unsigned int fun(unsigned int n)
{
    int mask = 1, t, res = 0;
    while (n > 0)
    {
        t = n % 10;
        if (t % 2 == 0)
        {
            res = res * 10 + t;
        }
        n /= 10;
    }
    return res;
}
void main()
{
    int n = -1;
    while (n > 4294967295 || n < 0)
    {
        printf("Please input(0 < n < 4294967295 : ");
        scanf("%d", &n);
    }
    printf("%d", fun(n));
    system("pause");
}

27.函数fun功能:取出将形参value中 偶数位 上的数,并按原来从高位到低位的顺序组成一个新的数,并作为函数值返回

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int fun(int value)
{
    value /= 10; //取整
    int res = value % 10; //取余
    int mask = 10;
    while (value > 0)
    {
        value /= 100;
        res = value % 10 * mask + res;
        mask *= 10;
    }
    return res;

}
void main()
{
    int n = -1;
    while (n > 4294967295 || n < 0)
    {
        printf("Please input(0 < n < 4294967295 : ");
        scanf("%d", &n);
    }
    printf("%d", fun(n));
    system("pause");
}
原文地址:https://www.cnblogs.com/Yang-Xin-Yi/p/13507090.html