谁能告诉我为什么我的程序总是得到错误答案?它必须计算总和中的进位操作数。我尝试了我想到的每个测试用例。我没有得到错误的输出。
问题描述:
children 被教导一次从右到左添加一位数的多位数字。许多人发现“进位”操作——将 1 从一个数字位置进位到下一个数字位置——是一项重大挑战。您的工作是计算一组加法问题中每个问题的进位运算次数,以便教育 worker 可以评估他们的难度。
输入
每行输入包含两个小于 10 位的无符号整数。输入的最后一行包含0 0。
输出
对于除最后一行之外的每一行输入,您应该计算并打印将两个数字相加所产生的进位操作数,格式如下所示。
示例输入
123 456
555 555
123 594
0 0
示例输出
No carry operation.
3 carry operations.
1 carry operation.
这是我当前的代码:
#include<stdio.h>
int main()
{
unsigned long long int a,b,m,n,rem_m,rem_n,judge=0,sum,count;
while((scanf("%llu%llu",&m,&n))==2)
{
if(m==0 && n==0)
{
break;
}
count=0;
while(m!=0 && n!=0)
{
rem_m=m%10;
rem_n=n%10;
if(judge==1)
{
rem_m++;
}
sum = rem_m+rem_n;
judge=0;
if(sum>=10)
{
count++;
judge++;
}
m=m/10;
n=n/10;
}
if(count==0)
{
printf("No carry operation.\n");
}
else
{
printf("%llu carry operations.\n",count);
}
}
return 0;
}
最佳答案
count the number of carry operations in a sum
断言 a,b >= 0:
简洁的解决方案
为了好玩:)
“ds”代表数字总和。
int ds(int n){return n == 0 ? 0 : n%10 + ds(n/10);}
int numberOfCarryOperations(int a,int b){return (ds(a) + ds(b) - ds(a+b)) / 9;}
可读
这是一个更具可读性的变体。
int digitSum(int n)
{
int sum;
for (sum=0; n > 0; sum+=n%10,n/=10);
return sum;
}
int numberOfCarryOperations(int a,int b){
// a, b >= 0
return (digitSum(a) + digitSum(b) - digitSum(a+b)) / 9;
}
数学上可以证明:每进位一次,digitSum减9。
9,因为我们在数制10中,所以如果我们有进位,我们在一位数上“减10”,我们得到+1作为进位。
Python 版本
我不知道如何在 C 中执行此操作,但在 Python 中很容易编写更好的 digitSum 函数。在 Python 中,我们可以轻松地从数字创建数字列表,然后只需对其使用 sum() 即可获得给定数字的数字总和。
这是一个简洁的 python 单行解决方案:
def numberOfCarryOperations(a, b):
# f is the digitSum function
f=lambda n:sum(map(int,str(n)));return(f(a)+f(b)-f(a+b))/9
关于计算进位操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32289368/