30,369
社区成员




1.如果整数a是整数b的整数倍,则称b是a的约数。请问,有多少个正整数既是2020的约数,又是3030的约数。
对于大佬来说,这道题不在话下,我的话只能用很麻烦的方法来写:
#include<stdio.h>
int main()
{
int x=2020,y=3030;
for(int q=1;q<2020;q++)
{
if(x%q==0)
{
printf("%d\n",q);
}
}
for(int b=1;b<3030;b++)
{
if(y%b==0)
{
printf("%d\n",b);
}
}
return 0;
}
得到:
在这里面找到相同的数字,就既是2020的也是3030的约数了。
那么这里稍微改一下就可以变成算有几个约数了。
#include<stdio.h>
int main()
{
int x=2020,y=3030,sum1=0,sum2=0;
for(int q=1;q<1010;q++) //注意这里变成了数字的1/2
{
if(x%q==0)
{
sum1++;
}
}
for(int b=1;b<1515;b++)
{
if(y%b==0)
{
sum2++;
}
}
printf("%d,%d",sum1+1,sum2+1); //+1的原因是,这个程序本身没有算自己,自己也算是约数。
return 0;
}
数一下子,发现是对的。ok
2.
上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个数。
#include<stdio.h>
#include<algorithm>
using namespace std;
const int maxn=100;
int f[maxn][maxn],dp[maxn][maxn],sum1=0,sum2=0;
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
scanf("%d",&f[i][j]);
}
} //输入数塔
for(int j=1;j<=n;j++)
{
dp[n][j]=f[n][j];
} //从边界开始计算,即最后一行
for(int i=n-1;i>=1;i--) //从下往上
{
for(int j=1;j<=i;j++)
{
dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+f[i][j]; //令上一行的选中的那个数字与下一行和以后的数字的和中较大的那个做比
}
}
printf("%d",dp[1][1]);
return 0;
}
得到答案是30。
那如果它规定了向左下走的次数与向右下走的次数相差不能超过1该怎么办呢?
明天接着想吧,今天想了好久都没想出来。。。。。。。