HJ129 小红的双生数
知识点数论校招时部分企业笔试将禁止编程题跳出页面为提前适应练习时请使用在线自测而非本地IDE。描述小红定义一个正整数是“双生数”当且仅当该正整数的每个数位的相邻数位中恰好有一个和该数位的数字相同。现在小红拿到了一个正整数 xx她希望你求出不小于 xx 的最小“双生数”。输入描述输入一个正整数 x(1≦x≦10100 000)x(1≦x≦10100000) 代表限制。输出描述输出一个正整数代表不小于 xx 的最小“双生数”。该数字不包含前导零。示例1输入123复制输出1100复制说明在这个样例中11001100 的第一、二个数位相同第三、四个数位相同。我们可以证明这是符合要求的最小的双生数。示例2输入114514复制输出115500#include iostream #include vector #include string using namespace std; vectorint find(const string s) { int n s.length(); vectorint ans; if (n % 2 1) { // 奇数长度 ans.resize(n 1, 0); for (int i 1; i n; i 2) { int val ((i / 2) 1) ^ 1; ans[i] ans[i - 1] val; } } else { // 偶数长度 ans.resize(n, 0); for (int i 1; i n; i 2) { int a s[i - 1] - 0; int b s[i] - 0; if (a b) { ans[i] ans[i - 1] a; } else { int target a * 10 b; for (int j 0; j 10; j) { if (j * 11 target) { ans[i] ans[i - 1] j; break; } } int k 0; for (int j i 2; j n; j 2) { ans[j] ans[j - 1] k; k ^ 1; } break; } } for (int i 2; i n; i 2) { if (ans[i] ans[i - 1]) { bool found false; for (int j i 1; j 0; j - 2) { ans[j] 1; ans[j - 1] 1; if (j 2 ans[j] ans[j - 2]) { ans[j] 1; ans[j - 1] 1; } if (ans[j] 10) { found true; int k 0; for (int p j 2; p n; p 2) { ans[p] ans[p - 1] k; k ^ 1; } break; } } if (!found) { ans.resize(n 2, 0); for (int j 1; j n 1; j 2) { int val ((j / 2) 1) ^ 1; ans[j] ans[j - 1] val; } return ans; } } } } return ans; } int main() { string x; cin x; vectorint result find(x); for (int num : result) { cout num; } cout endl; return 0; }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2414285.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!