2012-05-30 41 views
2

我有兩個數字。解決數學邏輯,從第一個數字和第二個數字中的第三個數字中排列數字

First Number is 2875 & 
Second Number is 852145 

現在我需要一個創建第三個數字的程序。

Third Number will be 2885725145 

的邏輯是

First digit of third number is first digit of first number. 
Second digit of third number is first digit of second number. 
Third digit of third number is second digit of first number. 
Fourth digit of third number is second digit of second number; 

等。

如果任何數量剩餘的數字則應該在最後追加。

我不想將int轉換爲字符串。

int CreateThirdNumber(int firstNumber, int secondNumber) 
{ 

} 

那麼任何人都可以告訴我這個問題的任何解決方案?

+0

你有算法中你在哪裏打? –

+1

提示:使用模運算符和除法運算符。這個問題很容易解決 – Shai

+0

這很簡單..只需要耐心達到答案。發帖之前,您應該先嚐試一下自己。 –

回答

2

我不想INT轉換爲字符串。

爲什麼?

,無須轉換爲字符串

使用模量和除法運算符。

隨着轉換爲字符串

將它們轉換爲字符串。使用.Substring()提取並追加字符串中的值。將附加字符串轉換爲整數。

1

這裏有一點,會給你一個鉛:

說你有多少2875。首先,你需要確定它的長度,然後,提取第一位

這可以很容易地計算出:

int iNumber = 2875; 
int i = 10; 
int iLength = 0; 

while (iNumber % i <= iNumber){ 
    iLength++; 
    i *= 10; 
} 

// iNumber is of length iLength, now get the first digit, 
// using the fact that the division operator floors the result 
int iDigit = iNumber/pow(10, iLength-1); 
// Thats it! 
1

首先一點建議:如果你在C#中使用int,則值在你的例子(2885725145)大於int.MaxValue;(所以在這種情況下,你應該使用long而不是int)。 無論如何,這裏是你的例子的代碼,沒有字符串。

 int i1 = 2875; 
     int i2 = 852145; 
     int i3 = 0; 

     int i1len = (int)Math.Log10(i1) + 1; 
     int i2len = (int)Math.Log10(i2) + 1; 

     i3 = Math.Max(i1, i2) % (int)Math.Pow(10, Math.Max(i1len, i2len) - Math.Min(i1len, i2len)); 

     int difference = (i1len - i2len); 
     if (difference > 0) 
      i1 /= (int)Math.Pow(10, difference); 
     else 
      i2 /= (int)Math.Pow(10, -difference); 

     for (int i = 0; i < Math.Min(i1len, i2len); i++) 
      { 
      i3 += (i2 % 10) * (int)Math.Pow(10, Math.Max(i1len, i2len) - Math.Min(i1len, i2len) + i * 2); 
      i3 += (i1 % 10) * (int)Math.Pow(10, Math.Max(i1len, i2len) - Math.Min(i1len, i2len) + i * 2 + 1); 
      i1 /= 10; 
      i2 /= 10; 
      } 
+0

謝謝:)多數民衆贊成我正在尋找 – piu

0

我不明白你爲什麼不想使用字符串(它是作業嗎?)。反正這是另一種可能的解決方案:

long CreateThirdNumber(long firstNumber, long secondNumber) 
    { 
     long firstN = firstNumber; 
     long secondN = secondNumber; 
     long len1 = (long)Math.Truncate(Math.Log10(firstNumber)); 
     long len2 = (long)Math.Truncate(Math.Log10(secondNumber)); 
     long maxLen = Math.Max(len1, len2); 
     long result = 0; 
     long curPow = len1 + len2 + 1; 
     for (int i = 0; i <= maxLen; i++) 
     { 
      if (len1 >= i) 
      { 
       long tenPwf = (long)Math.Pow(10, len1 - i); 
       long firstD = firstN/tenPwf; 
       firstN = firstN % tenPwf; 
       result = result + firstD * (long)Math.Pow(10, curPow--); 
      } 
      if (len2 >= i) 
      { 

       long tenPws = (long)Math.Pow(10, len2 - i); 
       long secondD = secondN/tenPws; 
       result = result + secondD * (long)Math.Pow(10, curPow--); 
       secondN = secondN % tenPws; 
      } 
     } 
     return result; 
    } 
0

這解決了它:

#include <stdio.h> 

int main(void) 
{ 

    int first = 2875,second = 852145; 
    unsigned int third =0; 
    int deci,evenodd ,tmp ,f_dec,s_dec; 

    f_dec = s_dec =1; 
    while(first/f_dec != 0 || second/s_dec != 0) { 
    if(first/f_dec != 0) { 
     f_dec *=10; 

    } 
    if(second/s_dec != 0) { 
     s_dec *= 10; 
    } 

    } 
    s_dec /=10; f_dec/=10; 


    deci = s_dec*f_dec*10; 


    evenodd =0;tmp =0; 
    while(f_dec != 0 || s_dec !=0) { 
    if(evenodd%2 == 0 && f_dec !=0) { 
     tmp = (first/f_dec); 
     first -=(tmp*f_dec); 

     tmp*=deci; 

     third+=tmp; 
     f_dec/=10; 
     deci/=10; 
    } 

    if(evenodd%2 != 0 && s_dec != 0) { 
     tmp= (second/s_dec); 
     second -=(tmp*s_dec); 
     //printf("tmp:%d\n",tmp); 

     tmp*=deci; 

     third += tmp; 
     s_dec/=10; 
     deci/=10; 
    } 

    evenodd++; 
    } 
    printf("third:%u\ncorrct2885725145\n",third); 
return 0; 

} 

輸出:

third:2885725145 
corrct2885725145 
0
#include <stdio.h> 

long long int CreateThirdNumber(int firstNumber, int secondNumber){ 
    char first[11],second[11],third[21]; 
    char *p1=first, *p2=second, *p3=third; 
    long long int ret; 

    sprintf(first, "%d", firstNumber); 
    sprintf(second, "%d", secondNumber); 
    while(1){ 
     if(*p1) 
      *p3++=*p1++; 
     if(*p2) 
      *p3++=*p2++; 
     if(*p1 == '\0' && *p2 == '\0') 
      break; 
    } 
    *p3='\0'; 
    sscanf(third, "%lld", &ret); 
    return ret; 
} 
int main(){ 
    int first = 2875; 
    int second = 852145; 
    long long int third; 
    third = CreateThirdNumber(first, second); 
    printf("%lld\n", third); 

    return 0; 
} 
+0

當第一個和第二個是10位數字,不足以在int64(第三) – BLUEPIXY

+0

OP表示他不想將數字轉換爲字符串 –

+0

我認爲這是爲了最後結果。我認爲這種方法事實上要容易得多。 – BLUEPIXY

相關問題