• 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目录树与磁盘分区
    私有服务器外网访问zerotier解决方案
    ubuntu防火墙相关
    “ssh协议”简单使用
    Ubuntu软件安装小记
    怎么说服领导,能让我用DDD架构肝项目?
    金3银4面试前,把自己弄成卷王!
    开发 IDEA Plugin 引入探针,基于字节码插桩获取执行SQL
    《重学Java设计模式》作者开始录视频了!
    《Mybatis 手撸专栏》第1章:开篇介绍,我要带你撸 Mybatis 啦!
  • 原文地址:https://www.cnblogs.com/dongsheng/p/2768268.html
Copyright © 2020-2023  润新知