目录
字符串处理
日期计算
枚举算法:(暴力穷尽所有可能)
DP(动态分配)→(递归)+(递推)
sort排序
1B(字节)=8b(位)
1 KB = 1024 B
1 MB = 1024 KB
题目:
目录
字符串处理
#include
using namespace std;
int main()
{
int a[26] = {0};//输入26个英文字母
int max = 0;//最大次数
char max_c ;//最大次数的字母
string s;cin >> s;
for(int i = 0 ; i < s.size(); i++)//s.length(),s.size()
{++a[s[i] - 'a' ];}//'a'对应ASCII码的整数值,a[0]开始
for(int i = 25 ; i >= 0; --i)//为了输出字典序最小的,得要倒序
{
if(a[i] >= max)
{
max = a[i];
max_c = (char) i + 'a' ;//类型转化
}
}
cout << max_c << endl << max << endl;//输出,注意换行
return 0;
}
#include
using namespace std;
void trans(char &c)//首字母变大写
{
if(c >= 'a' && c <= 'z')
c -= 32 ;
}
bool is_char(char c)
{
if((c >= 'a' && c <= 'z')||(c >= 'A' && c <= 'Z')) {return 1;}// ||代表或,只要一个为真结果就为真
return 0 ;
}
bool is_num(char c)
{
if(c >= '0'&& c <= '9'){return 1;}// &&代表与/且,二者都为真才为真
return 0 ;
}
int main()
{
string s ;
getline(cin,s) ;//只能读取不带空格的一个单词,要读一句话得要getline
if(is_char(s[0])) trans(s[0]);
for(int i = 0;i < s.size(); ++i)
{
if(s[i] ==' '&& s[i] != s.size())
{
if(s[i+1]==' ')
continue ;//遇到连续空格,跳出
cout << s[i] ;//照常答应
trans(s[i+1]) ;//将下一位转化为大写
}
else if((is_char(s[i])&&is_num(s[i+1])) || (is_num(s[i]) && is_char(s[i+1]) ) )//判断 字母加数字或者数字加字母
cout << s[i] <<'_' ;//是就输出 前一个 + _
else cout << s[i] ;
}
return 0;
}
函数名 | 功能 |
strcpy | 复制字符串 |
strcat | 字符串拼接 |
strcmp | 字符串比较 |
strlen // s.size() | 获取字符串长度 |
字符串的复制
#include
strcpy(new , old ) ;// string copy 的缩写
将old字符串复制给 new ,
作用是:把含有\0结束符的字符串复制到另一个地址空间,返回值类型为char *
字符串的拼接
char* strcat( char* new ,char* old )
将old 字符串拼接到new 后面(new得有足够的空间)
字符串的比较
int strcmp(char* str1 , char *str2 ) ,从第一个字符开始逐字比较两个字符串的ASCII码。
如果下标为 i 的字符不相等 ,
则返回str 1 [ i ] - str 2 [ i ] ,
否则,返回()。
#include
#include
int main()
{
char* str1 = "cd" ,str2 = "abc" ;
int res = strcmp(str1, str2 ) ;
if (res > 0 )
{
printf("%s is greater than %s\n",str1 , str2 ) ;
}
else if(res == 0 )
{
printf("%s is same as %s\n",str1 ,str2 ) ;
}
else {printf("%s is less than %s", str1 , str2) ;}
return 0 ;
}
#include
using namespace std;
char res [5000000] ;
int main()
{
int n ;
scanf("%d",&n ) ;
int len = 0 ;
for(int i = 1 ; i <= n ; i++ )
{
strcat(len + res +1 ,res) ;
res[len] = 'A' + i - 1 ;
len = strlen(res) ;
}
printf("%s\n", res ) ;
return 0 ;
}
字符串 反转
int main()
{
int len ;
scanf("%s",&a ) ;//%s 打印字符串
len = strlen (a);
for(int i = len-1 ;i>=0 ; i--)
{printf("%c",a[i]) ;//%c 打印字符
}
printf("\n") ;
return 0 ;
}
寻找字符串
i miss you ossosso
you osso
1 2
判断奇偶数
1: if(s[len-1]&1 == 1){printf("奇 数");}
else if (s[len -1]&1 == 0){printf("偶 数 ");}//用二进制的最后一位
2:if((s[len -1 ] - '0')%2 == 0){printf("偶 数)}//用ASCII码值 - 0 的代码 ,剩下几除2 ;
**技巧:
给定由大写,小写宇母和空格组成的宇符串,返回
最后一个单词的长度。
如果输入中不存在单词,返回0。
注意:
‘单词〞是指不包含空格符号的宇符串
例如:
对于宇符串"hello World”(不带引1号),那么返回
的结果是 5;
对于宇符串"abc abc "(不带引1号),那么返回的
结果就是 3。
小疑惑为什么部分devC++不行?
#include
#include
using namespace std ;
char s[10005] ;
int main()
{
while(scanf("%s",&s) != EOF ) {}//输入到文件末尾,让他停下 。一直读
printf("%d\n",strlen(s));
return 0 ;
}
思路:把字符串去除最后的空格,再倒置。寻找空格的位置,返回。如果没有空格(一个单词),直接返回长度。
闰年 :2月份多一天 -------- 29天
1.年份非整百且能被4整除的年份:
2.年份能被400整除的年份(2000年即为闰年)
( (i%100 != 0 &&i %4 ==0 ) ||(i%400 ==0) )
《今天星期几呀!!》————实用
//输入三个正整数,分别表示年,月,日
//输出星期几
#include
#include
using namespace std ;
string weekday[7] = {"Mondy","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"} ;
int ans=0 ;
int whatday(int y , int m , int d )
{
for(int i = 1 ; i < y ; i++){//year
if((i%100 != 0 && i%4 == 0)||(i%400 == 0)){
ans+=366%7 ;
ans %= 7 ;
}
else {
ans+= 365 % 7 ;
ans %= 7 ; //除两回 得个位 。
}
}
for(int i = 1 ; i < m ; i++){
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12){ans += 31%7;
ans %= 7 ;}
else if(i==4||i==6||i==9||i==11){ans += 30%7 ;
ans %= 7 ;}
else if((y%400 == 0) || (y % 4 == 0 && y % 100 != 0)){ans += 29%7;
ans %= 7 ;}
else{ans += 28%7 ;
ans %= 7 ;}
}
ans+=(d-1)%7 ;
ans %= 7 ;
return ans ;
}
int main()
{
int y , m ,d ;
cin>>y>>m>>d ;
cout << weekday[whatday(y,m,d)]<
《算纪念日》
输入:年,月,日,天数,
输出:日期注意 月份天数用2位
#include
int day [13] = {0,31,28,31,30,31,30,31,31,30,31,30,31} ;
int main()
{
int y, m , d, k;
scanf("%d%d%d%d",&y,&m,&d,&k ) ;
for(int i = 1; i <= k ; i ++ )
{
if(( y%400 == 0)||(y % 4 == 0 && y % 100!= 0 )){day[2] =29;
}
else {day[2] = 28 ;}
d++ ;
if(d == day[m]+1){
d = 1 ;
m++ ;
}
if(m == 13){
m = 1;
y++ ;
}
}
printf("%04d-%02d-%02d\n",y,m,d ) ;//yyyy-mm-dd形式
return 0 ;
}
循环结构→DFS
一个循环,选取枚举范围,条件判断语句
#include
int main()
{
int dad =0,son =0 ;
for(int i =27 ;i<= 99 ;i++)
{
dad = i ;
son =(i%10)*10+ i/10 ;//1%10 求个位 再*10 换到10位.i/10 直接求十位 。
if(dad-son==27){printf("%d\n",dad) ;
}
}
}
//三位数上每个位的数字的三次幂之和 = 本身
//水仙花数
#include
int main() {
for(int i =100 ;i<=999 ; i++)
{
int a=i%10 ;//个位
int b=(i%100)/10 ;//十位
int c=i/100 ;//百位
a= a*a*a ;
b= b*b*b ;
c= c*c*c ;
if(a+b+c == i){
printf("%d\n",i ) ;
}
}
}
//求n的阶乘
#include
long factorial(int n) {
if (n == 0 || n == 1) {
return 1;
}
else {
return factorial(n - 1) * n; // 递归调用
}
}
/*(10000-99999)五位数的不要出现带4的号码
如果发行从n到m 的之间的奖券,在任何两张奖券都不重复的情况下
一共可以发行多少张奖券?*/
<复杂版>
#include
using namespace std ;
int main(){
int n =0,m = 0 ;
cin>>n>>m ;
int number =0;
for(int i = n ; i <= m ; i++)
{
if((i%10 != 4)&&(i%100/10 != 4)&&(i%1000/100 != 4)&&
(i%10000/1000 != 4)&&(i/10000 != 4 )) //个,十,百,千,万 位
{
number += 1 ;
}
}
cout<
<简化版>
#include
using namespace std ;
bool judge(int x )//真假类型
{
while(x){ // while 取每一位
if(x%10 == 4 ){ // 先看最后一位是否有4
return true ;// 非零整数表示真
}
x/=10 ;//执行完重复上式
}
return false;//值0 表示假
}
int main()
{
int n = 0 ,m = 0 ,cnt = 0 ;
cin>>n>>m ;
for(int i = n ;i <= m ; i++ )
{
if(!judge(i))
{cnt++;
}
}
cout<
——————————上难度啦——————————————————————
// 加 、乘 前后的两数颠倒顺序 也算新的一种
// 算一算一共有多少种方案
方法一:用枚举方法较复杂,不过可以巩固自己
方法二:要用到next_permutation()全排列函数
next_permutation /用法举例
#include
using namespace std ;
int main()
{
int num = 1,a[6]= {1,2,3,4,5};
cout<<"1 2 3 4 5"<
1.
#include
using namespace std ;
int main()
{
int n ;
cin >> n ;
for(int a = 1 ;a*a <= n ; a++ )
{ for(int b = a+1 ; a*a+b*b <= n ; b++)
{for(int c = b + 1 ; a*a+b*b+c*c <= n; c++ )
{
if(a*a+b*b+c*c == n ){
cout<
1. plus
/*
四平方和定理:
每个正整数可以表示为至多4个正整数平方之和,
if 把 0 包括进去 正好可以表示成 4个数 平方和
给定一正整数 n ,求出字典序最小的一组 a, b, c, d 使得平方和为 n
输出:4个非负整数 a, b, c, d 中间空格分开 。
*/
#include
using namespace std ;
int main()
{
int n ,d ;
scanf("%d",&n );
for(int a = 0; a*a <= n ; a++){
for(int b = a ; a*a+b*b <= n ; b++){
for(int c = b ;a*a+b*b+c*c <= n ; c++){
d = sqrt(n - (a*a+b*b+c*c) ) ;//如果不能 开更号 则显示整数部分
if(a*a+b*b+c*c+d*d == n ){ //这一步将不成立
printf("%d %d %d %d\n",a,b,c,d) ;
return 0 ;
}
}
}
}
return 0 ;
}
2.
#include
using namespace std ;
int main()
{
int n , m ,ans ;
cin>>n>>m ;
ans = -1005 ;
int a[55][55] = {0} ;
for(int i = 0;i< n;i++)//读入 矩阵
{ for(int j = 0 ;j< m ; j++ )
{
cin>>a[i][j] ;
}
}
for(int i = 0;i < n;i++)//上边界
{ for(int j = i ;j < n ; j++ )//下边界
{
for(int k = 0 ;k < m ;k++)//左边界
{
for(int l = k ;l < m ;l++ )//右边界
{
int tmp = 0 ;
for(int p = i ;p <= j ;p++ )//扫描从i行到j行
{
for(int q = k ;q <= l ; q++ )//扫描k列到q列
{
tmp += a[p][q] ;
}
}
if(tmp > ans ){ ans = tmp ;}//把每回框出来的的元素和 与 ans
}
}
}
}
cout<
如图 2 X 2 的矩阵 有 9种不同的子矩阵
3.
输入 n
输入从a1-an 一串对应整数
输出 从中裁剪连续一段中 的最大和
#include
using namespace std ;
int main()
{
int n ;
int sum = 0 ;
int max = 0;
int a[1005 ] ;
cin>>n ;
for(int i = 0 ; i< n ; i++ )
{
scanf("%d",&a[i]) ;
}
for(int i = 0;i < n; i++)
{
sum = 0;//每一轮缩小都要清 ,不然就会sum+=
for(int j = i ; j=max){max = sum ;}
}
}
cout<
#include
#include
using namespace std ;
int main()
{
int arr[] = {2,4,5,3,1} ;
return 0 ;
}
此时 sort( arr , arr + 5 ) ;// sort( 起始位置 ,终了位置 +1 ) 要多写一位
sort ( arr + i , arr + j ) // 被排序的是 arr[ i ] 到 arr [ j - 1 ] , 其他元素保持原位置
//默认从小到大
// if 希望从大到小的排列 (安某个规则排列也可 ) ,为 sort 传入第三个参数——“排序方法”
#include
#include
using namespace std ;
int main()
{
int arr[] = {2,4,5,3,1} ;
sort(arr , arr + 5 ,greater() ) ;
return 0 ;
}
greater ——表示更大,
//计算前k名学生的平均成绩
#include
#include
using namespace std ;
int main ()
{
int K , N ;
int score[35] = {0} ;
scanf("%d\n",&N) ;
for(int i = 0 ; i < N ; i++ ){
scanf("%d", &score[i] ) ;
}
sort(score,score + N,greater() ) ;
scanf("%d\n", &K ) ;
int sum = 0 ;
double avg = 0 ;
for(int j = 0 ; j < K ; j++ )
{
sum += score[j] ;
}
avg = sum*1.0 / K ;
printf("%.2f\n",avg ) ;
getchar() ;
return 0 ;
}
小疑惑 为啥有时候还得多敲个字符 才能执行 //