现在有n个0到9的数字,需要用它们组成两个数,这两个数都不能有前导0,使得这两个数加起来最小。
#include <bits/stdc++.h> using namespace std; int main() { //freopen(".in","r",stdin); //freopen(".out","w",stdout); int n, a[20], x = 0, y = 0, num = 0, cc = 0; cin >> n; while (cin >> a[cc++]) num++;//补全输入 if (num < n) { for (int i = num; i < n; i++) { a[i] = a[num-1]; } } sort (a, a + n); for (int i = 0; i < n; i++) { if (a[i] != 0) { x = a[i]; y = a[i + 1]; swap (a[0], a[i]); swap (a[1], a[i + 1]);//交换 break; } else continue; } sort (a + 2, a + n); for (int i = 1; i < n; i++) { if (i % 2 == 0) x = x * 10 + a[i]; } for (int i = 2; i < n; i++) { if (i % 2 != 0) y = y * 10 + a[i]; } cout << x + y; return 0; }
def adaptlist(B): # 将一个列表中的零元素和非零元素分开 # c中存储的是零元素,d中存储的是非零元素 c = list() d = list() for b in B: if b == 0: c.append(b) else: d.append(b) return (c, d) # 数据的输入及相关处理 def getnumber(d): # 将选取的两个数分别存入num1,num2中 num1 = list() num2 = list() for i in range(0, len(d)): if i % 2 == 0: num1.append(d[i]) else: num2.append(d[i]) return (num1, num2) def list2number(num): # 将list中的元素变成一个数 a = 0 for i in range(0, len(num)): a = a + num[i] * 10**(len(num) - i - 1) return a # 标准输入 import sys # 这里考虑一行数据里有多个数据,所以我们用二维list来进行存储 num = [[0 for col in range(0)] for row in range(2)] s = sys.stdin.readline().strip() # 得到第一行的数据 for i in range(2): temp = s.split() # 删掉字符串的首尾空格 num[i] = list(range(len(temp))) for kk in range(len(temp)): num[i][kk] = int(temp[kk]) s = sys.stdin.readline().strip() # 数据的处理 # 将输入的一些数据组成两个数,使得这两个数加起来最小 # 显然位数越小和最小,比如8个数组成两个四位数和最小,7个数组成4位数加3位数和最小 # 将除零以外的最小的两个数做为这两个数的首位,其余的数按从小到大的数排列 # 首先将输入的数据在list中从小到大进行排列,并保证第一个数不是0 # 在这里调用sort函数(也可以用sorted函数,这里就不再赘述) # b = list(map(int, b)) b = num[1] # 得到输入的数 # 判断输入的数字是否需要补齐 k = b[-1] m = num[0][0] - len(b) if m != 0: for i in range(0, m): b.append(k) c, d = adaptlist(b) # 确定组成的两个数位数分别是多少 d.sort() # 将所有非零元素按从小到大的顺序排列 if c != []: for x in c: d.insert(2, x) num1, num2 = getnumber(d) a = list2number(num1) b = list2number(num2) print(a + b)
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class aaa {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("请输入一串数,数串长度在2-16之间");
//接收字符串型数字串
String str = in.nextLine();
//分割为字符数组
String[] str1 =str.split("");
//转换为数字数组
int[] b = new int[str1.length];
for(int i=0;i<str.length();i++) {
b[i]=Integer.parseInt(str1[i]);
}
//对数组进行排序
Arrays.sort(b);
//找0的个数
int j = 0;
for(int i = 0;i<b.length;i++) {
if(b[i]==0)
j++;
if(b[i]!=0)
break;
}
int number1=0;
int number2=0;
int sum;
if(j>=2) {
//0大于两个,取最小的两个不为0的数乘10并相加
number1 = b[j]*10;
number2 = b[j+1]*10;
}else{
if(j==1) {
//交换b[0]与b[1],得到值为X0YZ数组
int c;
c =b[1];
b[1]=b[0];
b[0]=c;
}
//求和X0+YZ
number1 = b[0]*10+b[1];
number2 = b[2]*10+b[3];
}
sum = number1 + number2;
System.out.println(sum);
}
}
#include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; int main() { int n_numbers; cin >> n_numbers; vector<int> vi; int tmp, in_count=0; while (cin >> tmp ) { //cout << "tmp is:" << tmp << endl; vi.push_back(tmp); in_count++; } //vi.resize(n_numbers); while (in_count < n_numbers) { ++in_count; vi.push_back(tmp); } // print vi //cout << "input " << n_numbers << " number:" << endl; //for (auto index = vi.begin(); index != vi.end(); ++index) //{ // cout << *index << " "; //} //cout << endl; sort(vi.begin(), vi.end()); auto i_not0 = vi.begin(); int count = 0; while (*i_not0 == 0) { ++i_not0; ++count; } if (count >= 2) { // swap 0 -- inot *vi.begin() = *i_not0; *i_not0 = 0; // swap 1 -- next of inot *(++vi.begin()) = *(++i_not0); *i_not0 = 0; } if (count == 1) // so,i_not0 == 1 { // swap 0--1 *vi.begin() = *i_not0; // swap 1--2 auto next = i_not0 + 1; *i_not0 = *next; *next = 0; } //cout << "after sorted " << n_numbers << " number:" << endl; //for (auto index = vi.begin(); index != vi.end(); ++index) //{ // cout << *index << " "; //} //cout << endl; int num1 = 0; int num2 = 0; bool flag = true; for (auto index = vi.begin(); index != vi.end(); ++index) { if (flag == true) num1 = num1 * 10 + *index; else num2 = num2 * 10 + *index; flag = !flag; } //cout << "num1:" << num1 << ",num2:" << num2 << endl; cout << num1 + num2; return 0; }