比n大的最小不重复数

  1 void Calculate(int a)
  2 {
  3 int pa = a;
  4 int count = 0;
  5 int b[20] = {0};
  6 
  7 //将pa按位存储到数组b
  8 while(pa > 0)
  9 {
 10 b[count++] = pa%10;
 11 pa = pa/10;
 12 }
 13 bool flag = true; //是否有重复数
 14 bool carryFlag = false; //是否产生进位
 15 
 16 //从高位开始判断是否有重复数
 17 int i,j,k;
 18 count--;
 19 for(i=count;i>0;i--)
 20 {
 21 if(b[i] == b[i-1])
 22 {
 23 flag = false;
 24 b[i-1]++; //有可能产生进位
 25 if(b[i-1]>9)
 26 carryFlag = true;
 27 break;
 28 }
 29 }
 30 
 31 if(!flag) //如果存在重复位
 32 {
 33 int c = 0;
 34 //将低位重复数后面的数都变成0101....
 35 for(j = i-1;j>0;j--)
 36 {
 37 b[j-1] = c;
 38 c = (c == 0 ? 1:0);
 39 }
 40 
 41 //处理进位
 42 if(carryFlag)
 43 {
 44 int carry = 0;
 45 for(j = i-1;j<=count + 1;j++)
 46 {
 47 b[j] = b[j] + carry;
 48 if(b[j] >= 10)
 49 {
 50 carry = 1;
 51 b[j] = b[j] - 10;
 52 }
 53 }
 54 }
 55 pa = 0;
 56 for(i = (count=1 ? count + 1:count);i >=0;i--)
 57 {
 58 pa = pa *10 + b[i];
 59 }
 60 cout<<"the min no repeat number: "<<pa<<endl;
 61 }
 62 else
 63 {
 64 cout<<"the min no repeat number: "<<a<<endl;
 65 return;
 66 }
 67 }
 68 
 69 输入两个很大正数,输出它们的乘积
 70 void Multiply(const char *a,const char *b)
 71 {
 72 assert(a!=NULL && b!=NULL);
 73 int len_a = strlen(a);
 74 int len_b = strlen(b);
 75 int *c = new int[len_a+len_b];
 76 memset(c,0,sizeof(int) *(len_a+len_b));
 77 for(int i=0;i<len_a;i++)
 78 {
 79 for(int j=0;j<len_b;j++)
 80 {
 81 c[i+j+1] += (a[i]-'0')*(b[j]-'0');
 82 }
 83 }
 84 for(int i=len_a+len_b-1;i>0;i--)
 85 {
 86 if(c[i]>=10)
 87 {
 88 int carry = c[i]/10;
 89 c[i-1] = c[i-1] + carry;
 90 c[i] = c[i] % 10;
 91 }
 92 }
 93 char *d = new char[len_a + len_b];
 94 int i=0;
 95 while(c[i] == 0) ++i;
 96 int j;
 97 for(j=0;i<len_a+len_b;j++,i++)
 98 {
 99 d[j] = c[i] + '0';
100 }
101 d[j] = '';
102 for(int i=0;i<len_a+len_b;i++)
103 cout<<d[i];
104 cout<<endl;
105 }
原文地址:https://www.cnblogs.com/susidian/p/10013198.html