打印问题
#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: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;
}
有用请设置最佳答案 这段代码主要是判断一个数能否通过以下两个操作变成另一个数:
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并跳过本次循环。 sfqxx 发表于 2023-5-11 19:06
1
占楼没用,上次跟Taoyuanh的抢最佳的经历我仍铭记着…… 歌者文明清理员 发表于 2023-5-11 19:11
占楼没用,上次跟Taoyuanh的抢最佳的经历我仍铭记着……
举报优先看2楼{:10_256:} sfqxx 发表于 2023-5-11 19:13
举报优先看2楼
可是那次 ,Taoyuanh直接发的,我只占个楼,帖子内容改好了,就,,,,,
就,最佳没了 歌者文明清理员 发表于 2023-5-11 19:16
可是那次 ,Taoyuanh直接发的,我只占个楼,帖子内容改好了,就,,,,,
就,最佳没了
看情况吧, sfqxx 发表于 2023-5-11 19:17
看情况吧,
我要写一个自动回帖脚本 歌者文明清理员 发表于 2023-5-11 19:19
我要写一个自动回帖脚本
举报封IP{:10_256:} sfqxx 发表于 2023-5-11 19:19
举报封IP
整天就想着举报,上次是不是你把我小号整没了?回复不删掉害我删不了测试贴,然后举报我小号?{:10_334:} isdkz 发表于 2023-5-11 19:24
整天就想着举报,上次是不是你把我小号整没了?回复不删掉害我删不了测试贴,然后举报我小号?
你是说发那个text? 你的代码有一些逻辑问题,所以当 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"。 sfqxx 发表于 2023-5-11 19:25
你是说发那个text?
对呀,我测试程序呢,结果把小号整没了,我想测完就删帖的{:10_277:} isdkz 发表于 2023-5-11 19:26
对呀,我测试程序呢,结果把小号整没了,我想测完就删帖的
你自己又不说
而且我也没举报
可能是管理封的吧?
那你为什么要发求助帖?
用户名是什么? isdkz 发表于 2023-5-11 19:24
整天就想着举报,上次是不是你把我小号整没了?回复不删掉害我删不了测试贴,然后举报我小号?
怎么改请求头,我怕Threebody1也被封
我到没事,Threebody1得升级呀 sfqxx 发表于 2023-5-11 19:27
你自己又不说
而且我也没举报
可能是管理封的吧?
用户名:dkz6174510,被禁言了,算了不管它,我就那个贴没有写不要回复结果被你撞上了{:10_277:},我以为很快就能测完了,我发求助是因为要测试能不能自动回复求助帖 歌者文明清理员 发表于 2023-5-11 19:28
怎么改请求头,我怕Threebody1也被封
我到没事,Threebody1得升级呀
要改请求 ip?headers 加个 x-forwarded-for 不就行了? isdkz 发表于 2023-5-11 19:31
要改请求 ip?headers 加个 x-forwarded-for 不就行了?
现场指导?看来我也得学学 isdkz 发表于 2023-5-11 19:31
要改请求 ip?headers 加个 x-forwarded-for 不就行了?
如何预防405 isdkz 发表于 2023-5-11 19:30
用户名:dkz6174510,被禁言了,算了不管它,我就那个贴没有写不要回复结果被你撞上了,我以为 ...
确实,你登你号看看看理由?