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))

發佈留言