信息学奥赛一本通 第四章 循环结构的程序设计第四节C语言非C++

发布时间:2023年12月17日

第四章 循环结构的程序设计

第四节 循环嵌套

2026:【例4.12】阶乘和

#include <stdio.h>

int main()
{
    int n;
    scanf("%d", &n); //从标准输入读取n
    int sum = 0, v; //v:某一阶乘项的值
    for(int i = 1; i <= n; ++i) //遍历1到n
    {
        v = 1; //初始化v为1
        for (int j = 1; j <= i; ++j) //计算i的阶乘
            v *= j;
        sum += v; //将i的阶乘加到sum
    }
    printf("%d", sum); //输出阶乘的和
    return 0;
}

2027:【例4.13】三角形

#include <stdio.h>

int main()
{
    int n;
    scanf("%d", &n); //从标准输入读取n
    for(int i = 1; i <= n; ++i) //遍历1到n
    {
    	for(int j = 1; j <= i; ++j) //在每一行输出i个'*'
    		printf("*");
    	printf("\n"); //每一行结束后换行
	}
    return 0;
}

2028:【例4.14】百钱买百鸡

#include <stdio.h>

int main()
{
	int a, b, c; //分别代表公鸡、母鸡和小鸡的数量
	for(a = 0; a <= 20; ++a) //公鸡最多不超过20只
		for(b = 0; b <= 33; ++b) //母鸡最多不超过33只
			for(c = 0; c <= 100; ++c) //小鸡最多不超过100只
			{
				if(a+b+c == 100 && c%3 == 0 && 5*a+3*b+c/3 == 100) //满足总数量为100,小鸡数量是3的倍数,以及总钱数为100的条件
					printf("%d %d %d\n", a, b, c); //输出符合条件的公鸡、母鸡和小鸡的数量
			}
	return 0;
}

2029:【例4.15】水仙花数

#include <stdio.h>

int main()
{
	int a, b, c; //分别代表百位、十位和个位
	for(int i = 100; i <= 999; ++i) //遍历所有三位数
	{
		a = i/100; //计算百位数
		b = i/10%10; //计算十位数
		c = i%10; //计算个位数
	
		if(a*a*a+b*b*b+c*c*c == i) //如果这个数是水仙花数
			printf("%d\n", i); //输出这个数
	}
	return 0;
}

2030:【例4.16】找素数

#include <stdio.h>
#include <math.h> //为了使用sqrt函数

int main()
{
	int a, b; //输入的范围[a, b]
	bool isPrime; //判断一个数是否为素数的标志
	scanf("%d %d", &a, &b); //从标准输入读取范围[a, b]
	for(int i = a; i <= b; ++i) //遍历范围[a, b]内的所有数
	{
		isPrime = true; //假设i是素数
		for(int j = 2; j <= sqrt(i); ++j) //检查i是否有2到sqrt(i)的因数
		{
			if(i % j == 0) //如果i能被j整除,说明i不是素数
			{
				isPrime = false; //将isPrime设置为false
				break; //结束内层循环
			}
		}
		if(isPrime) //如果i是素数
			printf("%d\n", i); //输出i
	}
	return 0;
}

2031:【例4.17】四位完全平方数

#include <stdio.h>
#include <math.h>  // 为了使用sqrt函数

int main()
{
    int d, num;  // d用来保存开方后的整数,num用来保存生成的四位数
    for(int i = 1; i <= 9; ++i)  // 遍历所有可能的千位和百位数字
        for(int j = 0; j <= 9; ++j)  // 遍历所有可能的十位和个位数字
        {
            num = i*1000+i*100+j*10+j;  // 生成满足条件的四位数
            d = sqrt(num);  // 计算这个四位数的平方根,结果向下取整
            if(num == d*d)  // 如果这个四位数是某个整数的平方
                printf("%d\n", num);  // 输出这个四位数
        }
    return 0;
}

2032:【例4.18】分解质因数

#include <stdio.h>

int main()
{
    int n, i = 2;
    scanf("%d", &n); // 从标准输入读取一个正整数n
    printf("%d=", n); // 输出n=

    int isFirst = 1; // 用于标记是否为第一个输出的质因数
    while(n > 1)
    {
        if(n % i == 0) // 如果n能被i整除,那么i就是n的一个质因数
        {
            if(isFirst) // 如果是第一个输出的质因数
                isFirst = 0; // 将isFirst设置为0,表示后面的质因数不再是第一个
            else // 如果不是第一个输出的质因数,那么在质因数前面输出一个*
                printf("*"); 

            printf("%d", i); // 输出质因数i
            n /= i; // 用n除以i,得到剩余需要进行质因数分解的部分
        }
        else
            i++; // 如果n不能被i整除,那么将i加1,尝试下一个可能的质因数
    } 

    return 0; 
}

2033:【例4.19】阶乘之和

#include <stdio.h>

#define M 1000000 // 设置一个常数M

int main()
{
    int n, num = 1, sum = 0; // num用于计算阶乘,sum用于存储阶乘和
    scanf("%d", &n); // 从标准输入读取一个正整数n

    for(int i = 1; i <= n; ++i) // 从1到n逐个计算阶乘并加到sum中
    {
        num = num * i % M; // 计算i的阶乘并取模M,避免溢出
        sum = (sum + num) % M; // 将num加到sum中并取模M,避免溢出
    }
    printf("%d", sum); // 输出阶乘和模M的结果

    return 0;
}

1091:求阶乘的和

#include <stdio.h>

int main()
{
    int n;
    scanf("%d", &n); // 从标准输入读取一个正整数n

    int sum = 0, v; // sum用于存储阶乘和,v用于计算每个阶乘项的值
    for(int i = 1; i <= n; ++i) // 从1到n逐个计算阶乘并加到sum中
    {
        v = 1; // 初始化v为1
        for (int j = 1; j <= i; ++j) // 计算i的阶乘
            v *= j;
        sum += v; // 将v加到sum中
    }
    printf("%d", sum); // 输出阶乘和

    return 0;
}

1092:求出e的值

#include <stdio.h>

int main()
{
    int n;
    scanf("%d", &n); // 从标准输入读取一个正整数n

    double sum = 1, v; // sum用于存储倒阶乘和,v用于计算每个倒阶乘项的值
    for(int i = 1; i <= n; ++i) // 从1到n逐个计算倒阶乘并加到sum中
    {
        v = 1; // 初始化v为1
        for(int j = 1; j <= i; ++j) // 计算1 / i!
            v *= 1.0 / j;
        sum += v; // 将v加到sum中
    }
    printf("%.10lf", sum); // 输出倒阶乘和,保留10位小数

    return 0;
}

1093:计算多项式的值

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

int main()
{
    double x, n, s = 1; // x是实数,n是正整数,s用于存储幂的和
    scanf("%lf%lf", &x, &n); // 从标准输入读取x和n

    for(int i = 1; i <= n; ++i) // 计算x的1到n次幂,并加到s中
        s += pow(x, i);

    printf("%.2lf", s); // 输出幂的和,保留2位小数

    return 0;
}

1094:与7无关的数

#include <stdio.h>
#include <stdbool.h>

bool isRel7(int n) // 判断数n是否与7相关
{
    if(n % 7 == 0) // 如果n是7的整数倍,则相关
        return true;
    for(int a = n; a > 0; a /= 10) // 分离数字n的各位
    {
        int d = a % 10;
        if(d == 7) // 如果有一位是7
            return true;
    }
    return false;
}
int main()
{
    int n, s = 0;
    scanf("%d", &n); // 从标准输入读取一个正整数n

    for(int i = 1; i <= n; ++i) // 从1到n逐个检查每个数
    {
        if(isRel7(i) == false) // 如果i与7无关
            s += i * i; // 将i的平方加入和s中
    }
    printf("%d", s); // 输出平方和

    return 0;
}

1095:数1的个数

#include <stdio.h>

int count1(int n) // 计算数字n中1的个数
{
    int ct = 0; // 计数器
    for(int a = n; a > 0; a /= 10) // 遍历数字n的每一位
    {
        if(a % 10 == 1) // 如果当前位是1
            ct++; // 计数器加1
    }
    return ct; // 返回1的个数
}

int main()
{
    int n, ct = 0; // ct: 计数器
    scanf("%d", &n); // 从标准输入读取一个正整数n

    for(int i = 1; i <= n; ++i) // 统计1到n中1的个数
        ct += count1(i);

    printf("%d\n", ct); // 输出1的总个数

    return 0;
}

1096:数字统计

#include <stdio.h>

int count2(int n) // 计算数字n中2的个数
{
    int ct = 0; // 计数器
    for(int a = n; a > 0; a /= 10) // 遍历数字n的每一位
    {
        if(a % 10 == 2) // 如果当前位是2
            ct++; // 计数器加1
    }
    return ct; // 返回2的个数
}

int main()
{
    int l, r, ct = 0; // ct: 计数器
    scanf("%d %d", &l, &r); // 从标准输入读取两个正整数l和r

    for(int i = l; i <= r; ++i) // 统计l到r中2的个数
        ct += count2(i);

    printf("%d\n", ct); // 输出2的总个数

    return 0;
}

1097:画矩形

#include <stdio.h>

int main()
{
    int h, w, x; // h: 高度, w: 宽度, x: 0表示空心, 1表示实心
    char c; // 构成矩形的字符
    scanf("%d %d %c %d", &h, &w, &c, &x); // 从标准输入读取高度, 宽度, 字符和标志变量

    char c_in = x == 1 ? c : ' '; // 如果标志变量为1, 则内部字符为c, 否则为空格

    for(int i = 0; i < w; ++i) // 打印第一行
        putchar(c);
    putchar('\n');

    for(int i = 0; i < h - 2; ++i) // 打印中间的行
    {
        putchar(c); // 打印每行的第一个字符
        for(int j = 0; j < w - 2; ++j) // 打印每行的内部字符
            putchar(c_in);
        printf("%c\n", c); // 打印每行的最后一个字符
    }

    for(int i = 0; i < w; ++i) // 打印最后一行
        putchar(c);
    putchar('\n');

    return 0;
}

1098:质因数分解

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

int main()
{
    int n; // 输入的数
    scanf("%d", &n); // 从标准输入读取一个数

    for(int i = 2; i <= sqrt(n); ++i) // 从2开始到这个数的平方根查找因数
    {
        if(n % i == 0) // 如果这个数能被i整除,那么i就是这个数的一个因数
        {
            printf("%d\n", n / i); // 输出这个数除以i的结果,这就是这个数的最大质因数
            return 0;
        }
    }

    return 0;
}

1099:第n小的质数

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

// 判断a是否是质数,已知a >= 2
bool isPrime(int a)
{
    for(int i = 2; i <= sqrt(a); i++)
    {
        if(a % i == 0)
            return false;
    }
    return true;
}

int main()
{
    int n, ct = 0; // n: 输入的数, ct: 计数器
    scanf("%d", &n); // 从标准输入读取一个数

    for(int i = 2; ; ++i) // 从2开始
    {
        if(isPrime(i)) // 判断i是否是质数
        {
            ct++; // 如果是质数,计数器加1
            if(ct >= n) // 如果已经找到第n小的质数
            {
                printf("%d\n", i); // 输出这个质数
                return 0;
            }
        }
    }
}

1100:金币

#include <stdio.h>

int main()
{
    int n;
    scanf("%d", &n); // 读取输入的天数

    int sum = 0, d = 1, j = 1; // sum: 总金币数, d: 当前阶段, j: 当前阶段的第几天

    for(int i = 1; i <= n; ++i) // i: 从开始算起的第几天
    {
        sum += d; // 当前处于阶段d,第i天获得d个金币

        if(j >= d) // 若在当前阶段已经过了d天
        {
            d++; // 阶段数增加1
            j = 1; // 下一天是新的阶段的第一天
        }
        else
            j++; // 处于本阶段的天数增加
    }

    printf("%d\n", sum); // 输出总金币数

    return 0;
}

1101:不定方程求解

#include <stdio.h>

int main()
{
    int a, b, c, ct = 0; // ct: 计数器,用于记录解的个数
    scanf("%d %d %d", &a, &b, &c); // 从标准输入读取a, b, c的值

    for(int x = 0; x <= c; ++x) // 遍历x的所有可能值
        for(int y = 0; y <= c; ++y) // 对于每个x,遍历y的所有可能值
        {
            if(a*x + b*y == c) // 如果找到一组解
                ct++; // 计数器加1
        }

    printf("%d\n", ct); // 输出解的个数

    return 0;
}

文章来源:https://blog.csdn.net/weixin_44738632/article/details/134975143
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。