C语言编程入门—分支、多分支(week6)

 第六周来喽~不要放弃


问题 C: (7) 数列求和(一)(4.2.2) (--循环 )

题目描述

求1-3+5-7+9-...+n的值 ,最后一个n一定为正整数

提示:

方法1:把数列拆成正数和负数两个数列分开就和,再计算结果

方法2: 交错数列看成是普通数列和1 -1 1 -1 1的数列的成绩,可以用-1n表示,-10,-11 ,-12, -13  对应的结果就是1,-1,1,-1

 输入

一个正整数n,表示数列的最后一项。

 输出

5

样例输入

3

问题分析 

通过使用  flag  控制每一项的符号

#include<stdio.h>
int main()
{
    int n,flag=1,sum=0;
    scanf("%d", &n);
    for (int i = 1; i <= n;i += 2)
        sum += i * flag, flag *= -1;
    printf("%d\n", sum);
}

问题 E: C语言程序设计教程(第三版)课后习题6.5【循环 for】

题目描述

求以下三数的和,保留2位小数 1~a之和 1~b的平方和 1~c的倒数和

 输入

a b c

 输出

1+2+...+a + 1^2+2^2+...+b^2 + 1/1+1/2+...+1/c

样例输入

100 50 10

样例输出

47977.93

问题分析 

注意: 

1、C语言里是没有   ^   的,想要表示  i^2   ,要么写成  i*i   ,要么调用<math> ,用 pow(i,2)

2、' / '  若是整数除整数的话,会对小数取整的,故使用  1.0/i  代替  1/i

#include<stdio.h>
int main()
{
    int a, b, c;
    float sum=0;
    scanf("%d %d %d", &a, &b, &c);
    for (int i = 1; i <= a;i++)
        sum += i;
    for (int i = 1; i <= b;i++)
        sum += i * i;
    for (int i = 1; i <= c;i++)
        sum += 1.0 / i;
    printf("%.2f\n", sum);
    return 0;
}

问题 F: 【C语言】整数的分类处理【while/for-switch】

题目描述

给定 N 个正整数,要求你从中得到下列三种计算结果: A1 = 能被 3 整除的最大整数 A2 = 存在整数 K 使之可以表示为 3K+1 的整数的个数 A3 = 存在整数 K 使之可以表示为 3K+2 的所有整数的平均值(精确到小数点后 1 位)

 输入

输入首先在第一行给出一个正整数 N,随后一行给出 N 个正整数。所有数字都不超过 100,同行数字以空格分隔。

 输出

在一行中顺序输出 A1、A2、A3的值,其间以 1 个空格分隔。如果某个数字不存在,则对应输出NONE。

样例输入

8

5 8 7 6 9 1 3 10

样例输出

9 3 6.5

问题分析 

法一:week 5  里有一样的题目  这次是严谨版,没有用到switch

#include<stdio.h>
int main()
{
    int N,A1,A2,cout;
    float A3;
    cout = A1 = A2 = A3 = 0;
    scanf("%d", &N);
    while(N--)
    {
        int x;
        scanf("%d", &x);
        if(x%3==0)
            A1=x>A1?x:A1;
        else if(x%3==1)
            A2++ ;
        else 
            cout++,A3 += x;
    }
    A1==0?printf("NONE "):printf("%d ", A1);
    A2==0?printf("NONE "):printf("%d ", A2);
    A3==0?printf("NONE"):printf("%.1f", A3/cout);
    return 0;
}

 法二:用到switch

#include<stdio.h>
int main()
{
    int N,A1,A2,cout;
    float A3;
    cout = A1 = A2 = A3 = 0;
    scanf("%d", &N);
    while(N--)
    {
        int x;
        scanf("%d", &x);
        switch(x%3)
        {
        	case 0:
				A1=x>A1?x:A1;break;
        	case 1:
				A2++ ;break;
        	case 2:
				cout++,A3 += x;break;
        }   
    }
    A1==0?printf("NONE "):printf("%d ", A1);
    A2==0?printf("NONE "):printf("%d ", A2);
    A3==0?printf("NONE"):printf("%.1f", A3/cout);
    return 0;
}

问题 G: (6) 判断完数(一) (----循环 累加求和 for)

题目描述

一个数如果恰好等于它的因子之和,这个数称为“完数”,如6的因子为 1,2,3,而1+2+3=6,因此6就是完数

 输入

输入一个正整数 n

 输出

输出是否是完数 如输入6,输出YES 输入8,输出NO 因为8!=1+2+4

样例输入

6

样例输出

YES

问题分析 

#include<stdio.h>
int main()
{
    int n,sum=0;
    scanf("%d", &n);
    for (int i = 1; i < n;i++)
        if(n%i==0) sum += i;
    sum == n ? printf("YES\n") : printf("NO\n");
    return 0;
}

问题 H: 【C1】【循环】正/负数统计

题目描述

统计在所输入的N个整数中有多少个正数、多少个负数、多少个零。

 输入

先输入一个整数N,接着输入这N个整数。

 输出

按顺序输出正数,负数,零的个数。输出各占一行。个数为0的项目也要输出。

样例输入

20

-5 0 2 6 8 4 2 1 3 6 9 84 0 2 6 -6 -6 -9 63 5

样例输出

14

4

2

问题分析 

#include<stdio.h>
int main()
{
    int N,sum1,sum2,sum3;
    sum1 = sum2 = sum3 = 0;
    scanf("%d", &N);
    while(N--)
    {
        int x;
        scanf("%d", &x);
        if(x>0)
            sum1++;
        else if(x<0)
            sum2++;
        else
            sum3++;
    }
    printf("%d\n%d\n%d\n", sum1, sum2, sum3);
    return 0;
}

问题 I: 【循环】斐波那契数列【for】

题目描述

斐波纳契数列
1,1,2,3,5,8,13,21,34,55,89……这个数列则称为“斐波纳契数列”,其中每个数字都是“斐波纳契数”。

 输入

一个整数N(N不能大于40)

 输出

由N个“斐波纳契数”组成的“斐波纳契数列”。

样例输入

6

样例输出

1 1 2 3 5 8

问题分析(多种解法)

法一:easist

#include<stdio.h>
int main()
{
    int n;
    int n1, n2;
    n1 = n2 = 1;
    scanf("%d", &n);
    if(n==1)
        printf("1\n");
    else
    {
        int n3;
        printf("1");
        while(n-- != 1)
        {
            printf(" %d", n2);
            n3 = n1 + n2;
            n1 = n2;
            n2 = n3;
        }   
    }
    return 0;
}

法二:用数组存储之后输出,由于和第一种方法类似,这里不写了

法三:运用递归函数(递进优化)  感兴趣的可以看一下~

1)最简单的依据题目意思实现递归,看上去很简洁,但时间复杂度高达  O(2^n)  

#include<stdio.h>
int fibonacci(int i);
int main()
{
    int N,i;
    scanf("%d", &N);
    for (i = 1; i <= N; i++)
        printf("%d ", fibonacci(i));
    return 0;
}
int fibonacci(int i)
{
    if(i<=0)
        return 0;
    if(i==1)
        return 1;
    return fibonacci(i - 1) + fibonacci(i - 2);
}

2)进行优化,方向就是减少递归调用次数,灵活运用返回值,优化之后的时间复杂度 O(n)

#include<stdio.h>
int fibonacci(int first, int second, int n);
int main()
{
    int N,i;
    scanf("%d", &N);
    for (i = 1; i <= N; i++)
        printf("%d ", fibonacci(1,1,i));
    return 0;
}
int fibonacci(int first,int second,int n)
{
    if(n<=0)
        return 0;
    if(n<3)
        return 1;
    else if(n==3)
        return first + second;
    return fibonacci(second, first + second, n - 1);
}

问题 J: 【循环嵌套】矩形星阵

题目描述

输入二个整数m和n,输出m行n列的由"*"构成的矩阵星阵。

 输入

一行,二个整数,中间用空格分隔,分别表示星阵的行数和列数。

 输出

由N个“斐波纳契数”组成的“斐波纳契数列”。

样例输入

相应行列数的星阵。

样例输出

3 4

问题分析

不会不应该啊

#include<stdio.h>
int main()
{
    int m, n;
    scanf("%d %d", &m, &n);
    for (int i = 0; i < m;i++)
    {
        for (int j = 0; j < n;j++)
            printf("*");
        printf("\n");
    }    
    return 0;
}

问题 K: 【C语言】【循环嵌套】图形打印

题目描述

根据输入的整数n(n<=20),打印出对应的图形,例如

n=3对应的图形
$$$                         
#$$$
##$$$

n=5,对应的图形         
$$$$$                                 
#$$$$$
##$$$$$
###$$$$$
####$$$$$

 输入

输入一个整数n

 输出

输出对应的图形(平行四边形)

样例输入

3

样例输出

$$$

#$$$

##$$$

问题分析

不会不应该啊

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    for (int i = 0; i < n;i++)
    {
        for (int j = 0; j < i;j++)
            printf("#");
        for (int j = 0; j < n;j++)
            printf("$");
        printf("\n");
    }    
    return 0;
}

有涉及到递归函数   感兴趣的可以看一下哦~ 

猜你喜欢

转载自blog.csdn.net/qq_63761366/article/details/127625284
今日推荐