年号子串
- 这个题自己笔算也很好算出,就当线下多练一下,就敲个代码
试题 B: 年号字串
【问题描述】小明用字母 A 对应数字 1, B 对应 2,以此类推,用 Z 对应 26。对于 27以上的数字,小明用两位或更长位的字符串来对应,例如 AA 对应 27, AB 对应 28, AZ 对应 52, LQ 对应 329。请问 2019 对应的字符串是什么?
思路就是26进制,算出来的数就是第几个字母,比如27 ,27/26=1 --27%26=1,所以27的26进制表示法就是1 1,即AA。
我这里也只求出26进制表示,没有具体到哪个字母。
#include<iostream>
using namespace std;
int a[20];
int i = 0;
int digui(int w) {//用了一下递归,还是要看一下16进制,8进制间的进制转换什么的,自己写写。
int x, y;
x = w / 26;
y = w % 26;
if (x != 0) {
a[i] = y;
i++;
}
if (x == 0) {
a[i] = w;
}
else return digui(x);
}
int main()
{
int m;
cin >> m;
digui(m);
for(int j=i;j>=0;j--)
cout << a[j];
}
– 开始没想到进制转换,后来看了一下别人的解题报告,自己还是太low,
附上代码和原博客。
#include<stdio.h>
int main(){
int n = 2019;
int i=0;
char s[10];
while(n>0){
s[i++] = n%26+'A'-1;
n/=26;
}
for(;i>0;i--){
printf("%c",s[i-1]);
}
printf("\n");
return 0;
}
D题 数的分解
问题描述:
把2019分解成3个各不相同的正整数之和,并且要求每个正整数都不包含数字2和4,一共有多少种不同的分解方法?
注意交换3个整数的顺序被视为同一种方法,例如1000+1001+18和1001+1000+18被视为同一种。
开始就是直接3个for循环暴力解开,由于没注意到要三个互不形同的数,开始结果不对,以后要好好读题啊。运算时间挺长的,但如果用两个for循环就特别快,这也就说明了优化是多么的重要。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int no_two_four(int n) {//判断有没有2和4
int t = 1000;
while (t > 0) {
if (n /t == 2 || n / t == 4) { return 1; }
else {
n = n % t;
t /= 10;
}
}
return 0;
}
int main() {
int i, j, k, sum = 0;
for (i = 1; i < 2020; i++) {//三层循环,比较慢,但是填空题没有时间要求
if (no_two_four(i)) {
continue;
}
for (j = 1; j < 2020; j++) {
if (no_two_four(j)||i==j) {
continue;
}
for (k = 1; k < 2020; k++) {
if (no_two_four(k)||i==k||j==k)
continue;
if (i + j + k == 2019)sum++;
}
}
}
cout<<sum/6;//3个数字位置有重复,所以除6 ,排列组合
}
- 也可以直接用两个for减少运算量
#include<stdio.h>
int isok(int n){
while(n>0){
if(n%10==2 || n%10==4){
return 1;
}else{
n=n/10;
}
}
return 0;
}
int main(){
int i,j,k,tot=0;
for(i=1;i<=2018;i++){
if(isok(i)){
continue;
}
for(j=1;j<=2018;j++){
if(isok(j)){
continue;
}
k=2019-i-j;//k有可能小于0,所以要在下面排除一下。
if(isok(k)==0&&i!=j&&i!=k&&j!=k&&k>0)tot++;
}
}
printf("%d\n",tot/6);
return 0;
}
- 当然还有两次for循环次数少的,就是开始就让其有顺序
- 代码来自别人原文
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int panduan(int i, int j, int k)
{
int t = 1;
while (i)
{
if (i % 10 == 2 || i % 10 == 4)
{
t = 0;
break;
}
else
i = i / 10;
}
while (t == 1 && j)
{
if (j % 10 == 2 || j % 10 == 4)
{
t = 0;
break;
}
else
j = j / 10;
}
while (t == 1 && k)
{
if (k % 10 == 2 || k % 10 == 4)
{
t = 0;
break;
}
else
k = k / 10;
}
return t;
}
int main()
{
int i, j, k;
long long sum = 0;
for (i = 1; i <= 672; i++)
{
for (k = 674; k <= 2017; k++)
{
j = 2019 - i - k;
if ((i < j && j < k) && (panduan(i, j, k) == 1))
sum++;
}
}
printf("%I64d\n", sum);
system("pause");
return 0;
}