第三次算法练习:
两道算法题

第一题:

解决方案:
下面是我的代码
#include<stdio.h>
int main()
{
int m,i,j,x,y;
scanf("%d",&m);//输入需要进行运算的组数
for(i=0;i<m;i++)//进行m次循环进行输入
{
scanf("%d %d",&x,&y);
int h=1,f=1;//其约数中必有1
for(j=2;j<x;j++)
{
if(x%j==0)
{
h+=j;
}
}//求出x的所有真约数之和
for(j=2;j<y;j++)
{
if(y%j==0)
{
f+=j;
}
}//同上,求出y的所有真约数之和
if(h==y&&f==x)//判断是否x的真约数之和等于y且y的真约数之和等于x
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}
可分别求该组数中两个数的真约数和,我使用了两个循环,分别来求x和y的真约数和,最后用了一个if语句进行判断是否满足条件,然后输出相应的值。
第二题:

解决方案:
#include<stdio.h>
#include<string.h>
float t[105]; //储存最短时间
int N,C,T,VR,VT1,VT2;
int a[105]; //储存每个站点的距离
void TIME()
{
double time,min; //time储存每次的时间,min储存最小时间
memset(t,-1,sizeof(t)); //数组清空
int len,i,j;
t[0]=0; //起点用时为0
for(i=1;i<N+2;i++) //站点循环
{
min=100000000000; //将min设为尽量大的数
for(j=0;j<i;j++) //每次都从第一个站点算起
{
len=a[i]-a[j]; //第i和第j个站点的距离
if(len>C) //距离大于电量 ,脚蹬
{
time=1.0*C/VT1+(len-C+0.0)/VT2;
}
else //完全用电
{
time=1.0*len/VT1;
}
time+=t[j]; //time储存行驶到第j个站点的最短时间
if(j) //如果加电
{
time+=T; //时间++
}
if(min>time) //min储存当前最小时间
{
min=time;
}
}
t[i]=min; //t储存到每个站点的最小时间
}
}
int main()
{
int L,i,j;
while(scanf("%d",&L)!=EOF)
{
scanf("%d%d%d%d%d%d",&N,&C,&T,&VR,&VT1,&VT2);
for(i=1;i<=N;i++)
{
scanf("%d",&a[i]);
} //花样输入
a[0]=0;a[N+1]=L; //第一个站点为0,最后一个距离L
TIME(); //调用
if(1.0*L/VR<t[N+1])
{
printf("Good job,rabbit!\n");
}
else
{
printf("What a pity rabbit!\n");
}
}
return 0;
}
void *memset(void *s, int c, unsigned long n):
函数的功能是:将指针变量 s 所指向的前 n 字节的内存单元用一个“整数” c 替换,注意 c 是 int 型。s 是 void* 型的指针变量,所以它可以为任何类型的数据进行初始化。
这篇博客包含两道算法题的解决方案。第一题涉及寻找两个数的真约数和是否相等;第二题是电动车续航路径规划问题,通过计算每个站点最短时间,判断最终是否能完成全程。博主使用了C语言实现,涉及到循环、条件判断及数组操作。

被折叠的 条评论
为什么被折叠?



