2017-03-15 48 views
0

我想寫一個C程序,計算提高到他們的位置的權力的數字的總和位數。C提高到他們的位置的權力的數字的總和

例如: 用戶輸入5672, 輸出應爲5^1 + 6^2 + 7^3 + 2^4。 數字5中的第一個數字上升到功率1,因爲它是第一個數字。在每種情況下都是一樣的邏輯。

我想出了代碼來計算一個數字的總和,但是,我有麻煩生成代碼關於如何將這些數字提高到一定的權力。

#include <stdio.h> 
#include <math.h> 

int main() { 
    long num, digit, sum = 0; 
    int countDigits = 0; 
    long temp = num; 
    int i; 

    printf("Enter the number \n"); 
    scanf("%ld", &num); 
    temp = num; 
    while (num > 0) { 
     digit = num % 10; 
     sum = sum + digit; 
     num /= 10; 
    } 
    printf("Given number = %ld\n", temp); 
    printf("Sum of the digits %ld = %ld\n", temp, sum); 

    while (temp > 0) { 
     countDigits += 1; 
     temp /= 10; 
    } 

    i = 0; 
    sum = 0; 
    while (num > 0) { 
     digit = num % 10; 
     sum = sum + pow(digit, countDigits); 
     countDigits -= 1; 
     num /= 10; 
    } 

    printf("The final sum is %d\n", sum); 
} 
+1

循環之前添加一個'position'變量,它初始化爲1,在循環和變化'總和=總和+手指的端部增加它;''到總和+ = POW(數字,POS) ;' – George

+0

[Do this](http://stackoverflow.com/questions/42821270/c-program-that-c​​alculates-sum-of-digits-of-a-number-raised-to-the-power-of-他們的#comment72754348_42821270)或者使用for循環,並且在那裏你將爲(int pos = 1; num> 0; ++ pos)提供「* position *」'pos'變量''。 –

+0

@George這是一個好主意,但不幸的是,上面的代碼是從右到左的數字,她想從左到右讀數字。閱讀一個字符串可能會更好,並且這樣做。逐字串直到它不是一個數字,解碼字符的實際數字(char - '0')。那麼你的位置邏輯將會很酷......(但是當然她必須考慮到pos的範圍從1到n,但是在解引用字符串以確保使用「pos-1」時 – Code4aliving

回答

3

這很簡單,創建一個額外的功能,你發送它的數字位置+數字它自己,功能將返回數字^我。把它加到總和中。

int countDigits = 0 
int temp = num 
while (temp > 0) 
{ 
    countDigits += 1; 
    temp /= 10; 
} 

i = 0; 
sum = 0; 
while (num > 0) 
{ 
    digit = num % 10; 
    sum = sum + pow(digit, countDigits); 
    countDigits -= 1; 
    num /= 10; 
} 
+0

不幸的是,要求是從左到右讀取數字。原始代碼和此代碼從右到左執行... – Code4aliving

+1

@BradBales計數位數,然後以相同方式開始處理數字,並在調用pow函數後遞減計數器的位數。 –

+0

謝謝@TonyTannous很感激,但是這個代碼對於從左到右的數字是如何工作的? –

0

而不是閱讀數字,然後試圖總結動力數字,它是一件容易的事,一次做這一切。

下面是一個解決方案,它使用ipow - 將x提高到n,使用指數平方。你也可以用一個循環代替n次,因爲你的n不能變得很大。

#include <stdio.h> 

long ipow(long x, int n) { 
    long r = 1; 
    while (n) { 
     if (n % 2) r *= x; 
     x *= x; 
     n >>= 1; 
    } 
    return r; 
} 

int main() { 
    long sum = 0; 

    printf("Enter the number \n"); 
    long n = 0; 
    for (int pos = 1; ; pos++) { 
     int c = getchar() - '0'; 
     if (c < 0 || c > 9) break; 
     sum += ipow(c, pos); 
     n = 10 * n + c; 
    } 
    printf("Number is: %ld\n", n); 
    printf("Powered digit sum is: %ld\n", sum); 
} 
+0

他可能剛剛正在學習[Tag:C],現階段只會讓他感到困惑。遞歸會很酷,但我不認爲他仍然知道它。 –

+0

建議一致性'if(n%2)... n/= 2;'或'if(n&1)... n >> = 1;'。第一個更便攜。 – chux