我試圖在hackerrank上解決這個問題。但是我遇到了一些問題。具體問題是:
例如:
- 數字 9875 的總和將計算為:
總和(9875) = 9 8 7 5 = 29。
總和(29)= 11。
sum(11) = 2.(使用遞回函式)。
- 在我的測驗用例中, (n ='9875', k=4) 數字p是通過連接字串nk次創建的,因此初始 p = 9875987598759875(字串 '9875' 重復 4 次)。
但是當我撰寫這個測驗用例時,它不起作用。這是我的源代碼:
int SuperDigit(long n){
long sum =0;
if(n==0) return 0;
else{
return sum= sum (n%10 SuperDigit(n/10));
}
if(sum>10){
return (sum%10 SuperDigit(sum/10));
}
}
int main(){
string n;cin>>n;
int T;cin>>T;
string repeat;
for(int i=0; i <T;i ){
repeat = n;
}
cout<<repeat;
long x=0;
stringstream geek(repeat);
geek>>x;
long sum = SuperDigit(x);
printf("\n%ld ",sum);
for(int i=0;i<10;i ){
if(sum>=10){
sum = SuperDigit(sum);
}
else{
break;
}
}
printf("\n%ld ",sum);
}
如果我嘗試: n = '123' 和 k =3 (預期輸出:9)
我的輸出將是正確的,這是我對這個測驗用例的輸出:
123 3
123123123
18
9
但是當我嘗試 n = '9875' 和 k = 4 (預期輸出:8)
我的輸出將是錯誤的:
9875 4
9875987598759875
46
1
正如您在這個測驗用例中看到的,所有數字的第一個總和必須是116。但我的只顯示46。
誰能為我解釋一下?非常感謝!
uj5u.com熱心網友回復:
您可以簡化您的程式,如下所示。由于您想遞回地求和,下面的程式顯示了一種可能的方法。
版本 1:使用遞回函式
#include <iostream>
int findDigit(int passed_num, int currentSum)
{
int lastDigit;
if (passed_num == 0) {
return currentSum;
}
// find the last didit
lastDigit = passed_num % 10;
currentSum = lastDigit;
//call findDigit() repeatedly
currentSum = findDigit(passed_num / 10, currentSum);
std::cout<<lastDigit<<" ";
return currentSum;
}
int main()
{
std::cout << "Enter a number: ";
int input_num, sum;
std::cin>>input_num;
sum = findDigit(input_num, 0);
std::cout<<"sum is: "<<sum<<std::endl;
std::cout << "Enter another number: ";
std::cin>>input_num;
sum = findDigit(input_num, 0);
std::cout<<"sum is: "<<sum<<std::endl;
return 0;
}
請注意,有更簡單的(其他)方法可以在不遞回的情況下找到總和。一種這樣的方式如下所示:
版本 2:使用回圈
#include <string>
#include <iostream>
int main()
{
std::cout << "Enter a number: ";
int individual_number = 0, sum = 0;//these are local built in types so initialize them
std::string input_num;
std::cin >> input_num;
for(char c : input_num)
{
individual_number = c -'0';
std::cout<<individual_number<<" ";
sum = individual_number;
}
std::cout<<"total amount: "<<sum<<std::endl;
// std::cout<<"The sum comes out to be: "<<sum<<std::endl;
return 0;
}
uj5u.com熱心網友回復:
在您當前的代碼中,您return 過早地
if(n==0) return 0;
else{
return sum= sum (n%10 SuperDigit(n/10));
}
想象一下,n == 89如此n回傳9并SuperDigit(n/10)回傳8并且您有17作為答案(8預期何時)。
你可以把它作為
int SuperDigit(long n) {
int result = 0;
/* We compute digital root (sum of digits) */
for (long number = n; number != 0; number /= 10)
result = (int) (number % 10);
/* if result is out of range [-9..9]
we compute digital root again from the answer */
if (result < -9 || result > 9)
result = SuperDigit(result);
return result;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/365906.html
上一篇:帶記憶的遞回河內塔的空間復雜度?
