11332 Summing Digits

2022.11.16 PM 11:30 by CBJ

來源 : https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=25&page=show_problem&problem=2307
出題者 : 2022年10月CPE
標籤 : 函式、字串整數互相轉換、遞迴
難易度 : 2
解題想法 : 
首先定義一個函數f(s),用於遞迴計算答案。(s為輸入字串)
當輸入的字串長度 = 1 時,結束f(s)。
否則遞迴呼叫f(Sum(s))。
其中函數Sum(s)需要另外定義,用於計算字串各位數相加結果。(注意 : 首先會讀入字串,並將各位數轉成整數並相加求出總和,最後再將總和轉回字串型態。(C可用sprintf(), C++可用std::to_string() or stringstream, Python可用str()))
如此一來即可解決此題。
//C language
//solution link(含註解): https://github.com/CBJ0519/CBJsProgramDiary.com/blob/main/CPE/11332.c

#include<stdio.h>
#include<ctype.h>
char ret[11];
int len(char s[11]){
    int cnt=0;
    for(int i=0;isdigit(s[i]);i++){
        cnt++;
    }
    return cnt;
}
void sum(char s[11]){
    int ans=0;
    for(int i=0;isdigit(s[i]);i++){
        ans+=(s[i]-'0');
    }
    sprintf(ret,"%d",ans);
}
char* f(char s[11]){
    if(len(s)==1) return s;
    sum(s);
    return f(ret);
}
int main(){
    char n[11];
    while(scanf("%s",n)!=EOF){
        if(len(n)==1 && n[0]=='0') break;
        printf("%s\n",f(n));
    }
    return 0;
}
//C++ language
//solution link(含註解): https://github.com/CBJ0519/CBJsProgramDiary.com/blob/main/CPE/11332.cpp

#include<iostream>
#include<string>
using namespace std;
string sum(string s){
    int ans=0;
    for(char i:s){
        ans+=(i-'0');
    }
    string ret=to_string(ans);
    return ret;
}
string f(string s){
    if(s.length()==1) return s;
    return f(sum(s));
}
int main(){
    string n;
    while(cin>>n){
        if(n=="0") break;
        cout<<f(n)<<"\n";
    }
    return 0;
}
## Python language
## solution link(含註解): https://github.com/CBJ0519/CBJsProgramDiary.com/blob/main/CPE/11332.py

def f(s):
    if(len(s)==1): return s
    return f(Sum(s))
def Sum(S):
    ans=0
    for i in S:
        ans+=int(i)
    return str(ans)
while True:
    n=input()
    if n=='0': break
    print(f(n))

相關文章

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *