今天帮学弟解的两个题,问题较简单,但对于我来说还得好好学下:
第一题思路可以用递归,然而我的递归学得不好orz,感觉DP的代码更简单,运用动态转移方程dp[j]=dp[j]+dp[j-i],代码如下:
#include<stdio.h>
#include<string.h>
int main()
{
int dp[100+5];
memset(dp,0,sizeof(dp));
dp[0]=1;
int n;
scanf("%d",&n);
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
if(i<=j)
dp[j]=dp[j]+dp[j-i];
printf("%d\n",dp[n]);
return 0;
}
#include<stdio.h>
int main()
{
long long s;
int n;
scanf("%d",&n);
s=1;
for(int i=2; i<=n; i++)
{
s*=i;//阶乘处理
while(s%10==0)
s/=10;//末尾为零时,把零丢掉
s%=100000;//把前面几位的数丢掉,避免数太大运行超时,且对于后面几位的阶乘无影响
}
printf("%lld\n",s%10);//此时s末尾无零了,直接对10取余输出最后一位数
return 0;
}