啊这啧啧啧 发表于 2023-5-11 19:05:17

打印问题

#include<stdio.h>

int main(){
        printf("测试个数");
        int n,m,t;
        scanf("%d",&t);
        for(int i=1;i<=t;i++){
       
                scanf("%d",&n);
                scanf("%d",&m);
                if(n<m){
                        printf("no");
                        continue;
                }
                if(n==1){
                   printf("yes");
                        continue;
                }
                while(n%3==0&&n!=1){   //如果n=27,为什么下面还会打印no
                        n=n/3;
                        if(n==m){
                        printf("yes");break;
                        }else if(n*2==m){
                        printf("yes");break;       
                        }         
                }if(n!=m){
                  printf("no");
                }
                       
                }
       
        return 0;
}

sfqxx 发表于 2023-5-11 19:06:30

本帖最后由 sfqxx 于 2023-5-11 19:12 编辑

当 n=27时,对于第一个while循环执行了三次,n分别变成9、3和1。在第三次迭代后,n=1,但程序还会继续执行while循环而不是跳出循环进行if判断,因为没有在条件中添加n>1的判断。因此,虽然n=1,但仍会继续执行下一次循环,最后导致输出no。

要解决这个问题,需要在while循环中添加一个条件,判断n是否大于1,如果n=1,则跳出循环并进行if判断。修改后的代码如下:


#include<stdio.h>

int main(){
    printf("测试个数");
    int n,m,t;
    scanf("%d",&t);
    for(int i=1;i<=t;i++){
      scanf("%d",&n);
      scanf("%d",&m);
      if(n<m){
            printf("no");
            continue;
      }
      if(n==1){
            printf("yes");
            continue;
      }
      while(n%3==0&&n>1){
            n=n/3;
            if(n==m){
                printf("yes");
                break;
            }else if(n*2==m){
                printf("yes");
                break;      
            }
      }
      if(n!=m){
            printf("no");
      }
    }
    return 0;
}
有用请设置最佳答案

isdkz 发表于 2023-5-11 19:06:35

这段代码主要是判断一个数能否通过以下两个操作变成另一个数:

1.将该数除以3(当该数为3的倍数时才能进行此操作);

2.将该数乘以2。

现在的问题是,当n=27时,为什么下面还会打印no。

原因是,在第一个if语句中,当n<m时,会直接输出no并跳过本次循环,但当n=27时,第一个if语句不成立,会继续执行后面的代码。在while循环中,n会被除以3,变成9,然后再次被除以3变成3,最后再次被除以3变成1,此时while循环结束,但n已经不等于27了,所以会输出no。

解决方法是,在第一个if语句中加上n==m的判断,如果n等于m,则直接输出yes并跳过本次循环。

歌者文明清理员 发表于 2023-5-11 19:11:16

sfqxx 发表于 2023-5-11 19:06
1

占楼没用,上次跟Taoyuanh的抢最佳的经历我仍铭记着……

sfqxx 发表于 2023-5-11 19:13:13

歌者文明清理员 发表于 2023-5-11 19:11
占楼没用,上次跟Taoyuanh的抢最佳的经历我仍铭记着……

举报优先看2楼{:10_256:}

歌者文明清理员 发表于 2023-5-11 19:16:48

sfqxx 发表于 2023-5-11 19:13
举报优先看2楼

可是那次 ,Taoyuanh直接发的,我只占个楼,帖子内容改好了,就,,,,,
就,最佳没了

sfqxx 发表于 2023-5-11 19:17:41

歌者文明清理员 发表于 2023-5-11 19:16
可是那次 ,Taoyuanh直接发的,我只占个楼,帖子内容改好了,就,,,,,
就,最佳没了

看情况吧,

歌者文明清理员 发表于 2023-5-11 19:19:02

sfqxx 发表于 2023-5-11 19:17
看情况吧,

我要写一个自动回帖脚本

sfqxx 发表于 2023-5-11 19:19:26

歌者文明清理员 发表于 2023-5-11 19:19
我要写一个自动回帖脚本

举报封IP{:10_256:}

isdkz 发表于 2023-5-11 19:24:33

sfqxx 发表于 2023-5-11 19:19
举报封IP

整天就想着举报,上次是不是你把我小号整没了?回复不删掉害我删不了测试贴,然后举报我小号?{:10_334:}

sfqxx 发表于 2023-5-11 19:25:16

isdkz 发表于 2023-5-11 19:24
整天就想着举报,上次是不是你把我小号整没了?回复不删掉害我删不了测试贴,然后举报我小号?

你是说发那个text?

isdkz 发表于 2023-5-11 19:25:26

你的代码有一些逻辑问题,所以当 n=27 的时候可能会打印 "no"。这是由于你的代码在检查 n 和 m 是否相等的时候有问题。具体来说,你的while循环中在 n 是 3 的倍数的时候会一直除以 3,然后检查 n 是否等于 m 或者 n 的两倍是否等于 m,但是这个过程在 n 不再是 3 的倍数或者 n 等于 1 的时候就会停止。这就导致了当 n 是 3 的倍数但是 n 除以 3 之后并不等于 m 时,你的程序会跳出while循环,然后打印 "no"。

比如,当 n=27,m=2 的时候,你的代码会首先将 n 除以 3 得到 9,然后再次将 n 除以 3 得到 3,最后再次将 n 除以 3 得到 1,然后跳出while循环。在这个过程中,n 没有等于 m 或者 n 的两倍没有等于 m,所以在while循环之后你的代码会打印 "no"。

如果你想在 n 是 3 的倍数且 n 除以 3 的结果等于 m 或者 n 的两倍等于 m 的时候打印 "yes",你需要稍微修改一下你的代码。这是一个修改后的代码示例:

#include<stdio.h>

int main(){
      printf("测试个数");
      int n,m,t;
      scanf("%d",&t);
      for(int i=1;i<=t;i++){
      
                scanf("%d",&n);
                scanf("%d",&m);
                if(n<m){
                        printf("no");
                        continue;
                }
                if(n==1){
                   printf("yes");
                        continue;
                }
                while(n%3==0&&n!=1){
                        n=n/3;
                        if(n==m){
                           printf("yes");
                           break;
                        }else if(n*2==m){
                           printf("yes");
                           break;      
                        }         
                }
                if(n!=m && n*2 != m){
                  printf("no");
                }
                     
                }
      
      return 0;
}


在这个修改后的版本中,我在while循环之后添加了一个条件检查 n*2 是否等于 m。这样,即使 n 不再是 3 的倍数,如果 n 的两倍等于 m,你的代码仍然会打印 "yes"。

isdkz 发表于 2023-5-11 19:26:30

sfqxx 发表于 2023-5-11 19:25
你是说发那个text?

对呀,我测试程序呢,结果把小号整没了,我想测完就删帖的{:10_277:}

sfqxx 发表于 2023-5-11 19:27:51

isdkz 发表于 2023-5-11 19:26
对呀,我测试程序呢,结果把小号整没了,我想测完就删帖的

你自己又不说
而且我也没举报
可能是管理封的吧?
那你为什么要发求助帖?
用户名是什么?

歌者文明清理员 发表于 2023-5-11 19:28:02

isdkz 发表于 2023-5-11 19:24
整天就想着举报,上次是不是你把我小号整没了?回复不删掉害我删不了测试贴,然后举报我小号?

怎么改请求头,我怕Threebody1也被封
我到没事,Threebody1得升级呀

isdkz 发表于 2023-5-11 19:30:19

sfqxx 发表于 2023-5-11 19:27
你自己又不说
而且我也没举报
可能是管理封的吧?


用户名:dkz6174510,被禁言了,算了不管它,我就那个贴没有写不要回复结果被你撞上了{:10_277:},我以为很快就能测完了,我发求助是因为要测试能不能自动回复求助帖

isdkz 发表于 2023-5-11 19:31:13

歌者文明清理员 发表于 2023-5-11 19:28
怎么改请求头,我怕Threebody1也被封
我到没事,Threebody1得升级呀

要改请求 ip?headers 加个 x-forwarded-for 不就行了?

sfqxx 发表于 2023-5-11 19:32:58

isdkz 发表于 2023-5-11 19:31
要改请求 ip?headers 加个 x-forwarded-for 不就行了?

现场指导?看来我也得学学

歌者文明清理员 发表于 2023-5-11 19:33:00

isdkz 发表于 2023-5-11 19:31
要改请求 ip?headers 加个 x-forwarded-for 不就行了?

如何预防405

sfqxx 发表于 2023-5-11 19:33:45

isdkz 发表于 2023-5-11 19:30
用户名:dkz6174510,被禁言了,算了不管它,我就那个贴没有写不要回复结果被你撞上了,我以为 ...

确实,你登你号看看看理由?
页: [1] 2 3
查看完整版本: 打印问题