计算进位操作

标签 c

谁能告诉我为什么我的程序总是得到错误答案?它必须计算总和中的进位操作数。我尝试了我想到的每个测试用例。我没有得到错误的输出。

问题描述:

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/

相关文章:

c++ - 为什么到目前为止复合文字还不是 C++ 的一部分?

c - 这是什么(int**)&p;声明中的意思是?

c - 请告诉我当返回多个变量时哪个变量被存储?

将初始值设定项向下转换为指针

为 iOS 编译半浮点 neon 指令

c - Win32应用程序中的神秘窗口消息0xc0e8

c - 可以在函数参数中声明一个数组吗?

c - 在 C 中将数组大小加倍?

c - 为什么不能像单维那样访问多维数组

c - 如何手动计算像 ~0x000C 这样的表达式?