toupper函数
1.头文件包含
#include <ctype.h>
2.功能
把大写字母换小写字母,把小写字母换大写字母
3. 演示
int toupper(int c);
#include <stdio.h>
int main()
{
printf("toupper('-')=%c\n",toupper('-'));
printf("toupper('0')=%c\n",toupper('0'));
printf("toupper('a')=%c\n",toupper('a'));
printf("toupper('A')=%c\n",toupper('A'));
}
islower函数
1.头文件
#include <ctype.h>
2.功能
判断参数c是否为小写字母
3.演示
#include <stdio.h>
int main()
{
printf("islower('-')=%d\n",islower('-'));
printf("islower('0')=%d\n",islower('0'));
printf("islower('a')=%d\n",islower('a'));
printf("islower('A')=%d\n",islower('A'));
}
isalpa函数
1.头文件包含
#include <ctype.h>
2.功能
测试字符是否为英文字母
3.演示
int isalpha(int c)
切蛋糕公式
( x 3 + 5 x + 6 ) 6 \frac{(x^3+5x+6)}{6} 6(x3+5x+6)
gcd模板
int gcd(int m, int n)
{
if (m % n == 0)
return n;
else
return gcd(n, m % n);
}
过大数做法
组合计算公式:C(n,m)=[n*(n-1).(n-m+1)]/m!=[n(n-1).(n-m+1)](n-m)!/m!*(n-m)!=n!/[(n-m)!*m!]
其中C(n,m)=n!/(n-m)!*m!是众所周知的数学公式,然而用于程序计算并不十分有效。
原始的公式C(n,m)=[n*(n-1)*.(n-m+1)]/m!,用于程序计算是十分有效的。
21!为负数
程序说明
一边做乘法,一边做除法,是一个不错的主意,可以避免结果增大的过快而产生溢出,用同类型变量可以算更大的n和m。
乘法是先乘以大的数,除法是先除以小的数,仔细观察推导可以发现,除法总是能够整除的。这是因为,2个连续的整数必有一个是偶数即必有一个数是2的倍数,3个连续的整数必有一个数是3的倍数,等等。考虑m个连续的整数,用m做模除,其中一个的余数必然是0(鸽巢原理),即必有1个整数能被m整除。
编写的函数c()可以用于n和m比较小的情况,该函数具有通用性,计算速度也比较快。
程序不够优化,重新改写了C++语言程序。改写了函数c(),循环的每一步做了简化速度会更快一些。函数中,乘法改为从小到大做乘法,这样做可以计算的n和m范围有可能更大一些。
stl
queue
#include<queue>
queue<t>a;//申明
priority_queue<int>pq;//优先队列
int main()
{
int n;
while(cin>>n)
{
a.push(n);
}
while(!a.empty())
{
cout<<a.front()<<endl;
a.pop();
}
//后入后出
//队列
priority_queue<int>pq;//优先队列
//从大到小排列
priority_queue<int,vector<int>,greater<int>>spq//从小到大排序
int n;
while(cin>>n&&n)
{
pq.push(n);
}
while(!pq.empty())
{
cout<<pq.top()<<endl;
pq.pop();
}
}
stack
#include<stack>
stack<int>st1
int main()
{
int n;
while(cin>>n)
{
st1.push(n);//输入
}
while(st1.empty())
{
cout<<st1.top()<<endl;//访问栈顶
st1.pop();
}
//后入先出
st1.size();
return 0;
}
vector
#include<vector>
vector<int>vt;
int main()
{
int n;
while(cin>>n&&n)
{
vt.push_back(n);
}
int len=vt.size();
for(int i=0;i<len;i++)
{
cout<vt[i]<<endl;
}
//stl 左闭右开[ )
//vector<int>::iterator it ==auto
for(auto it=vt.begin();it!=end();++it)
{
cout<<*it<<endl;
}
vt.capacity(); //还有多少空位,倍增算法
//vector<int>::reverse_iterator
for(auto it=vt.rbegin();it!=rend();++it)
{
cout<<*it<<endl;
}//反向输出
vt.clear;//清空
meset( 数组名,数组名+x ,cmp );
memset(vt,0,vt+x);
}
set
#include<set>
int main()
{
set<int>st;
//没有重复元素
//有序
int n;
while(cin>>n&&n)
{
st.insert(n);
}
set<int>::iterator it;
for(it=st.begin();it!=st.end();++it)
{
cout<<*it<<endl;
}
}