【问题描述】 有一叠卡片,卡片号依次为1到n,并且所有卡片的正面朝上。从卡片号2开始,把凡是偶数的卡片都翻成正面朝下。再从3号卡片开始,把凡是卡片号为3的倍数的卡片都翻一面(即把正面朝上的翻成正面朝下,把正面朝下的翻成正面朝上)。下一步从4号卡片开始,把凡是卡片号为4的倍数的卡片都翻转一次,依次类推。问:最后哪些卡片朝上。 【输入形式】 输入一个整数n,表示卡片的总数,6<=n<450 【输出形式】 用空格分开的多个整数。 【样例输入】 23 【样例输出】 1 4 9 16将下列程序补充完整,不允许删减或者修改已经存在的内容。#include <stdio.h> void upDown(int *p,int n); int main() { int a[450],x,n; scanf("%d",&n); for(x=1;x<=n;x++) a[x]=1; upDown(a,n); for(x=1;x<=n;x++) if(a[x]==1) printf("%d ",x); } void upDown(int *p,int total) { int x,y; x=2; do { while(y<=total) { y+=x; } x++; }while(x<=total); }
时间: 2024-02-14 18:16:46 浏览: 12
完整程序如下:
```c
#include <stdio.h>
void upDown(int *p, int n);
int main() {
int a[450], x, n;
scanf("%d", &n);
for (x = 1; x <= n; x++) {
a[x] = 1;
}
upDown(a, n);
for (x = 1; x <= n; x++) {
if (a[x] == 1) {
printf("%d ", x);
}
}
return 0;
}
void upDown(int *p, int total) {
int x, y;
for (x = 2; x <= total; x++) {
if (x % 2 == 0) { // 偶数翻转
p[x] = !p[x];
}
for (y = x; y <= total; y += x) {
if (x % 2 == 1 && y % x == 0) { // 奇数倍数翻转
p[y] = !p[y];
} else if (x % 2 == 0 && y % x == 0 && x % 4 != 0) { // 偶数翻转
p[y] = !p[y];
}
}
}
}
```
该程序的思路与前面的程序类似,但是在upDown函数中的实现略有不同。在遍历卡片时,先判断卡片的号码和翻转规则是否符合要求,然后进行翻转。
对于偶数卡片,直接翻转即可。对于奇数倍数卡片,需要判断是否符合翻转规则,即正面朝上的翻转成正面朝下,正面朝下的翻转成正面朝上。对于偶数倍数卡片,需要判断是否符合翻转规则,即正面朝上的翻转成正面朝下,正面朝下的翻转成正面朝上,但是只有当该卡片被翻转了奇数次时才需要翻转。因为偶数次翻转后,状态与初始状态相同,不需要再次翻转。