C++期中测试总结

平时没用过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”);

string类详解 & string入门攻略

#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稍微换换,这不是想办法偷懒嘛((

最后再吐个槽,考完试再提交不计新分数不就行了,居然不让提交代码了,洛谷出来背锅

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值