BASIC题解

目录

A+B问题

数列排序 

十六进制转八进制 

十六进制转十进制 

十进制转十六进制 

特殊回文数 

回文数 

特殊的数字 

杨辉三角形 

查找整数 

数列特征

字母图形

01字串

闰年判断 

Fibonacci数列

圆的面积 

序列求和 


A+B问题

源代码

#include <iostream>
using namespace std;
int main()
{
	int a,b;
	cin >> a >> b;
	cout << a + b << endl;
	return 0;
}

数列排序 

源代码

#include <iostream>
using namespace std;
const int N = 1000000 + 10;
int q[N],n;
void quick_sort(int q[],int l,int r)
{
	if(l >= r)return;
	int x = q[l + r >> 1],i = l - 1,j = r + 1;
	while(i < j)
	{
		do i ++ ;while(q[i] < x);
		do j -- ;while(q[j] > x);
		if(i < j)swap(q[i],q[j]);
	}
	quick_sort(q,l,j);
	quick_sort(q,j + 1,r);
}
int main()
{
	int n;
	cin >> n;
	for(int i = 1;i <= n;i ++ )cin >> q[i];
	quick_sort(q,1,n);
	for(int i = 1;i <= n;i ++ )cout << q[i] << ' ';
	return 0;
}

十六进制转八进制 

源代码

刚开始采用字符串转换为数字,强转字符链接成字符串,反转部分字符链接的方法,由于测试点数据量过大导致TLE,所以采用了相同思想暴力处理的方法,首先将十六进制转换为二进制,也就是从最高位到最低位逐位采取一位放缩为四位的方法重新构造新的字符串,而后对于所构造的二进制串从后往前依次取三位放缩至一位,链接起来即可,注意前导零的去掉

#include <iostream>
#include <algorithm>
using namespace std;
string tobin(string s)
{
	string bin;
	for(int i = 0;i < s.size();i ++ )
	{
		switch(s[i])
		{
			case '0':bin += "0000";break;
			case '1':bin += "0001";break;
			case '2':bin += "0010";break;
			case '3':bin += "0011";break;
			case '4':bin += "0100";break;
			case '5':bin += "0101";break;
			case '6':bin += "0110";break;
			case '7':bin += "0111";break;
			case '8':bin += "1000";break;
			case '9':bin += "1001";break;
			case 'A':bin += "1010";break;
			case 'B':bin += "1011";break;
			case 'C':bin += "1100";break;
			case 'D':bin += "1101";break;
			case 'E':bin += "1110";break;
			case 'F':bin += "1111";break;
		}
	}
	return bin;
}
string tooct(string s)
{
	string oct;
	for(int i = s.size() - 1;i >= 0;i -= 3)
	{
		string t;
		for(int j = i - 2;j <= i;j ++ )
		{
			while(j < 0)j ++ ;
			t += s[j];
		}
		if(t == "000")oct = "0" + oct;
		else if(t == "001" || t == "01" || t == "1")oct = "1" + oct; 
		else if(t == "010" || t == "10")oct = "2" + oct;
		else if(t == "011" || t == "11")oct = "3" + oct;
		else if(t == "100")oct = "4" + oct;
		else if(t == "101")oct = "5" + oct;
		else if(t == "110")oct = "6" + oct;
		else if(t == "111")oct = "7" + oct;
	}
	while(oct[0] == '0' && oct.size() > 1)oct.erase(0,1);
	return oct;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int n;
	cin >> n;
	while(n -- )
	{
		string s;
		cin >> s;
		string bin = tobin(s);
		string oct = tooct(bin);
		cout << oct << endl;
	}
	return 0;
} 

十六进制转十进制 

源代码

注意,不超过8位的正的十六进制数的最大值位FFFFFFFF,转换为十进制后会变成4294967295,该数值大小超过int但在long long范围之内,所以要开long long

#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
int main()
{
	string s;
	cin >> s;
	ll w,sum;
	w = 1;
	sum = 0;
	for(int i = s.size() - 1;i >= 0;i -- )
	{
		ll num;
		if(s[i] >= '0' && s[i] <= '9')num = s[i] - '0';
		else if(s[i] >= 'A' && s[i] <= 'F')
		{
			num = s[i] - 'A' + 10;
		}
		num *= w;
		sum += num;
		w *= 16;
	}
	cout << sum << endl;
	return 0;
}

十进制转十六进制 

 源代码

使用寻常的强转换方法转换时,注意特判0 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
vector<char> Q;
int main()
{
	ll n;
	cin >> n;
	if(n == 0)
	{
	    cout << 0;
	    return 0;
	}
	while(n > 0)
	{
		int num = n % 16;
		char c;
		if(num >= 0 && num <= 9)c = num + '0';
		else if(num >= 10 && num <= 16)c = num + 'A' - 10;
		Q.push_back(c);
		n /= 16;
	}
	reverse(Q.begin(),Q.end());
	for(int i = 0;i < Q.size();i ++ )cout << Q[i];
	return 0;
} 

特殊回文数 

源代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> Q;
int main()
{
	int n;
	cin >> n;
	for(int i = 100;i <= 999;i ++ )
	{
		int a = i / 100;
		int b = (i - 100 * a) / 10;
		int c = i - 100 * a - 10 * b;
		int x = i * 1000 + c * 100 + b * 10 + a;
		int y = i * 100 + b * 10 + a;
		if(2 * (a + b + c) == n)Q.push_back(x);
		if(2 * (a + b + c) - c == n)Q.push_back(y);
	}
	sort(Q.begin(),Q.end());
	Q.erase(unique(Q.begin(),Q.end()),Q.end());
	for(int i = 0;i < Q.size();i ++ )cout << Q[i] << endl;
	return 0;
} 

回文数 

源代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> Q;
int main()
{
	for(int i = 10;i <= 99;i ++ )
	{
		int a = i / 10;
		int b = i % 10;
		int num = i * 100 + b * 10 + a;
		Q.push_back(num);
	}
	sort(Q.begin(),Q.end());
	Q.erase(unique(Q.begin(),Q.end()),Q.end());
	for(int i = 0;i < Q.size();i ++ )cout << Q[i] << endl;
	return 0;
} 

特殊的数字 

源代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> Q;
int main()
{
	for(int i = 100;i <= 999;i ++ )
	{
		int a = i / 100;
		int b = (i - 100 * a) / 10;
		int c = i % 10;
		if(a * a * a + b * b * b + c * c * c == i)Q.push_back(i);
	}
	for(int i = 0;i < Q.size();i ++ )cout << Q[i] << endl;
	return 0;
} 

杨辉三角形 

源代码

#include <iostream>
using namespace std;
const int N = 1000 + 10;
int a[N][N];
int main()
{
	int n;
	cin >> n;
	for(int i = 1;i <= n;i ++ )
	{
		a[i][1] = 1;
		a[i][i] = 1;
	}
	for(int i = 1;i <= n;i ++ )
	{
		for(int j = 1;j <= i;j ++ )
		{
			if(!(j == 1 || i == j))a[i][j] = a[i - 1][j] + a[i - 1][j - 1];
			cout << a[i][j] << ' ';
		}
		cout << endl;
	}
	return 0;
} 

查找整数 

 源代码

#include <iostream>
using namespace std;
const int N = 1000000 + 10;
int a[N];
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int n;
	cin >> n;
	for(int i = 1;i <= n;i ++ )cin >> a[i];
	int k;
	cin >> k;
	for(int i = 1;i <= n;i ++ )
	{
		if(a[i] == k)
		{
			cout << i << endl;
			return 0;
		}
	}
	cout << -1 << endl;
	return 0;
} 

数列特征

源代码

#include <iostream>
using namespace std;
const int N = 1000000 + 10;
int a[N];
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int n,minnum = 1e6,maxnum = -1e6,sum = 0;
	cin >> n;
	for(int i = 1;i <= n;i ++ )
	{
		cin >> a[i];
		maxnum = max(maxnum,a[i]);
		minnum = min(minnum,a[i]);
		sum += a[i];
	}
	cout << maxnum << endl << minnum << endl << sum << endl;
	return 0;
} 

字母图形

源代码

规律为:首行首列依次为从大写字母A开始的递增状态,对角线所有元素与边界元素保持一致

#include <iostream>
using namespace std;
const int N = 1000 + 10;
char a[N][N];
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int n,m;
	cin >> n >> m;
	for(int i = 1;i <= n;i ++ )
	{
		a[i][1] = 'A' + i - 1;
		a[1][i] = 'A' + i - 1;
		int x = i;
		int y = 1;
		while(x + 1 <= n && y + 1 <= m)
		{
			x = x + 1;
			y = y + 1;
			a[x][y] = a[i][1];
		}
	}
	for(int i = 1;i <= m;i ++ )
	{
		a[1][i] = 'A' + i - 1;
		int x = 1;
		int y = i;
		while(x + 1 <= n && y + 1 <= m)
		{
			x = x + 1;
			y = y + 1;
			a[x][y] = a[1][i];
		}
	}
	for(int i = 1;i <= n;i ++ )
	{
		for(int j = 1;j <= m;j ++ )
		{
			cout << a[i][j];
		}
		cout << endl;
	}
	return 0;
} 

01字串

源代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 1000000 + 10;
char path[N];
char dx[2] = {'0','1'};
vector<string> Q;
void dfs(int u)
{
	if(u == 5)
	{
		string ans;
		for(int i = 0;i < 5;i ++ )ans += path[i];
		Q.push_back(ans);
		return;
	}
	for(int i = 0;i < 2;i ++ )
	{
		path[u] = dx[i];
		dfs(u + 1);
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	dfs(0);
	sort(Q.begin(),Q.end());
	Q.erase(unique(Q.begin(),Q.end()),Q.end());
	for(int i = 0;i < Q.size();i ++ )cout << Q[i] << endl;
	return 0;
} 

闰年判断 

源代码

#include <iostream>
using namespace std;
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int y;
	cin >> y;
	if((y % 400 == 0) || (y % 4 == 0 && y % 100 != 0))cout << "yes" << endl;
	else cout << "no" << endl; 
	return 0;
} 

Fibonacci数列

源代码

#include <iostream>
using namespace std;
typedef long long ll;
const int N = 1000000 + 10;
ll fib[N];
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	fib[1] = 1;
	fib[2] = 1;
	int n;
	cin >> n;
	for(int i = 3;i <= n;i ++ )fib[i] = (fib[i - 1] + fib[i - 2]) % 10007;
	cout << fib[n] << endl;
	return 0;
} 

圆的面积 

源代码

PI的精度一定要保证到位

#include <iostream>
#include <iomanip>
using namespace std;
const double PI = 3.14159265358979323;
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	double r;
	cin >> r;
	double s = PI * r * r;
	cout << setiosflags(ios::fixed) << setprecision(7) << s << endl;
	return 0;
} 

序列求和 

源代码

既然无法开1e9的数组,我们就用变量idx(long long)作为增量累加即可

#include <iostream>
using namespace std;
typedef long long ll;
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	ll n;
	cin >> n;
	ll idx = 1,sum = 0;
	while(idx <= n)
	{
		sum += idx;
		idx ++ ;
	}
	printf("%lld",sum);
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/couchpotatoshy/article/details/128209361