找到最小的非零数字拆开来相加。
高精度。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 using namespace std; 7 #define LL long long 8 char s[10000005]; 9 int a[10000005],b[10000005]; 10 int t,p; 11 int main() 12 { 13 scanf("%d",&t); 14 while(t--) 15 { 16 scanf("%s",s); 17 int len=strlen(s); 18 p=0; 19 if(len==1)//只有一个数字,不符合 20 { 21 puts("Uncertain"); continue; 22 } 23 for(int i=0;i<len;i++) 24 { 25 a[i]=s[i]-'0'; 26 if(a[i]!=0) p++; 27 } 28 if(p<=1)//非零数字不足两个,不符合 29 { 30 puts("Uncertain"); continue; 31 } 32 sort(a,a+len); 33 for(int i=0;i<len;i++)//找到最小的非零数字 34 { 35 if(a[i]!=0) 36 { 37 p=i; break; 38 } 39 } 40 int j=0; 41 for(int i=0;i<len;i++) 42 { 43 if(i==p) continue; 44 b[j++]=a[i]; 45 } 46 b[0]+=a[p];//相加 47 b[j]=0; 48 for(int i=0;i<j;i++)//高精度进位 49 { 50 if(b[i]<10) break; 51 b[i+1]+=b[i]/10; 52 b[i]%=10; 53 } 54 if(b[j]>0) j++; 55 for(int i=j-1;i>=0;i--) 56 printf("%d",b[i]); 57 puts(""); 58 } 59 }