记录C++中一奇怪现象(P1217)
原题如下:emm...应该是我道行太浅吧...
我采用的是排除偶数数位的回文数,前两数位的手动输出,只判断、构造3,5,7位的回文质数.
第一次提交:(9/9WA)
#include <iostream>
using namespace std;
bool zhishu(int x){ //判断质数的函数
if(x<2)return false;
if(x==2)return true;
for(int i=2;i*i<=x;i++){
if(x%i==0)return false;
}
return true;
}
int main()
{
int a,b,c[]={5,7,11},i,d1,d2,d3,d4,num;
cin>>a>>b;
for(i=0;i<2;i++)//一位、两位
{
if(c[i]>=a && c[i]<=b)
cout<<c[i]<<"\n";
}
for(d1=1;d1<=9;d1+=2)//三位数
for(d2=0;d2<=9;d2++){
num = 101*d1 + 10*d2;
if(num>=a && num<=b && zhishu(num))
cout<<num<<"\n";
else
return 0;
}
for(d1=1;d1<=9;d1+=2)//五位数
for(d2=0;d2<=9;d2++)
for(d3=0;d3<=9;d3++){
num = 10001*d1 + 1010*d2 + 100*d3;
if(num>=a && num<=b && zhishu(num))
cout<<num<<"\n";
else
return 0;
}
for(d1=1;d1<=9;d1+=2)//七位数
for(d2=0;d2<=9;d2++)
for(d3=0;d3<=9;d3++)
for(d4=0;d4<=9;d4++){
num = 1000001*d1 + 100010*d2 + 10100*d3 + 1000*d4;
if(num>=a && num<=b && zhishu(num))
cout<<num<<"\n";
else
return 0;
}
return 0;
}
第二次提交:(3/9AC)
#include<iostream>
using namespace std;
bool zhishu(long long int x){ //判断质数的函数
for(int i=2;i*i<=x;i++){
if(x%i==0)return false;
}
return true;
}
int main()
{
long long int a,b,num;
int c[]={5,7,11};
int i,d1,d2,d3,d4;
cin>>a>>b;
for(i=0;i<3;i++)//一位、两位
{
if(c[i]>=a && c[i]<=b)
cout<<c[i]<<"\n";
}
for(d1=1;d1<=9;d1+=2)//三位数
for(d2=0;d2<=9;d2++){
num = 101*d1 + 10*d2;
if(num>=a && num<=b){
if(zhishu(num))cout<<num<<"\n";
}
else
return 0;
}
for(d1=1;d1<=9;d1+=2)//五位数
for(d2=0;d2<=9;d2++)
for(d3=0;d3<=9;d3++){
num = 10001*d1 + 1010*d2 + 100*d3;
if(num>=a && num<=b){
if(zhishu(num))cout<<num<<"\n";
}
else
return 0;
}
for(d1=1;d1<=9;d1+=2)//七位数
for(d2=0;d2<=9;d2++)
for(d3=0;d3<=9;d3++)
for(d4=0;d4<=9;d4++){
num = 1000001*d1 + 100010*d2 + 10100*d3 + 1000*d4;
if(num>=a && num<=b){
if(zhishu(num))cout<<num<<"\n";
}
else
return 0;
}
return 0;
}
第三次:(9/9AC)
#include<iostream>
using namespace std;
bool zhishu(long long int x){ //判断质数的函数
for(int i=2;i*i<=x;i++){
if(x%i==0)return false;
}
return true;
}
int main()
{
long long int a,b,num;
int c[]={5,7,11};
int i,d1,d2,d3,d4;
cin>>a>>b;
for(i=0;i<3;i++)//一位、两位
{
if(c[i]>=a && c[i]<=b)
cout<<c[i]<<"\n";
}
for(d1=1;d1<=9;d1+=2)//三位数
for(d2=0;d2<=9;d2++){
num = 101*d1 + 10*d2;
if(num>=a)if(num<=b){
if(zhishu(num))cout<<num<<"\n";
}
else
return 0;
}
for(d1=1;d1<=9;d1+=2)//五位数
for(d2=0;d2<=9;d2++)
for(d3=0;d3<=9;d3++){
num = 10001*d1 + 1010*d2 + 100*d3;
if(num>=a)if(num<=b){
if(zhishu(num))cout<<num<<"\n";
}
else
return 0;
}
for(d1=1;d1<=9;d1+=2)//七位数
for(d2=0;d2<=9;d2++)
for(d3=0;d3<=9;d3++)
for(d4=0;d4<=9;d4++){
num = 1000001*d1 + 100010*d2 + 10100*d3 + 1000*d4;
if(num>=a)if(num<=b){
if(zhishu(num))cout<<num<<"\n";
}
else
return 0;
}
return 0;
}
我发现仅仅是改变了if的条件数目,就造成了AC与WA的不同???
不同的判断方式 | 结果 |
---|---|
if(... && ... && ...){} | 全WA |
if(...)if(...)if(...){} | 3AC |
if(...)if(...){if(...)} | 全AC |
不知为何?我仍在探索中.