出去暑实停更了5天回来继续。
一、n!中有多少个质因子p
可以应用于求n!的末尾0的数量
#include<stdio.h>
//计算1-n中每个数都有多少个质因子p?
int cal(int n,int p)
{
int cnt=0;
int i;
for(i=2;i<=n;i++)
{
int temp=i;
while(temp%p==0)
{
cnt++;
temp/=p;
}
}
return cnt;
}
//而对于n非常大,如n=10^18是无法承受的
int cal2(int n,int p)
{
int tp=p;
int cnt=0;
while(tp<n)
{
cnt+=n/tp;
tp*=p;
}
return cnt;
}
//或者p不动,n/=p
int cal22(int n,int p)
{
int cnt=0;
while(n)
{
cnt+=n/p;
n/=p;//相当于分母多乘一个p
}
return cnt;
}
二、组合数计算
#include<stdio.h>
long long res[67][67]={0};
//递归写法
long long C(long long n,long long m)
{
if(m==0||m==n) return 1;
if(res[n][m]!=0) return res[m][n];
else return res[n][m]=C(n-1,m)+C(n-1,m-1);
}
//定义式变形写法
long long C2(long long n,long long m)
{
long long ans=1;
for(int i=1;i<=m;i++)
{
ans=ans*(n-m+i)/i; //要先乘再处,保证结果为整数
}
return ans;
}
三、STL:lower_bound() 和 upper_bound()
lower_bound(first,last,val)
lower_bound() 和 upper_bound()用在一个有序数组或容器中,lower_bound寻找第一个值大于等于val,upper_bound寻找第一个值大于val
如果没有需要寻找的元素,返回可以插入该元素的位置的指针或迭代器
int* upperPos;//注意是指针类型
1,2,3,3,3,3,4,4,5
upperPos=lower_bound(a,a+9,3)
如果要用于获取元素下标,直接输出即可:
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
int a[10]={1,2,2,3,3,3,5,5,5,5};
printf("%d %d",lower_bound(a,a+10,3)-a,upper_bound(a,a+10,3)-a);
return 0;
}
四、中缀表达式计算
step1:将中缀表达式转为后缀表达式change()
step2:计算后缀表达式 cal()
#include<stdio.h>
#include<iostream>
#include<queue>
#include<stack>
#include<map>
#include<string>
using namespace std;
struct node
{
double num;
char op;
bool flag;//true表示操作数,false表示操作符
};
string str;//存放整个表达式
stack<node> s;
queue<node> q;
map<char,int> mp;//操作符映射为优先值
void change() //中缀转成后缀
{
int i;
node temp;
//遍历中缀表达式
for(i=0;i<str.length();)
{
if(str[i]>='0'&&str[i]<='9') //如果是操作数
{
temp.flag=true;
temp.num=str[i]-'0';
i++;
while(str[i]>='0'&&str[i]<='9'&&i<str.length())
{
temp.num=temp.num*10+(str[i]-'0');
i++;
}
q.push(temp);
}
else
{
temp.flag=false;
temp.op=str[i];
while(!s.empty()&&mp[temp.op]<=mp[s.top().op])
{
q.push(s.top());
s.pop();
}
s.push(temp);
i++;
}
}
while(!s.empty())
{
q.push(s.top());
s.pop();
}
}
double cal()//后缀表达式计算
{
double temp1,temp2;
node cur,temp;
while(!q.empty())
{
cur=q.front();
q.pop();
if(cur.flag==true)
{
s.push(cur);
}
else
{
temp2=s.top().num;
s.pop();
temp1=s.top().num;
s.pop();
temp.flag=true;
if(cur.op=='+') temp.num=temp1+temp2;
else if(cur.op=='-') temp.num=temp1-temp2;
else if(cur.op=='*') temp.num=temp1*temp2;
else if(cur.op=='/') temp.num=temp1/temp2;
s.push(temp);
}
}
return s.top().num;
}
int main()
{
mp['+']=1;
mp['-']=1;
mp['*']=2;
mp['/']=2;
while(getline(cin,str),str!="0")
{
for(string::iterator it=str.end()-1;it!=str.begin()-1;it--)
{
if(*it==' ') str.erase(it);
}
while(!s.empty()) s.pop();
change();
printf("%.2f",cal());
}
}
补充一些要点: