字符串最后一个单词长度
#include<stdio.h>
#include<string.h>
const int maxn=5010;
int main(){
char str[maxn];
gets(str);
int len=strlen(str);
int num=0;
for(int i=len;i>=0;i--){
if(str[i]!=' '&& str[i]!='\0') num++;
else if(str[i]=='\0') continue;
else break;
}
printf("%d",num);
return 0;
}
- 代码必须在C环境下完成,c++环境不可以使用gets()
- strlen()函数
- gets()函数是C语言函数,用来接收输入的字符串,而scanf()可以接收多种格式的数据。两个函数遇到回车符都会认为是输入结束,但是gets()可以接收空格,但是scanf()则不行
- getline()函数是C++的函数,使用该函数需要头文件iostream.h。默认情况下,该函数遇到回车停止读入,但是此时会屏蔽回车键。如下代码
string str_input;
getline(cin, str_input);
input_str = input().split(' ');
print(len(input_str[-1]))
- str.split(str="", num=string.count(str)). split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串
- len():用于测量变量当中的字符串/元组等的长度
- str[-1]输出最后一个字符
计算某字符出现次数
#include<stdio.h>
#include<string.h>
int main(){
char str[1010];
gets(str);
char a;
scanf("%c",&a);
int i=0,num=0;
while(str[i]!='\0'){
if(a>='a'&& a<='z'){
if(str[i]==a||str[i]==a-32) num++;
}
else if(a>='A'&& a<='Z'){
if(str[i]==a||str[i]==a+32) num++;
}
else{
if(str[i]==a) num++;
}
i++;
}
printf("%d",num);
// printf("%d",i);
return 0;
}
- ascII A65 a97 A+32==a
info = input().lower()
char = input().lower()
print(info.count(char))
- lower() 方法转换字符串中所有大写字符为小写。
明明的随机数
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1010;
int main(){
int n;
int a[maxn];
while(cin){
cin>>n;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n);
for(int i=0;i<n;i++){
if(a[i]!=a[i+1]&&a[i]!=0){
cout<<a[i]<<endl;
}
a[i]=0;
}
}
return 0;
}
- 头文件 cin cout需要
- 使用排序需要
- 排序 Sort(start,end,cmp)
bool compare(int a,int b)
{
return a>b;
}
- 本题重点:清空数组操作,避免上次数据产生影响
- 输入不存在0,所以可以利用这一点
字符串分隔符
!!!万能头文件** #include<bits/stdc++.h> **
- getline(cin, inputLine);
此函数可读取整行,包括前导和嵌入的空格,并将其存储在字符串对象中。
#include<bits/stdc++.h>
using namespace std;
int main()
{
string str1;
while(getline(cin,str1)){
while(str1.size()>8){
cout<<str1.substr(0,8)<<endl;
str1=str1.substr(8,str1.size()-8);
}
int len=str1.size();
if(len==8){
cout<<str1<<endl;
}
else if(len<8){
for(int i=0;i<8;i++){
if(i<str1.size()) cout<<str1[i];
else cout<<"0";
}
cout<<endl;
}
}
return 0;
}
- str.substr(0,8)函数
进制转换
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
cin>>s;
int len=s.size();
int k=0.;
int sum=0;
for(int i=len-1;i>1;i--){
int t;
switch(s[i]){
case '0':t=0;break;
case '1':t=1;break;
case '2':t=2;break;
case '3':t=3;break;
case '4':t=4;break;
case '5':t=5;break;
case '6':t=6;break;
case '7':t=7;break;
case '8':t=8;break;
case '9':t=9;break;
case 'A':t=10;break;
case 'B':t=11;break;
case 'C':t=12;break;
case 'D':t=13;break;
case 'E':t=14;break;
case 'F':t=15;break;
}
sum+=t*pow(16,k);
k++;
}
cout<<sum<<endl;
return 0;
}
- stoi()表示将字符串转换为整数 ,它是C ++ STL中的标准库函数,用于将各种格式(例如二进制,八进制,十六进制或字符串格式的简单数字)的给定字符串转换为整数。
- stoi(字符串,起始位置,n进制)
简单方法:
#include<iostream>
#include<string>
using namespace std;
int main(){
string str;
while(cin>>str){
cout << stoi(str,0,16) << endl;
}
质数因子
超时超时,我的思路是小于n的所有质数找到后从小到大尝试,但遇到太大的数的时候,不可行,无法通过全部用例
参考思路
- 质数寻找时可以根据平方根下的寻找,sqrt(n)
- 如果平方根之内的质数全都不能整除,即经过for循环后,n仍然等于旧的n,则可以判定n为质数,输出n
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,old;
cin>>n;
int q=sqrt(n);
while(n!=1){
old=n;//必须在这里!
for(int i=2;i<=q;i++){
while(n%i==0){
cout<<i<<' ';
n=n/i;
}
if(old!=n)break;
}
if(old==n){
cout<<n<<' ';
break;
}
}
return 0;
}
- 从2开始,如果能整除则整除,不能整除则除3,一直除到该数,可保证除的一直是质数。因为如果是合数,例如4,早就在2的时候被除掉了。
- 如果只采用1的思路去除,时间复杂度是O(n),会超时,所以又采用了一条规律:例如200000014,他的因数一定最多只有一个大于根号200000014,因此从0到根号这个数除尽后,只会剩一个大质数,直接输出这个大质数即可,此时时间复杂度降到O(n^(1/2))。
四舍五入
- Floor() 不大于自变量的最大整数
- Ceil() 不小于自变量的最大整数
- Round() 四舍五入到最邻近的整数
好聪明想法:
#include <stdio.h>
int main(void)
{
double num;
scanf("%lf",&num);
printf("%d",(int)(num + 0.5));
return 0;
}
合并表记录
!sort函数关于结构体的排序
改写cmp函数
bool cmp(table a,table b){
return a.index<b.index;
}
提取不重复的整数
- memset(k,-1,sizeof(k));