A
读题没度清楚,搞了个checkset[0]在里面,做的时候循环一直有问题,检查好久才发现
#include <iostream>
#include <set>
using namespace std;
int checkset[10] = {0};
int main()
{
int n;
cin >> n;
set<int> myset;
myset.insert(n);
n++;
//cout << "go into loop now" << endl;
while(1)
{
while(n % 10 == 0)
{
n /= 10;
}
myset.insert(n);
//cout << "go into switch now" << endl;
switch(n)
{
case 1 :
checkset[1] = 1;
break;
case 2 :
checkset[2] = 1;
break;
case 3 :
checkset[3] = 1;
break;
case 4 :
checkset[4] = 1;
break;
case 5 :
checkset[5] = 1;
break;
case 6 :
checkset[6] = 1;
break;
case 7 :
checkset[7] = 1;
break;
case 8 :
checkset[8] = 1;
break;
case 9 :
checkset[9] = 1;
break;
}
//cout << "go into check now" << endl;
int checksum = 0;
for(int i = 1; i < 10;i ++)
{
if(checkset[i] == 1)
checksum++;
}
if(checksum == 9)
{
//cout << "get break" << endl;
break;
}
n++;
}
//cout << "go print size now" << endl;
cout << myset.size() << endl;
return 0;
}
B
遇到了几个问题:
- 字符串的替换(replace 头文件< string >)但是要注意第三个参数要么是char要么是string 不能直接用Int
- 所以出现了第二个问题 int转string 使用itoa函数(头文件< cstdlib > )
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
int numbermap[10] = {0}; // numbermap[1] - numbermap[9] 存储数字
int main()
{
int n; // 存储读入数字的位置
string number;
cin >> n >> number;
for(int i = 1; i < 10; i++)
{
cin >> numbermap[i]; //读入映射规则
}
for(int i = 0; i < n; i++)
{
int temp = number[i] - '0';
if(temp < numbermap[temp])
{
char container[10];
itoa(numbermap[temp], container, 10);
number = number.replace(i, 1, container);
// 用str替换指定字符串从起始位置pos开始长度为len的字符
// string& replace (size_t pos, size_t len, const string& str);
}
}
cout << number << endl;
return 0;
}
放上去跑了一下WA了…… 因为有一个20000位的样例没过,以为是数字过大的问题,还很困惑string怎么会有这种情况。问了同学发现是我读题读的不对,原题的意思是选择连续子串进行处理且只处理一次。也就是说我们从高位看就行了,高位能换换完低位就不用再处理了。
另一方面关于字符串的替换,其实没必要那么复杂,直接s[i] = re[s[i]-‘0’] + '0’就可以了。
重新写一下。
#include <iostream>
using namespace std;
int numbermap[10] = {0}; // numbermap[1] - numbermap[9] 存储数字
int main()
{
int n; // 存储读入数字的位数
string number;
cin >> n >> number;
for(int i = 1; i < 10; i++)
{
cin >> numbermap[i]; //读入映射规则
}
int flag = 0; //记录有无进行过映射
for(int i = 0; i < n; i++)
{
int temp = number[i] - '0'; //不映射的数字
if(temp < numbermap[temp])//不映射数字小于映射数字
{
number[i] = numbermap[temp] + '0';
flag = 1; //已进行过一次映射
}
if(flag && temp > numbermap[temp]) //已经映射过且此处不必映射(因为是连续子串,一旦停止就不可以继续往后看了)
//这里不可以取等于!!
//因为可能这里等于 替不替换都可以 但是会影响到下一位!!
//本来如果选择替换后面就是连续子串可以继续换下去使得结果更大
//但是一旦break就没法继续了会比答案小!
break;
}
cout << number << endl;
return 0;
}