#include
using namespace::std;
int a[205];
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; ++i)
cin >> a[i];
sort(a + 1, a + n + 1);
for(int i = 1; i <= n - 1; ++i)
cout << a[i] << ' ';
cout << a[n];
return 0;
}
偷个懒,直接调用STL中的sort
,参数类型是 排序的首个元素地址, 排序的尾元素地址的下一个地址
先将十六进制转换成二进制再把二进制转换成八进制, 十六进制一位数对应二进制四位数, 二进制三位数对应八进制一位数,
注意, 我们读取的十六进制数是一个字符串, 不能对字符类型的数字直接进行计算, 计算机会默认使用ASCII码计算, '0' ~ '9'
对应的ASCII码是48 ~ 57
, 所以可以通过char - 48
将其处理成我们想要的数字进行计算
#include
using namespace ::std;
const int maxlen = 1e5+5;
char s[maxlen];
int b[maxlen * 4], e[maxlen * 2];
int main()
{
int n;
cin >> n;
while (n--)
{
cin >> s + 1;
//十六进制->二进制
for (int i = 1; i <= strlen(s + 1); ++i)
{
int temp;
if (s[i] <= '9' && s[i] >= '0')
temp = s[i] - 48;
else if (s[i] == 'A')
temp = 10;
else if (s[i] == 'B')
temp = 11;
else if (s[i] == 'C')
temp = 12;
else if (s[i] == 'D')
temp = 13;
else if (s[i] == 'E')
temp = 14;
else if(s[i] == 'F')
temp = 15;
for (int j = 4 * (i - 1) + 4; j >= 4 * (i - 1) + 1; --j)
{
b[j] = temp % 2;
temp /= 2;
}
}
//二进制->八进制
int j = 0;
int i = 4 * strlen(s + 1);
for(; i >= 3; i -= 3)
{
e[++j] = b[i] + b[i - 1] * 2 + b[i - 2] * 4;
}
if(i >= 2)
e[++j] = b[i] + b[i - 1] * 2;
else if(i >= 1)
e[++j] = b[i];
if(e[j] == 0)
--j;
for(int i = j; i >= 1; --i)
cout << e[i];
cout << endl;
}
return 0;
}
#include
using namespace ::std;
#define ll long long
char hexnum[10];
ll ans;
int main()
{
cin >> hexnum + 1;
ll flag = 1, temp;
for(int i = strlen(hexnum + 1); i >= 1; --i)
{
if(hexnum[i] >= '0' && hexnum[i] <= '9')
temp = hexnum[i] - 48; //ASCII表中'0'~'9'对应十进制48~57
else if(hexnum[i] == 'A')
temp = 10;
else if(hexnum[i] == 'B')
temp = 11;
else if(hexnum[i] == 'C')
temp = 12;
else if(hexnum[i] == 'D')
temp = 13;
else if(hexnum[i] == 'E')
temp = 14;
else if(hexnum[i] == 'F')
temp = 15;
ans += flag * temp;
flag *= 16;
}
cout << ans;
return 0;
}
输出为负数时要敏锐地察觉是不是结果超出了int
的范围
每一次都要考虑输入/输出是0的情况,一般测试点1都是0
#include
using namespace ::std;
#define ll long long
ll a;
stack<char> ans;
int main()
{
cin >> a;
if(a == 0)
{
cout << a;
return 0;
}
while(a > 0)
{
int temp = a % 16;
if(temp <= 9 && temp >= 0)
ans.push(temp + 48); //'0' ~ '9' = 48 ~ 57
else
ans.push(temp + 55); //'A' ~ 'F' = 65 ~ 70
a /= 16;
}
while(!ans.empty())
{
cout << ans.top();
ans.pop();
}
return 0;
}
我的思路是枚举每个数, 把每个数位数倒置得出的数如果和原数相等,那么这个数就是回文数
五位数六位数这么搞确实不优雅
#include
using namespace::std;
int main()
{
int n;
cin >> n;
//五位数
for(int i = 10000; i <= 99999; ++i)
{
int num = i, hnum = 0, cnt = 1, tmp = 0;
while(num > 0)
{
hnum += num % 10 * pow(10, 5 - cnt);
tmp += num % 10;
num /= 10;
cnt++;
}
if(hnum == i && tmp == n)
cout << i << endl;
}
//六位数
for(int i = 100000; i <= 999999; ++i)
{
int num = i, hnum = 0, cnt = 1, tmp = 0;
while(num > 0)
{
hnum += num % 10 * pow(10, 6 - cnt);
tmp += num % 10;
num /= 10;
cnt++;
}
if(hnum == i && tmp == n)
cout << i << endl;
}
return 0;
}
#include
using namespace::std;
int main()
{
//四位数
for(int i = 1000; i <= 9999; ++i)
{
int num = i, hnum = 0, cnt = 1;
while(num > 0)
{
hnum += num % 10 * pow(10, 4 - cnt);
num /= 10;
cnt++;
}
if(hnum == i)
cout << i << endl;
}
return 0;
}
#include
using namespace::std;
int main()
{
//三位数
for(int i = 100; i <= 999; ++i)
{
int num = i, sxh = 0;
while(num > 0)
{
sxh += pow(num % 10, 3);
num /= 10;
}
if(sxh == i)
cout << i << endl;
}
return 0;
}
边界dp[1][1] = 1
状态方程dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]
#include
using namespace::std;
int dp[40][40];
int main()
{
int n;
cin >> n;
dp[1][1] = 1;
cout << dp[1][1] << endl;
for(int i = 2; i <= n; ++i)
{
for(int j = 1; j < i; ++j )
{
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
cout << dp[i][j] << ' ';
}
dp[i][i] = 1;
cout << dp[i][i];
if(i < n)
cout << endl;
}
return 0;
}
#include
using namespace::std;
int num[10005];
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; ++i)
cin >> num[i];
int a;
cin >> a;
bool flag = 0;
for(int i = 1; i <= n; ++i)
{
if(num[i] == a)
{
flag = 1;
cout << i;
break;
}
}
if(flag == 0)
cout << -1;
return 0;
}
max_element(begin, end)
, 求区间[begin, end)
的最大值
min_element(begin, end)
, 求区间[begin, end)
的最小值
accmulate(begin, end, 0)
,求区间[begin, end)
的和, 这里0是和的初值
#include
using namespace::std;
int num[10005];
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; ++i)
cin >> num[i];
int *maxn = max_element(num + 1, num + n + 1);
int *minn = min_element(num + 1, num + n + 1);
int sum = accumulate(num + 1, num + n + 1, 0);
cout << *maxn << endl;
cout << *minn << endl;
cout << sum << endl;
return 0;
}
#include
using namespace::std;
int p[1000005];
int main()
{
int n;
cin >> n;
p[1] = p[2] = 1;
for(int i = 3; i <= n; ++i)
{
p[i] = (p[i - 1] + p[i - 2]) % 10007;
}
if(n < 3)
cout << 1;
else
cout << p[n];
return 0;
}
数太大, 不能先加再求模, 所以可以打表累加每一项的余数, 非余数部分对求模没有影响, 可以直接忽略
#include
using namespace::std;
char dp[30][30];
int main()
{
int m, n;
cin >> n >> m;
for(int i = 1; i <= m; ++i)
dp[1][i] = 'A' - 1 + i;
for(int i = 2; i <= n; ++i)
for(int j = 1; j <= m; ++j)
{
if(i <= j)
dp[i][j] = dp[i - 1][j - 1];
else
dp[i][j] = dp[i - 1][j] + 1;
}
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= m; ++j)
cout << dp[i][j];
if(i < n)
cout << endl;
}
return 0;
}
观察图像,沿对角线把图像分成两半, 分两种情况找到一些规律