zoukankan      html  css  js  c++  java
  • NYOJ485 A*B Problem

     

    A*B Problem

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:2
     
    描述

    设计一个程序求出A*B,然后将其结果每一位相加得到C,如果C的位数大于等于2,继续将C的各位数相加,直到结果是个一位数k。

    例如:

    6*8=48;

    4+8=12;

    1+2=3;

    输出3即可。

     
    输入
    第一行输入一个数N(0<N<=1000000),表示N组测试数据。
    随后的N行每行给出两个非负整数m,n(0<=m,n<=10^12)。
    输出
    对于每一行数据,输出k。
    样例输入
    3
    6 8
    1234567 67
    454 1232
    样例输出
    3
    4
    5

    /*
    //代码一: 用cin cout TLE,改成scanf    948ms   降过
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    
    using namespace std;
    
    const int MAX = 15;
    
    
    int Mult(char *s1, char *s2)
    {
        int a[MAX], b[MAX], ans[MAX * 2];
        int len1 = strlen(s1);
        int len2 = strlen(s2);
        memset(ans, 0, sizeof(ans));
        for(int i = 0; i < len1; ++i)
            a[len1 - i - 1] = s1[i] - '0';
        for(int i = 0; i < len2; ++i)
            b[len2 - i - 1] = s2[i] - '0';
        for(int i = 0; i < len1; ++i)
            for(int j = 0; j< len2; ++j)
                ans[i + j] += a[i] * b[j];
        int sum = 0;
        for(int i = 0; i < len1 + len2; ++i)
        {
            if(ans[i]>9)
            {
                ans[i+1] += ans[i] / 10;
                ans[i] %= 10;
            }
            sum += ans[i];
        }
        return sum;
    }
    
    int main()
    {
        int T;
        char s1[MAX], s2[MAX];
        
       // cin >> T;
        scanf("%d", &T);
        while(T--)
        {
           // cin >> s1 >> s2;
            scanf("%s%s", s1, s2);
            int sum = Mult(s1, s2);
            while(sum>9)
            {
                int t = sum;
                sum = 0;
                while(t)
                {
                    sum += t % 10;
                    t /= 10;
                }
            }
            //cout << sum << endl;
            printf("%d\n",sum);
        }
        return 0;
    }
    */
    
    
    //代码二:-----最优代码
    /*
    分析:对于一个整数n,设f(n)为n的各个位之和,有这样一个等式 n%9=f(n)%9;
    证明:同余定理(a+b)%c=(a%c+b%c)%c,还有显然成立和k*(10^M)%9=k,代入到n%9=f(n)%9中,
    即可得证n%9=f(n)%9是成立的。
    还要注意我们所求的是一个一位数,而我们是对9取余的,当余数为0时,我们要的结果可能是0,可能是9。是0的情况,只有开始时两个乘数至少有一个为0。其他情况为9。
    题解:http://acm.nyist.net/JudgeOnline/articles/?p=696#more-696
    */
    #include <iostream>
    #include <cstdio>
    using namespace std;
    
    int main()
    {
        int n;
        long long a,b;
        scanf("%d",&n);
        while(n--)
        {
            scanf("%lld%lld",&a,&b);
            if(a==0 || b==0)
                printf("0\n");
            else
            {
                int tp=(a%9)*(b%9)%9;
                if(tp==0)
                    tp=9;
                printf("%d\n",tp);
            }
        }
        return 0;
    }
    

      

    功不成,身已退
  • 相关阅读:
    面向对象
    linux下apache重启报错
    mysql登录密码忘记怎么办?
    html基础知识梳理
    用js实现贪吃蛇
    简单轮播图案例
    JavaScript基础学习笔记整理
    读书笔记之《Redis开发与运维》—— 三
    读书笔记之《Redis开发与运维》—— 二
    读书笔记之《Redis开发与运维》—— 一
  • 原文地址:https://www.cnblogs.com/dongsheng/p/2768268.html
Copyright © 2011-2022 走看看