1.猜年龄
小明带两个妹妹参加元宵灯会。别人问她们多大了,她们调皮地说:“我们俩的年龄之积是年龄之和的6倍”。
小明又补充说:“她们可不是双胞胎,年龄差肯定也不超过8岁啊。”
请你写出:小明的较小的妹妹的年龄。
注意: 只写一个人的年龄数字,请通过浏览器提交答案。不要书写任何多余的内容。
#include<iostream>
using namespace std;
int main()
{
for(int i = 1 ; i < 100 ; i++)
for(int j = i + 1 ; j < i + 8 ; j++)
if(i * j * 1.0 / 6 == i + j)
cout << i << endl;
return 0;
}
2.标题:切面条
一根高筋拉面,中间切一刀,可以得到2根面条。
如果先对折1次,中间切一刀,可以得到3根面条。
如果连续对折2次,中间切一刀,可以得到5根面条。
那么,连续对折10次,中间切一刀,会得到多少面条呢?
答案是个整数,请通过浏览器提交答案。不要填写任何多余的内容。
思路:
找到递推关系式
#include<iostream>
using namespace std;
int main()
{
int a[11] = {0};
a[0] = 2;
for(int i = 1; i <= 10 ; i++)
a[i] = 2 * a[i - 1] - 1;
cout << a[10] << endl;
}
3.神奇算式
题目:
由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。
比如:
210 x 6 = 1260
8 x 473 = 3784
27 x 81 = 2187
都符合要求。
如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。
请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。
//方案1:最原始的暴力枚举
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int num = 0;
int judge[10000] = {0};
int b[4] = {1};
for(int i = 1023; i <= 9876; i++)
{
bool ok = true;//判断是否含有重复数字
int temp = i;
int tre[10] = {0};
while(temp)
{
if(tre[temp % 10]) { ok = false;break;}
tre[temp % 10] = 1;
temp = temp / 10;
}
if(ok)
{
int a[4];
a[0] = i % 10;
a[1] = i / 10 % 10;
a[2] = i / 100 % 10;
a[3] = i / 1000;
//此时i是每个位都不同的一个四位数
for(int k = 2; k <= 98 ; k++)//k是除数
{
if(i % k)//如果不能整除
continue;
//如果可以整除的话
//现在需要判断的是i数字等于k和除数的数字
int div = i / k;
if(judge[div]) continue;
if(k < 10)//如果是一位数乘以三位数
{
b[0] = div % 10;
b[1] = div / 10 % 10;
b[2] = div / 100;
b[3] = k;
}
if(k >= 10)//如果是两位数乘两位数
{
b[0] = k % 10;
b[1] = k / 10;
b[2] = div % 10;
b[3] = div / 10;
}
sort(a,a + 4);
sort(b,b + 4);
if(a[0] == b[0] && a[1] == b[1] && a[2] == b[2] && a[3] == b[3])
{
judge[k] = 1;
// cout << k << "*" << div << " = " << i << endl;
num++;
}
}
}
}
cout << num << endl;
}
/*
//方案2:进一步改进
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int num = 0;
for(int i = 1023;i <= 9876;i++)//从结果枚举更简便
{
int book1[10] = {0},tem1 = i;//标记结果的四位数字
bool flag1 = true;//是否没有重复数字
while(tem1)//分解与标记
{
if(book1[tem1 % 10])
{
flag1 = false;
break;
}
book1[tem1 % 10] = 1;
tem1 /= 10;
}
if(!flag1) continue;//四位数字均不相同
for(int j = 1 ; j <= 98; j++)//枚举除数
{
if(i % j) continue;//除不尽
int tem2 = j,book2[10] = {0};
memcpy(book2,book1,sizeof(book2));//将1号标记数组复制给2号
bool flag2 = true;//是否是被标记的数字且没有重复
while(tem2)
{
if(!book2[tem2 % 10])
{
flag2 = false;
break;
}
book2[tem2 % 10] = 0;//去掉标记,便于判断被除数的情况
tem2 /= 10;
}
if(flag2)
{
int tem3 = i / j;
if(j > tem3) continue;//去重
bool flag3 = true;//和标记2的道理相同
while(tem3)
{
if(book2[tem3 % 10])book2[tem3 % 10] = 0;
else
{
flag3 = false;
break;
}
tem3 /= 10;
}
if(flag3) num++;
}
}
}
cout << num << endl;
}