【问题描述】有n盏灯,编号为1-n。第一个人把所有灯打开,第2个人按下所有编号为2倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着?
输入 n和k,输出开着灯的编号。
【输入形式】两个整数用空格隔开
【输出形式】输出开着灯的编号,编号间用空隔隔开
【样例输入】
【样例输出】
1 5 6 7【样例说明】K<=n<=1000
#include <stdio.h> #include "math.h" int main() { //n个灯,m个人 int n,m; int x[10000]={0}; int a=1; scanf("%d %d",&n,&m); for (int i = 1; i <= m; ++i) { for (int j = 1; j <= n; ++j) { if (j%i==0){ //取反操作 x[j] = !x[j]; } } } for (int i = 1; i <= n; ++i) { if (x[i] !=0){ if (a) a=0; printf("%d ",i); } } return 0; }开灯问题,这题没怎么理解明白,且网上版本众多,各博主写的也更加详细与理解,这里就不班门弄斧了;
还需要自己理解清楚后在添加解释。
第五题:CCF 201712-1 最小差值【问题描述】
给定n个数,请找出其中相差(差的绝对值)最小的两个数,输出它们的差值的绝对值。
【输入形式】
输入第一行包含一个整数n。
第二行包含n个正整数,相邻整数之间使用一个空格分隔。
【输出形式】
输出一个整数,表示答案。
【样例输入】
5
1 5 4 8 20
【样例输出】
1
【样例说明】
相差最小的两个数是5和4,它们之间的差值是1。
【样例输入】
5
9 3 6 1 3
【样例输出】
0
【样例说明】
有两个相同的数3,它们之间的差值是0。
【评分标准】
对于所有评测用例,2 ≤ n ≤ 1000,每个给定的整数都是不超过10000的正整数。
#include <stdio.h> #include "math.h" int main() { int n; int x[1000]; int min; //数组存储 scanf("%d",&n); for (int i = 0; i < n; i++) { scanf("%d",&x[i]); } //设第一个差为最小值 min = abs(x[1]-x[0]); for (int i = 0; i < n; i++) { for (int j = i+1; j < n; j++) { //绝对值 if (abs(x[j]-x[i])<min){ min = abs(x[j]-x[i]); } } } printf("%d",min); return 0; }解释:
该题逻辑与第一题相似,都是假设最小值,然后进行比较,不过这题的最小值是两个差;
原理都是一样,其中点出abs是绝对值的意思;
第一题是通过下标,这题是通过值;
不多解释,不明白可会看第一题解题思路;
第六题:求最大最小数的差【问题描述】
编程实现如下的功能:取出一个十进制正整数中的所有偶数数字,用这些数字拼成一个最大整数max,取出这个十进制正整数中的所有奇数数字,用这些数字拼成一个最小整数min,计算max和min的差并输出。
【输入形式】输入一行一个十进制整数
【输出形式】输出一行一个符合规定的整数
【样例输入】
【样例输出】
7061【样例说明】max为8640,min为1579,差为7061
#include <stdio.h> #include "math.h" int main() { int n; int x[100]; int k; scanf("%d",&n); int num=0; while (n != 0){ k = n%10; x[num] = k; n = (n-k)/10; num ++; } //对列表排序--选择排序 for (int i = 0; i < num-1; ++i) { int min =i; for (int j = i+1; j < num; ++j) { if (x[min]>x[j]){ min=j; } } if (min != i){ int t = x[i]; x[i] = x[min]; x[min] = t; } } //查看数组顺序 // for (int i = 0; i < num; ++i) { // printf("%d",x[i]); // } // printf("\n"); int sum1=1; int minnum = 0; int maxnum = 0; //判断偶数 for (int i = 0; i <num; i++) { if(x[i]%2 == 0 || x[i]==0){ maxnum+=x[i]*sum1; sum1 *=10; } } //判断奇数 int sum2=1; for (int i = num-1; i >=0; i--) { // printf("%d",i); if(x[i]%2 != 0){ minnum += x[i]*sum2; sum2 *=10; } } // printf("%d %d %d",maxnum,minnum,maxnum-minnum); printf("%d",maxnum-minnum); return 0; }解释:
首先我们需要明确怎么把输入的一串数字化为单个元素保存到数组中;
可以将每个元素(x)使用10取余得到的尾数存到数组中,再/10缩小范围,直到x=0,结束循环;
scanf("%d",&n); int num=0; while (n != 0){ k = n%10; x[num] = k; n = (n-k)/10; num ++; }然后需要了解数组/列表(python)中的排序问题;
该题在数组排序中我们采用选择排序;
for (int i = 0; i < num-1; ++i) { int min =i; for (int j = i+1; j < num; ++j) { if (x[min]>x[j]){ min=j; } } if (min != i){ int t = x[i]; x[i] = x[min]; x[min] = t; } }数组排序完成后,开始进行奇偶数的判断,将满足条件的元素分别累加乘积;
其中0算在偶数当中;