1. 程式人生 > >比n大的最小不重複數

比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] = '\0'; 102 for(int i=0;i<len_a+len_b;i++) 103 cout<<d[i]; 104 cout<<endl; 105 }