1. 程式人生 > >【HDU】1013 數根(C語言)

【HDU】1013 數根(C語言)

-------本人小白一枚,剛接觸程式設計不久,有什麼問題還請大家不吝賜教-------問題描述通過總和整數的數字找到正整數的數字根。如果結果值是單個數字,那麼該數字就是數字根。如果結果值包含兩個或更多數字,則將這些數字相加並重復該過程。只要有必要獲得一個數字,就會繼續這樣做。

例如,考慮正整數24.將2和4相加產生6的值。由於6是單個數字,因此6是24的數字根。現在考慮正整數39.將3和9相加12.由於12不是單個數字,因此必須重複該過程。新增1和2個3,一個數字,也是39的數字根。
輸入輸入檔案將包含一個正整數列表,每行一個。輸入的結尾將用整數值0表示。
輸出對於輸入中的每個整數,將其數字根輸出到輸出的單獨行上。
示例輸入24390示例輸出63

解題思路:

這道題主要包括兩個步驟

Step1:將整數的各位相加,小於9直接輸出

Step2:合大於9,考慮繼續迴圈計算,直到小於9,這裡用到的是兩重迴圈,具體見程式碼

*注意*

1.輸入的整數可以很長,所以不能用int或long這種型別,在這裡需要考慮使用字串輸入,並將字串轉為數值num += (str[i] - '0');

2.注意題幹中要求輸入結尾為0,使用迴圈:while(scanf("%s", str) && str[0]!='0')

程式碼1(Accepted)

#include <iostream>

int main()
{
    int num, ans;
    char str[1000];
    while(scanf("%s", str) && str[0]!='0')
    {
        num = 0;
        for(int i=0; str[i]!='\0'; i++)
            num += (str[i] - '0');
        while(num>9)
        {
            ans = 0;
            while(num)
            {
                ans += num%10;
                num /= 10;
            }
            num = ans;
        }
        printf("%d\n", num);
    }
    return 0;
}

程式碼2(Wrong Answer

雖然這個沒有通過,但是我認為題意要表達的就是先輸入所有整數,‘0’結束。

但實際上通過的卻是輸入一個整數,輸出一個整數的形式。(不知道是不是我哪裡理解有誤

#include <stdio.h>
int main()
{
    int num, ans;
    char str[1000];
    int result[1000];//定義一個數組來存放結果
    int x=0;        //定義一個變數來存放輸出結果的個數
    while(scanf("%s", str) && str[0]!='0')
    {
        num = 0;
        for(int i=0; str[i]!='\0'; i++)
            num += (str[i] - '0');
        while(num>9)
        {
            ans = 0;
            while(num)
            {
                ans += num%10; //個位數
                num /= 10; //十、百、千。。。
            }
            num = ans;
        }
        result[x]=num;        //將算出的結果存方到result陣列中
        x++;                //輸出結果的個數加一
        
    }
    int i=0;
    printf("運算結果如下:\n");
    for(i=0;i<x;i++)
        printf("%d\n", result[i]);
    
    return  0;
}


這段程式碼中我認為13——22行這段二重迴圈是這道題的突破點。

  -------------------------------------  我是分割線   -------------------------------------------

下面是我在做後面【1163】時用了九餘數定理,想著用九餘數定理能不能更簡單地解決這道題,結果很愉快地通過了~

程式碼:

#include <stdio.h>


int main()
{
    int num,temp;
    char str[1000];
    while(scanf("%s", str) && str[0]!='0')
    {
        num = 0;
        for(int i=0; str[i]!='\0'; i++)
            num += (str[i] - '0');
        temp=num;
        temp=temp%9;
        if (temp==0)
            printf("9\n");
        else
            printf("%d\n", temp);
    }
    return 0;
}

大家還有什麼其他的方法,歡迎留言~