#34706: 這題我用C寫的,但是超級複雜,請問有人可以幫我看看哪裡能改進嗎?


b1115102@mail.nuk.edu.tw (謝承峻)

學校 : 不指定學校
編號 : 226823
來源 : [118.231.200.53]
最後登入時間 :
2024-07-08 11:12:05
c813. 11332 - Summing Digits -- UvaRuby兔 | From: [101.137.141.152] | 發表日期 : 2023-04-09 14:17

以下是我用C語言寫的

#include <stdio.h>
#include <math.h>
int g();
int main()
{
    long input;
    while(scanf("%ld", &input)==1)
    {
        long tmp_sum=0;//暫存總和
        tmp_sum=input;
        if(tmp_sum!=0)
        {
            do{
                tmp_sum=g(tmp_sum);
            }while(tmp_sum/10!=0);//繼續迴圈的條件:tmp_sum不為個位數,即除以10不為0
                    printf("%ld\n", tmp_sum);
        }
    }
    return 0;
}
int g(long n)
{
    int count=0;//判斷幾位數
    long tmp_n=n;
    while(tmp_n != 0)
    {
        tmp_n /= 10;
        ++count;
    }
    int sum=0;
    long lim=0;
    lim=pow(10,count);
    for(int i=10;i<=lim;i*=10)
    {
        sum=sum+(n%10);
        n=n/10;
    }
    return sum;
}

以下是我用C++寫的

#include <iostream>
using namespace std;
int f(int a){
    if (a<10)
    {
        return a;
    }
    int sum=0;
    while (a>0)
    {
        sum+=a%10;
        a/=10;
    }
    return f(sum);
}
int main() 
{
    int n;
    while (cin >> n)
    {
        if (n==0){
        break;
    }
    cout << f(n) <<endl;
    }
}

比較無法理解的是,我用C需要使用long long 的變數型態,但C++卻只需要用int 的變數型態
如果C只用int 或是long int ,那麼當測資為1234567892時,就會沒有output

請問有哪個大神知道為何會這樣嗎?

 
#34707: Re: 這題我用C寫的,但是超級複雜,請問有人可以幫我看看哪裡能改進嗎?


cges30901 (cges30901)

學校 : 不指定學校
編號 : 30877
來源 : [39.9.74.255]
最後登入時間 :
2024-10-14 22:20:08
c813. 11332 - Summing Digits -- UvaRuby兔 | From: [39.9.224.157] | 發表日期 : 2023-04-09 16:03

    for(int i=10;i<=lim;i*=10)


i會overflow,要改用log

 
#34708: Re: 這題我用C寫的,但是超級複雜,請問有人可以幫我看看哪裡能改進嗎?


cges30901 (cges30901)

學校 : 不指定學校
編號 : 30877
來源 : [39.9.74.255]
最後登入時間 :
2024-10-14 22:20:08
c813. 11332 - Summing Digits -- UvaRuby兔 | From: [39.9.224.157] | 發表日期 : 2023-04-09 16:10

    for(int i=10;i<=lim;i*=10)


i會overflow,要改用log


打錯,改用long

 
ZeroJudge Forum