Онлайн компилятор C

#include<stdio.h> int main() { int N; int arr[10]={0}; scanf("%d",&N); int i,num; for(num=2;num<=N;num++) { for(i=2;i<10;i++) { if(num%i==0) { arr[i]++; } } } for(i=2;i<10;i++) { if(i>2) { printf("\n"); } printf("%d %d", i, arr[i]); } return 0; }
这段代码试图统计从2到N之间每个数字能被2到9中哪些数整除的次数。但逻辑上有问题:它统计的是每个数被整除的次数,而不是题目可能要求的“每个数字作为因子出现的次数”。

- 你的内层循环对每个num检查是否能被i整除,但这样会重复计数。例如num=6时,它同时被2和3整除,arr[2]和arr[3]都会增加,但实际题目可能只要求统计每个因子出现的次数,而不是每个数被整除的次数。
- 另外,数组arr只定义了10个元素,但i从2到9,这没问题。不过如果N很大,比如N=100,那么num=4会被2整除两次(4%2==0),但你的代码只加了一次,这取决于题目要求。你需要明确题目到底要统计什么:是每个因子在2到N的所有数中出现的总次数(比如2在4中出现两次),还是仅仅统计每个数是否被该因子整除一次。

检查你的题目要求,看看是否需要对同一个数多次统计同一个因子(例如4包含两个因子2)。如果是,你的代码需要修改内层循环的处理方式。