这是问题,我不知道该怎么做
- (7分)编写名为 AddDigit 的 int 函数,该函数将整数作为输入它返回所有数字的总和 可以被3或5整除。例如,
醇>AddDigit(13579) - 它返回17(即3 + 5 + 9),因为3,5和9可以被3或5整除
AddDigit(355) - 它返回13(即3 + 5 + 5),因为3和5可以被3或5整除
AddDigit(248) - 它返回0,因为没有数字可被3或5
整除
这是我的代码:
#include <stdio.h>
#include <cstring>
#include<time.h>
#include<iostream>
using namespace std;
int AddDigit(char a[]) {
int sum = 0, numberofdigit;
numberofdigit = strlen(a);
for (int i = 0; i < strlen(a)-1; i++) {
if ((a[i] % 3 == 0 || a[i] % 5 == 0)&&a[i]!=0) {
sum += a[i];
}
}
return sum;
}
int main() {
char b[10];
cin >> b;
cout<<AddDigit(b);
}
答案 0 :(得分:3)
您将输入作为字符数组,字符&#39; 0&#39;不同于整数0,
&#39; 0&#39;的ASCII这是48
ASCII为0,即0
你为什么得到50分?&#39; 123&#39;因为&#39; 2&#39;意味着50%5 == 0,所以你添加了&#39; 2&#39;总和。
为了获得你想要的东西,你需要得到char数组的等价整数,d = arr [i] - &#39; 0&#39;
newData
答案 1 :(得分:1)
从读取赋值时,AddDigit
函数应该采用int
参数,而不是字符数组,字符串或任何其他基于字符的类型。因此,您的方法开始不正确,因为它违反了作业的要求。
因此,方法是弄清楚如何从int
剥离每个数字,并从该数字中确定它是否可被3或5整除。使用简单模数和传入的连续除法整数,方法可以是这样的:
int AddDigit(int n)
{
int total = 0; // final total
while (n > 0)
{
int digit = n % 10; // get rightmost digits
// add the value if digit is either evenly divisible by 3 or 5
total += ((digit % 3 == 0 || digit % 5 == 0) ? digit : 0);
// remove the last digit from the number
n /= 10;
}
return total;
}
请注意,如果三元条件返回false
,则添加到总计的行将添加0。这个条件是检查数字是否可以被3或5整除。如果条件是true
,我们只需将该数字加到总数上。
答案 2 :(得分:0)
在递归函数中可能会更加整洁:
int AddDigit(int num)
{
if (num == 0) //WE REACH THIS WHEN 1-DIGIT NUMBER IS DIVIDED BY 10
return 0;
int curNum = num % 10; //ALWAYS ACCOUNTING FOR ONLY LAST DIGIT
//WE ADD IT OR NOT AND THEN CONTINUE TO THE NEXT DIGIT
if (curNum % 3 == 0 || curNum % 5 == 0)
return curNum + AddDigit(num/10);
else
return AddDigit(num/10);
}