下段代码是在主函数里面遍历了两个循环,一个循环找三位数,另一个循环找可能的二位数,最终找到所需的值。 因为要遍历2个循环,所以在时间上会有所耗时。
#include<iostream>
using namespace std;
int f1(int n,int &t) //f1函数判断所输入的三位数是否为某个二位数的平方
{ //&t为函数的引用传递
if(n==t*t)return 1;
return 0;
}
int f2(int n) //f2判断该数是否按升序排序
{
int i,j,k;
i=n%10; //个位
j=n%100/10; //十位
k=n/100; //百位
if(i!=j&&j!=k&&i!=k) //个十百位数各不相同
if(i>j&&j>k)return 1;
return 0;
}
int main()
{
int n,i;
for (n = 100; n <= 999; n++) //此循环遍历所有的三位数
{
for(i=11;i<32;i++) //此循环遍历可能为三位数平方根的二位数
{
if(f1(n,i)&&f2(n))cout<<n<<'\t'<<i<<"^2\n";
}
}
return 0;
}
接下面的是把对二位数的遍历放在了f1函数里面,用到了引用传递,在函数f1里面找二位数,并返回。
#include<iostream>
using namespace std;
int f1(int n,int &t) //f1函数判断所输入的三位数是否为某个二位数的平方
{ //&t为函数的引用传递
for(t=11;t<32;t++){ //此循环遍历可能为三位数平方根的二位数
if(n==t*t)return 1;}
return 0;
}
int f2(int n) //f2判断该数是否按升序排序
{
int i,j,k;
i=n%10; //个位
j=n%100/10; //十位
k=n/100; //百位
if(i!=j&&j!=k&&i!=k) //个十百位数各不相同
if(i>j&&j>k)return 1;
return 0;
}
int main()
{
int n,i;
for (n = 100; n <= 999; n++) //此循环遍历所有的三位数
{
if(f1(n,i)&&f2(n))cout<<n<<'\t'<<i<<"^2\n";
}
return 0;
}
再下面的一串代码只在主函数里面遍历了三位数,省去了循环套循环的耗时,但运用了引用传递,在f1函数中不仅返回了判断条件,还返回了满足条件的二位数。
#include<iostream>
#include<cmath>
using namespace std;
int f1(int n,int &t) //f1函数判断所输入的三位数是否为某个二位数的平方
{ //&t为函数的引用传递,形参t和实参i用同一个地址,所以可以将t的值直接传给i
float m=sqrt(n);
if(fabs(m-(int)m)<1e-6) //这里判断m是否为二位数整数
{t=m;return 1;}
return 0;
}
int f2(int n) //f2判断该数是否按升序排序
{
int i,j,k;
i=n%10; //个位
j=n%100/10; //十位
k=n/100; //百位
if(i!=j&&j!=k&&i!=k) //个十百位数各不相同
if(i>j&&j>k)return 1;
return 0;
}
int main()
{
int n,i=10;
for (n = 100; n <= 999; n++) //此循环遍历所有的三位数
{
if(f1(n,i)&&f2(n))cout<<n<<'\t'<<i<<"^2\n";
}
return 0;
}