第六周来喽~不要放弃
问题 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;
}
有涉及到递归函数 感兴趣的可以看一下哦~