平时没用过C,考试写太慢了…(痛心疾首
而且用力扣用的输入输出数据都不会了…
结论:做题少,接着做题
1.数列求和:有个样例过不去,因为一开始a[]数据类型设的int,溢出了…(这增长速度)(double永远滴神…八错,答案也用了double),也没想起来拿边界值排个错
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
double a[200];
a[0]=1,a[1]=2;
int n;
double sum=0;
cin>>n;
for (int i=2;i<=n;i++)
a[i]=a[i-1]+a[i-2];
for (int i=0;i<n;i++)//加n次
sum+=a[i+1]/a[i];
printf("%.3f",sum);
return 0;
}
2.合法标识符
没学string类用双指针,把自己绕进去了🤣这就是不认真备考
C++对字符串的支持比C强多了
吐槽,这题没说清就给一个单词啊,我以为中间有空格那种哎。我说第一题咋比后边题还难。。。我拿一句子去测试答案代码,这才发现。。
总结几个<string>
库的字符串函数(靠,又发现用惯了typora于是markdown不会手写表格)
函数名 | 作用 | 格式 |
---|---|---|
length | 计算字符串的真实长度(string结尾没有’\0’) | string s = “asdfgh”; int len = s.length(); |
substr | 从 string 字符串中提取子字符串 | string s1 = “first second third”; string s2 = s1.substr(6, 6); //下标&提取字符个数 >>second |
find | 在 string 字符串中查找子字符串出现的位置 | 原型1 : size_t find (const string& str, size_t pos = 0) const; 原型2: size_t find (const char* s, size_t pos = 0) const; //第二个参数是指定从下标几开始查找 |
c_str | 将 string 字符串转换为C风格的字符串,并返回该字符串的 const 指针(const char*) | string path = “D:\demo.txt”; FILE *fp = fopen(path.c_str(), “rt”); |
#include <iostream >
#include <string >
using namespace std;
int main()
{
string s;
getline(cin, s);
int flag = 1;
if (!isalpha(s[0]) && s[0] != ' ')
flag = 0;
for (int i = 1; i < s.size(); i++)
if (!isalpha(s[i]) && !isdigit(s[i]) && s[i] != ' ')
flag = 0;
if (s == "do" || s == "if" || s == "else" || s == "while"
|| s == "for" || s == "true" || s == "false")
flag = 0;
if (flag)
cout << "valid";
else
cout << "invalid";
return 0;
}
3.矩阵运算
下标计算不熟练,没打草稿就不会写那种(我还是觉着用一维数组这样算下标比用二维数组下标再套一堆循环好)
吐槽,题目里要打印的文本为啥用LaTeX格式,我复制下来每个单词都重复两遍,就打印错了((少有的珍惜分数
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
char a;
int x1,y1,x2,y2,i,j;
cin>>a>>x1>>y1;
int A[x1*y1];//原来能用变长数组啊
//另,new是这么用的:int *a = new int[x*y];
for (int i=0;i<x1*y1;i++)
cin>>A[i];
cin>>x2>>y2;
int B[x2*y2];
for (int i=0;i<x2*y2;i++)
cin>>B[i];
cin>>i>>j;
if (i<1 || i>x1 || j<1 || j>y2)
cout<<"The entry does not exist!";
if(a=='+')
{
if (x1!=x2 || y1!=y2)
cout<<"Illegal operation!";
cout<<A[(i-1)*y1+j-1]+B[(i-1)*y2+j-1];
}
if(a=='*')
{
if (x2!=y1)
cout<<"Illegal operation!";
int sum=0;
for(int m=0;m<x2;m++)
{
sum+=A[(i-1)*y1+m]*B[m*y2+j-1];
//A的一行,B的一列(计算方法不一样
}
cout<<sum;
}
return 0;
}
4.精准买笔
字典序:对于数字1、2、3…n的排列,不同排列的先后关系是从左到右逐个比较对应的数字的先后来决定的。例如对于5个数字的排列 12354和12345,排列12345在前,排列12354在后。按照这样的规定,5个数字的所有的排列中最前面的是12345,最后面的是 54321。
我不敢写暴力啊。。答案怎么是暴力啊。。。。
#include <iostream>
using namespace std;
int main()
{
int ans[100][3];
int n,cnt=0;
cin>>n;
for(int i=33;i>=1;i--)
for(int j=(100-3*i)/2;j>=1;j--)
if((100-3*i-2*j)*2+i+j==n && i+j<n)
{
ans[cnt][0]=i,ans[cnt][1]=j,ans[cnt][2]=n-i-j;
cnt++;
}
if (!cnt)
cout<<"None";
else
{
cout<<cnt<<endl;
for(int i=0;i<cnt-1;i++)
cout<<ans[i][0]<<" "<<ans[i][1]<<" "<<ans[i][2]<<endl;
cout<<ans[cnt-1][0]<<" "<<ans[cnt-1][1]<<" "<<ans[cnt-1][2];
}
return 0;
}
5.进制转换
给定一个数x,转换到2、8、16进制并分别打印。
考试写的⬇,16进制不得不用数组,可以把2、8进制合并进去。
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
int x,B,temp=1;
cin>>x;
int n=x;
//10->2
while(n>0)
{
B+=(n%2)*temp;
n/=2;
temp*=10;
}
cout<<B<<endl;
//10->8
n=x,B=0,temp=1;
while(n>0)
{
B+=(n%8)*temp;
n/=8;
temp*=10;
}
cout<<B<<endl;
//10->16
n=x,temp=1;
char A[18]="0123456789ABCDEF";
char C[5];
int index=0;
while(n>0)
{
C[index]=A[n%16];
n/=16;
temp*=10;
index++;
}
for (int i=index-1;i>=0;i--)
cout<<C[i];
return 0;
}
简化版:
#include <iostream>
#include <stdio.h>
using namespace std;
void trs(int n,int t);
int main()
{
int x,B,temp=1;
cin>>x;
trs(x,2);
trs(x,8);
trs(x,16);
return 0;
}
void trs(int n,int t)//数&要转到的进制
{
int index=0,temp=1;
char A[18]="0123456789ABCDEF";
char C[5];
while(n>0)
{
C[index]=A[n%t];
n/=t;
temp*=10;
index++;
}
for (int i=index-1;i>=0;i--)
{
cout<<C[i];
}
cout<<endl;
}
也可以用%o %x稍微换换,这不是想办法偷懒嘛((
最后再吐个槽,考完试再提交不计新分数不就行了,居然不让提交代码了,洛谷出来背锅