我不懂C,用C++写给你,语法和原理是一样的,只是写法有些许不同,我添加了注释,应该看得懂的。
1.首先申明一点,比95859大的回文数中最小的应该也是5位数,所以我方便起见直接用了5位的数组,然后数组赋初值9,5,8,5,9,每次数组最后一位+1,判断进位后进行一次回文检测
#include
#include
using namespace std; //命名空间,C中不用
int main()
{
int s[5]={9,5,8,5,9}; //数组表示路程
double v; //速度
while(1)
{
s[4]++; //路程增加
for(int i=4;i>=0;i--) //判断进位
{
if(s[i]==10)
{
s[i]=0;
s[i-1]++;
}
}
if(s[0]==s[4]&&s[1]==s[3]) //判断是否是回文,若是,把数组换算成int
{
int l=s[0]*10000+s[1]*1000+s[2]*100+s[3]*10+s[4];
l-=95859;
v = l/7;
break;
}
}
cout << setprecision(2) << std::fixed << v << endl; //输出速度v,同时限定输出两位小数
return 0; //C中不用
}
2.我们设降价后的票价为x,人数为n,我觉得题目有点歧义,因为不清楚是一开始票价就变为x,还是中途降价为x后人数才增加了三分之一,第二种情况很好算,你自己列个方程用c算下,这里只写第一种,即一开始就降价了。由题可得方程是,x*n*4/3-40n=40n/10,所以x初值为40,每次-1,当满足等式的时候的x即为票价,作差可得降价多少元
#include
using namespace std; //命名空间,C中不用
int main()
{
int x=40; //最初的票价
while(x--) //每次循环x-1
{
if(x*4/3-40==4) //如果x满足等式则为当前票价,跳出循环
break;
}
cout << 40-x << endl; //输出降价e
return 0;
}
3.第三题我想不出怎么用C++把题目的意思表达出来,但是可以从数学的角度入手,我们设老师的年龄是y,学生的年龄为x,若干年分别用k1~k5来表示,可得式子
y=7x
y+k1=6(x+k1) --> x=5k1
y+k2=5(x+k2) --> x=2k2
y+k3=4(x+k3) --> x=k3
y+k4=3(x+k4) --> 2x=k4
y+k5=2(x+k5) --> 5x=k5
由于,以上所有变量均为正数,不难发现,x为5和2的公倍数,最小的就是10了,那么答案肯定是10,至于具体的语言实现,我先写个不太成熟的你参考下。根据我们的分析,学生的最小年龄从3岁开始,这个是合乎生活的年龄,百度可得地球上最长寿的人只活了138岁,为了安全起见,老师年龄的上限设为200岁,即学生为30岁,这是我们判断的范围
#include
using namespace std; //命名空间,C中不用
int main()
{
int s=3; //学生的年龄
int t; //老师的年龄
int b1=0,b2=0,b3=0,b4=0,b5=0;
for(s=3;s<30;s++)
{
t=7*s; //老师年龄是学生7倍
for(int y=t,x=s;x<100;x++,y++) //判断是否合乎题意
{
int k1=6*x;
int k2=5*x;
int k3=4*x;
int k4=3*x;
int k5=2*x;
if(y%k1==0) //老师年龄是学生6倍
b1=1;
if(y%k2==0&&b1==1) //只有满足上一个条件后的若干年,这个条件才能进行判断
b2=1;
if(y%k3==0&&b1*b2==1)
b3=1;
if(y%k4==0&&b1*b2*b3==1)
b4=1;
if(y%k5==0&&b1*b2*b3*b4==1)
b5=1;
if(b5)
break;
}
if(b5)
break;
else {b1=0,b2=0,b3=0,b4=0,b5=0;}
}
cout << s << " " << t << endl;
return 0;
}
第一题:
# include
# include "string.h"
# define N 20
# define TRUE 1
# define FALSE 0
int IsPalindrome (int a)
{
char arr1[N] = {0}, arr2[N] = {0} ;
int temp, i, j, iCount = 1 ;
//得到数字a的位数
temp = a ;
while (1)
{
temp = temp / 10 ;
if (temp > 0)
iCount ++ ;
else
break ;
}
//把数字a存到数组arr1中
for (i = 0 ; i < iCount ; i ++)
{
arr1[i] = a % 10 ;
a = a / 10 ;
}
//把数组arr1倒序存到数组arr2中
for (j = iCount - 1, i = 0 ; i < iCount ; i ++, j --)
arr2[j] = arr1[i] ;
//如果arr1与arr2相同,则是回文数
if (strcmp (arr1, arr2) == 0)
return TRUE ;
else
return FALSE ;
}
main()
{
int iNum = 95859 ;
float iSpeed ;
int kkk = 0 ;
//找到95859的下一个回文数存在iNum中
printf ("此题多解:\n") ;
while (1)
{
iNum += 1 ;
if (IsPalindrome (iNum))
{
iSpeed = (float)(iNum - 95859) / (float)7 ;
if (iSpeed > 200) //假设车速不超过200
break ;
printf ("回文数:%d 车速:%.2f Km/h\n", iNum, iSpeed) ;
}
}
}
第二题小学数学题:穷举法解一元方程。
第三题答案:
# include "stdio.h"
# define TRUE 1
# define FALSE 0
int IsTrue (int XiaoMingAge, int TeacherAge, int Beishu) ;
int main ()
{
int XiaoMingAge = 1 ;
while (XiaoMingAge < 150)
{
//依次传入小明的年龄和老师的年龄和相应的倍数,如果都满足刚输出,
//如果不满足测试下一个 ”XiaoMingAge ++“(从小明一岁开始测试,到 //小明150岁结束(够长了吧))
if (IsTrue (XiaoMingAge, 7 * XiaoMingAge, 6)
&& IsTrue (XiaoMingAge, 7 * XiaoMingAge, 5)
&& IsTrue (XiaoMingAge, 7 * XiaoMingAge, 4)
&& IsTrue (XiaoMingAge, 7 * XiaoMingAge, 3)
&& IsTrue (XiaoMingAge, 7 * XiaoMingAge, 2))
{
printf ("小明年龄:%d\t老师年龄:%d\n",
XiaoMingAge, 7 * XiaoMingAge) ;
}
XiaoMingAge ++ ;
}
return 0 ;
}
//传入一个小明的年龄和老师的年龄,看看是否满足Beishu,如果满足返回TRUE
int IsTrue (int XiaoMingAge, int TeacherAge, int Beishu)
{
while (XiaoMingAge < 150)
{
XiaoMingAge ++ ;
TeacherAge ++ ;
if (TeacherAge / XiaoMingAge == Beishu
&& TeacherAge % XiaoMingAge == 0)
return TRUE ;
}
return FALSE ;
}