某君新认识一网友。
当问及年龄时,他的网友说:
“我的年龄是个2位数,我比儿子大27岁,
如果把我的年龄的两位数字交换位置,刚好就是我儿子的年龄”
请你计算:网友的年龄一共有多少种可能情况?
提示:30岁就是其中一种可能哦.
请填写表示可能情况的种数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
思路1:
由于求解的是父亲的年龄,并且父亲的年龄在两位数之内,所以我们可以考虑使用枚举的方法进行求解。
且根据父亲年龄比儿子年龄大27岁以及父亲年龄的两位数字进行交换就是儿子的年龄可以得到一个求解公式:Fage - Sage = 27,rev(Fage) = Sage.
网友的求解方式:
#include<iostream>
using namespace std;
int main()
{
int count = 0;
for(int m = 0;m<100;m++)
{
int temp=(m%10)*10+m/10;
if(temp == m - 27){
//cout << m <<endl; //输出父亲的年龄并打印换行
count++;
}
}
cout<<count;
return 0;
}
我的求解方式是检索儿子的年龄范围,由于父亲的最大年龄为两位数,即99,则儿子的年龄范围不可能超过99 - 27 = 72岁,儿子最小年龄为0岁,这样就进一步的缩小了枚举的范围,但在线性时间内好像没有太大的影响。并且我使用了一个求解数字逆序的函数这更是程序本身又增加了一个函数调用的时间,所以程序效率不高。
#include <iostream>
using namespace std;
int reverse(int n)//将数字逆序
{
int rev = 0;
while(n)
{
int m = n % 10;
rev = rev * 10 + n % 10;
n /= 10;
}
return rev;
}
int main()
{
int a,b,count = 0;
for(b = 0; b <= 72; b++){
a = b + 27;
if(reverse(a) == b){
//cout << a << endl;//输出父亲的年龄
count++;
}
}
cout << count << endl;
return 0;
}
最后我想网友的代码与我自己缩写的继续了结合,比之前的函数调用要好了一些,但是也只是缩减了枚举的范围,还是在先行阶求解。
#include <iostream>
using namespace std;
//int reverse(int n)
//{
// int rev = 0;
// while(n)
// {
// int m = n % 10;
// rev = rev * 10 + n % 10;
// n /= 10;
// }
// return rev;
//}
int main()
{
int a,b,count = 0;
for(b = 0; b <= 72; b++){
a = b + 27;
int temp = (a % 10) * 10 + a / 10;
if(temp == b){
//cout << a << endl;输出父亲年龄
count++;
}
}
cout << count << endl;
return 0;
}
You can leave me a message if you find out anything incorrect in my diary, I'll correct it, thanks.
网友评论