⭐博客主页:️CS semi主页
⭐欢迎关注:点赞收藏+留言
⭐系列专栏:百日大刷题
⭐代码仓库:C Advanced
家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们的支持是我创作最大的动力,欢迎友友们私信提问,家人们不要忘记点赞收藏+关注哦!!!
百日大刷题No.6
一、找完数
1.题目描述和思路
思路:遍历一个输入从n到m的数,除出来每一个因数,再加起来,与原本的数相比较,如果相等则开始进行相加的操作,先把1拿出来。在从2开始到这个数依次拿出来相加,再加一个标志,如果在这个范围内没有完数,则输出为flag=1。
注意地方:定义sum要在局部中定义局部变量,因为每做完一次遍历后,sum的值会进行改变,需要在for循环语句中进行重新赋值,重新赋值为1。
2.代码实现
#include<stdio.h>
int main(){
int num1 = 0;
int num2 = 0;
scanf("%d %d", &num1, &num2);
int i = 0;
int flag = 1;
int j = 0;
int sum = 0;
for (i = num1; i <= num2; i++) {
int sum = 1; //定义局部变量重新赋值sum=1(每做完一次计算sum的值会改变)
//找因子并相加
for (j = 2; j < i; j++) {
if (i % j == 0) {
sum += j;
}
}
//判断是否相等
if (sum == i) {
flag = 0;
//先输出1
printf("%d = 1", i);
//输出每一个因子
for (int k = 2; k < i; k++) {
if (i % k == 0) {
printf(" + %d", k);
}
}
printf("\n");
}
}
//如果这段区间都没有,则输出为NONE
if (flag == 1) {
printf("NONE\n");
}
return 0;
}
二、求符合给定条件的整数集
1.题目描述和思路
思路:三次循环,判断第一个数与后面两个数是否相等。
2.代码实现
#include<stdio.h>
int main()
{
int A, i, j, k, c = 0;
scanf("%d", &A);
for (i = A; i <= A + 3; i++)
{
for (j = A; j <= A + 3; j++)
{
for (k = A; k <= A + 3; k++)
{
if ((i != j) && (j != k) && (i != k)) {
c++;
printf("%d%d%d", i, j, k);
//每行满六个则换行
if (c == 6)
{
printf("\n");
c = 0; //换完行重新赋值重新排
}
else
printf(" ");
}
}
}
}
return 0;
}
三、打印九九口诀表
1.题目描述和思路
思路:注意printf中先从j开始,往后计算。
2.代码实现
#include<stdio.h>
#include<math.h>
int main()
{
int N, i, j;
scanf("%d", &N);
for (i = 1; i < N + 1; i++)
{
for (j = 1; j <= i; j++)
{
printf("%d*%d=%-2d ", j, i, i * j);
}
printf("\n");
}
return 0;
}
四、人民币兑换
1.题目描述和思路
思路:用一张图片来演示一下计算过程。
2.代码实现
#include<stdio.h>
int main()
{
int n, five = 1, two, one; //个数
scanf("%d", &n);
for (; five <= n; five++) {
two = 50 - 4 * five;
one = 3 * five + 50;
if (50 - 4 * five > 0)
{
printf("%d %d %d\n", five, two, one);
}
}
return 0;
}
五、编程打印空心字符菱形
1.题目描述和思路
思路:如下三图。先将这个空心字符菱形分为四个区,分别是左上角RT三角形区。
2.代码实现
#include<stdio.h>
int main() {
int n = 0;
char c;
scanf("%c %d", &c ,&n);
int i = 0;
int j = 0;
//上半部分
for (i = 1; i <= n / 2 + 1; i++) {
//上半部分倒三角形
for (j = 1; j <= n / 2 + 1 - i; j++) {
printf(" ");
}
//上半部分正三角形
for (j = 0; j < 2 * i - 1; j++) { //总共几个位置
//判断语句打印空格
if (j == 0 || j == 2 * i - 2) {
printf("%c",c);
}
else {
printf(" ");
}
}
//打印完一行往后递增一位字母
c += 1;
printf("\n");
}
//多往后递增了两位,这里先让它回到原本最大的那个字母
c -= 1;
//下半部分
for (i = 1; i <= n / 2; i++) {
c -= 1;
//打印左下角空格区域三角形
for (j = 1; j <= i; j++) {
printf(" ");
}
//打印中间倒三角形
for (j = n - 2; j >= 2 * i - 1; j--) { //j>=到j=这段的长度就是这行的长度
//判断语句打印空格和字母
if (j == n - 2 || j == 2 * i - 1) {
printf("%c", c);
}
else {
printf(" ");
}
}
/*c -= 1;*/
printf("\n");
}
return 0;
}
六、幸运彩票
1.题目描述和思路
思路:把输入的一个数里面的每一位拿出来进行操作。
2.代码实现
#include<stdio.h>
int main()
{
int N, i=1;
scanf("%d", &N);
for (; i <= N; i++) {
int shu, one, two, three, four, five, six, k, j;
scanf("%d", &shu);
one = shu / 100000;
two = shu / 10000 % 10;
three = shu / 1000 % 10;
four = shu / 100 % 10;
five = shu / 10 % 10;
six = shu % 10;
j = one + two + three;
k = four + five + six;
if (j != k)
{
printf("Wish you good luck.\n");
}
else
{
printf("You are lucky!\n");
}
}
return 0;
}
七、输出学生成绩(用动态内存做)
1.题目描述和思路
思路:主要是动态内存的做法可能有点陌生,但是其实很简单,用一个数组的动态内存就类似于用一个数组。
2.代码实现
#include<stdio.h>
#include<malloc.h>
int main()
{
int N;
int* arr;
double av = 0;
double sum = 0;
scanf("%d", &N);
arr = (int*)malloc(sizeof(int) * N);
int i = 0;
for (i = 0; i < N; i++) {
scanf("%d", &arr[i]);
sum += arr[i];
}
double min = arr[0];
double max = arr[0];
for (i = 0; i < N; i++) {
if (arr[i] > max) {
max = arr[i];
}
else if (arr[i] < min) {
min = arr[i];
}
}
av = (double)sum / N;
printf("average = %.2lf\n", av);
printf("max = %.2lf\n", (double)max);
printf("min = %.2lf\n", (double)min);
free(arr);
return 0;
}
总结
第六天的刷题难度略有上升,但还需要搞清楚原理来解决它们!