乘法口诀数列:https://www.acwing.com/problem/content/3466/
剪绳子:https://www.acwing.com/problem/content/68Sin
SinSine之舞:http://lx.lanqiao.cn/problem.page?gpid=D5272
数列:https://www.acwing.com/problem/content/430/
1,乘法口诀
这道题没有多大难度,纯模拟即可
i++ 即后加加,原理是:先自增,然后返回自增之前的值
++i 即前加加,原理是:先自增,然后返回自增之后的值
#include <bits/stdc++.h>
using namespace std;
int m;
int a[1010].
int main(){
int a1,a2,ans=0;
cin>>a1>>a2>>m;
a[0]=a1,a[a2.
ans=a1*a2;
for(int i=2,j=1;i<m;j++,i++){
if(ans<10)
a[i]=ans;
else{
a[i]=ans/10;
a[++i]=ans%10;
}
ans=a[j]*a[j+1];
}
for(int i=0;i<m;i++)
cout<<a[i]<<" ";
return 0;
}
2,剪绳子
这道题用到的算法是浮点二分,需要找到最优解,但是如果直接做会比较麻烦,但可以用二分寻找答案,可以先设一个满足条件的X(是这道题具有判断性),然后确定是不是最优的
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],n,m;
bool check(double mid){
int cnt=0;
for(int i=0;i<n;i++){
cnt+=a[i]/mid;//向下取整
}
return cnt>=m;//,满足条件返回true
}
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
double l=0.0,r=1e9;
while(r-l>1e-4)//最小精度
{
double mid=(l+r)/2;.//注意与整数二分的区别
if(check(mid))l=mid;
else r=mid;
}
printf("%.2lf\n",l);
}
3,Sine之舞
这道题主要考察递归算法和递推思想,是有点难度的,需要确定An,Sn,且Sn递归中包括An递归,
A1=sin(1);
A2=sin(1-sin(2)),
S1=A1+1
S2=(A1+2)A2+1
#include <bits/stdc++.h>
using namespace std;
void An(int i,int n){
if(i==1)
cout<<"sin("<<i<<")";
else{
if(i%2==0){
cout<<"sin("<<i<<"+";
An(i+1,n);
cout<<")";
}
else{
cout<<"sin("<<i<<"-";
An(i+1,n);
cout<<")";
}
}
}
void Sn(int n,int i){
if(n==1){
An(1,n);
cout<<"+"<<i;
}
else{
cout<<"(";
Sn(n-1,i+1);
cout<<")";
An(1,n);
cout<<"+"<<i;
}
}
int main()
{
int n;
cin>>n;
Sn(n,1);
return 0;
}