4399king 发表于 2020-9-30 23:07:42

挑数字



#include<stdio.h>
int main()
{
    int cnt,num;
    scanf("%d",&cnt);
    getchar();
    int a;
    for (int i=0;i<cnt;i++){
      scanf("%d",&a);
      getchar();
}
    int cnt1=0,cnt2=0;
    for (int j;j<cnt;j++){
      if(a%2==0&&a%3==0){
            cnt1++;
            if(cnt1==1){
                printf("%d",a);
            }else if(cnt1>1){
                printf(" %d",a);
}
}
}
    if(cnt1==0){
      printf("-1");
}
    printf("\n");
    for (int k;k<cnt;k++){
      if(a%2!=0||a%7==0){
            cnt2++;
            if (cnt2==1){
                printf("%d",a);
}
            else if(cnt2>1){
                printf(" %d",a);
}
}
}
    if(cnt2==0){
      printf("-1");
}
    printf("\n");
    return 0;
}


求订正谢谢

风过无痕1989 发表于 2020-10-1 02:27:51

你的代码太复杂,16行与26行是同一个语句使用两次,如若不然,有些数就会被跳过。以下是我的代码(因我的编译器不支持C99,1、将变量的定义全部移到了头部位置,2、 for 语句中,不能定义变量类型,故也移到了头部位置,3、因不支持变长数组,调试时,数组我采用的固定值30,即从 1 到 30 来作为输入),仅供参考:

#include<stdio.h>
int main()
{
    int cnt,cnt1 = 0,cnt2 = 0;
    int i,j;
    int a = {0};                     // 定义数组并初始化
    scanf("%d",&cnt);
    getchar();

    for (i = 0;i < cnt;i++)
    {
      scanf("%d",&a);
      getchar();
    }

    for (j = 0;j < cnt;j++)
    {
      if(a % 2 == 0 && a % 3 == 0)// 输出是偶数且能被3整除的数
        {
            printf("%d ",a);
            cnt1++;
      }
    }
    printf("\n");

    for (j = 0;j < cnt;j++)
    {
      if(a % 2 != 0 || a % 7 == 0)// 输出是奇数或能被7整除的数
        {
            printf("%d ",a);
            cnt2++;
      }
    }
    printf("\n");

    if(cnt1 == 0 && cnt2 == 0)            // 没有选到数,输出-1
    printf("-1");

    printf("\n");

    return 0;
}

4399king 发表于 2020-10-1 09:44:54

本帖最后由 4399king 于 2020-10-1 09:49 编辑

风过无痕1989 发表于 2020-10-1 02:27
你的代码太复杂,16行与26行是同一个语句使用两次,如若不然,有些数就会被跳过。以下是我的代码(因我的编 ...




答案很接近了,但是还是有误,麻烦您看一看图片中的sample input1和sample output1

巴巴鲁 发表于 2020-10-1 10:36:56

4399king 发表于 2020-10-1 09:44
答案很接近了,但是还是有误,麻烦您看一看图片中的sample input1和sample output1

把36行的if拆开不就行了,就像你的代码一样

风过无痕1989 发表于 2020-10-1 11:06:38

本帖最后由 风过无痕1989 于 2020-10-1 13:03 编辑

4399king 发表于 2020-10-1 09:44
答案很接近了,但是还是有误,麻烦您看一看图片中的sample input1和sample output1

将36行拆分成两行即可,代码如下:

#include<stdio.h>
int main()
{
    int cnt,cnt1 = 0,cnt2 = 0;
    int i,j;
    int a = {0};
    scanf("%d",&cnt);
    getchar();

    for (i = 0;i < cnt;i++)
    {
      scanf("%d",&a);
      getchar();
    }

    for (j = 0;j < cnt;j++)
    {
      if(a % 2 == 0 && a % 3 == 0)// 输出是偶数且能被3整除的数
        {
            printf("%d ",a);
            cnt1++;
      }
    }
    if(cnt1 == 0)                           // 没有选到数,输出-1
    {
          printf("-1\n");
    }
    else
            printf("\n");

    for (j = 0;j < cnt;j++)
    {
      if(a % 2 != 0 || a % 7 == 0)// 输出是奇数或能被7整除的数
        {
            printf("%d ",a);
            cnt2++;
      }
    }

    if(cnt2 == 0)                           // 没有选到数,输出-1
    {
           printf("-1\n");
    }
    else
         printf("\n");

    return 0;
}

4399king 发表于 2020-10-1 14:06:19

风过无痕1989 发表于 2020-10-1 11:06
将36行拆分成两行即可,代码如下:

大神,系统显示runtime error,我方了,这可怎么办

4399king 发表于 2020-10-1 14:14:19

风过无痕1989 发表于 2020-10-1 11:06
将36行拆分成两行即可,代码如下:

各位大佬还有别的思路吗,就是希望运行时间更短一些就能过了

4399king 发表于 2020-10-1 14:15:03

巴巴鲁 发表于 2020-10-1 10:36
把36行的if拆开不就行了,就像你的代码一样

报告大佬,这个代码不够优化,系统不给过,请问你们有别的思路吗

风过无痕1989 发表于 2020-10-1 14:35:59

本帖最后由 风过无痕1989 于 2020-10-1 15:04 编辑

4399king 发表于 2020-10-1 14:06
大神,系统显示runtime error,我方了,这可怎么办

你用什么系统?我用 VC++6.0 与 DEV_C++ 运行都是正常的

风过无痕1989 发表于 2020-10-1 15:38:42

4399king 发表于 2020-10-1 14:06
大神,系统显示runtime error,我方了,这可怎么办

关于你的系统显示 runtime error,我给你如下的建议:
1、所给出的题目,并没有要求系统在多少时间内运行完成;
2、在你的系统中找到,并关闭 runtime 这个功能,要知道,你是在学习C语言编程,不是参加某个程序优化大赛,上面的程序,我看了又看,去掉哪一条语句,都达不到题目要求;
3、若找不到关闭 runtime 这个功能,建议更换编程软件;
4、若你不愿意关闭 runtime 这个功能,那么,建议你更换你的电脑系统(或手机),买一台运行速度更快的;
5、以上的你都不愿意改变,那就只有我们改变了 ------ 以后不再回复你任何问题。

祝顺利!

4399king 发表于 2020-10-1 15:40:10

风过无痕1989 发表于 2020-10-1 14:35
你用什么系统?我用 VC++6.0 与 DEV_C++ 运行都是正常的

报告,我那个是学校的系统,它没说代码错误,但是代码运行的速度没能达到题目要求,需要更简洁的代码,也就是把代码优化,我也很头疼这个,就算编译运行正常,可是时间没达到要求还是过不了

4399king 发表于 2020-10-1 22:49:54

风过无痕1989 发表于 2020-10-1 15:38
关于你的系统显示 runtime error,我给你如下的建议:
1、所给出的题目,并没有要求系统在多少时间内运 ...

那个大佬,我找到办法了,用指针访问数组就可以了,把您代码中的数组元素换成指针

风过无痕1989 发表于 2020-10-1 23:42:15

本帖最后由 风过无痕1989 于 2020-10-1 23:57 编辑

4399king 发表于 2020-10-1 22:49
那个大佬,我找到办法了,用指针访问数组就可以了,把您代码中的数组元素换成指针

#include<stdio.h>
int main()
{
    int cnt,cnt1 = 0,cnt2 = 0;
    int i,*p;
    int a = {0};
    p = a;
    scanf("%d",&cnt);
    getchar();

    for (i = 0;i < cnt;i++)
    {
      scanf("%d",p + i);
      getchar();
    }

    for (i = 0;i < cnt;i++)
    {
      if(*(p + i) % 2 == 0 && *(p + i) % 3 == 0)// 输出是偶数且能被3整除的数
      {
            printf("%d ",*(p + i));
            cnt1++;
      }
    }
    if(cnt1 == 0)                           // 没有选到数,输出-1
    {
            printf("-1\n");
    }
    else
            printf("\n");

    for (i = 0;i < cnt;i++)
    {
      if(*(p + i) % 2 != 0 || *(p + i) % 7 == 0)// 输出是奇数或能被7整除的数
      {
            printf("%d ",*(p + i));
            cnt2++;
      }
    }

    if(cnt2 == 0)                           // 没有选到数,输出-1
    {
         printf("-1\n");
    }
    else
         printf("\n");

    return 0;
}

4399king 发表于 2020-10-2 21:40:38

风过无痕1989 发表于 2020-10-1 23:42


无论如何,谢谢您啦
页: [1]
查看完整版本: 挑数字