title

思路:

m*n(顺序无关)
如果n 是偶数,显然有 n · m = n/2 · 2m

如果n 是奇数,则有 n · m = (n-1) / 2 · 2m + m

举例:35*72的计算过程过程
35 72
17 144
8 288
4 576
2 1152
1 2304
从上到下,对每一行,若左边的数字若为奇数,则将右边的数字取出,累加。
72+144+2304=2520
累加的结果2520即为乘积。

#include <stdio.h>
int main(void)
{
    int m,n;
    // 题目要求是多组数据输入所以用死循环
    while(~scanf("%d%d",&m,&n))
    {
        // sum 用来记录累加后的值
        int sum=0;
        while(m!=0)
        {
            // 偶数情况
            if(m%2==0)
            {
                n*=2;
                m/=2;
            }
            // 奇数情况,就把n的值累加
            else
            {

                // 为了格式要求判断是否累加到最后一步
                if(m!=1)
                {
                    printf("%d + ",n);
                    sum+=n;
                }
                else
                {    
                    printf("%d = %d\n",n,sum+n);
                }

                // 每次都要进行折半,加倍操作
                m=(m-1)/2;
                n*=2;
            }        
        }
    }

    return 0;
}

results matching ""

    No results matching ""