nyoj 485 A*B的问题

来源:互联网 发布:奇幻咔咔差不多的软件 编辑:程序博客网 时间:2024/05/16 10:27

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。
样例输入
36 81234567 67454 1232
样例输出
345


先来一种麻烦的算法:::

#include<stdio.h>
#include<string.h>
  int main()
  {
    int t;
        scanf("%d",&t);//t组数据
    while(t--)
    {
        int c=0,i,h1,h2,j,w=0;
    char a[1000],b[1000];
    int s1[1000],s2[1000],s[2000];

    memset(s,0,sizeof(s));
    scanf("%s %s",a,b);           //读取字符
    h1=strlen(a);h2=strlen(b);  //长度
    for(i=0;i<h1;i++)
    {
        s1[i]=a[h1-1-i]-'0';          //字符转换成数字,并且反过来存储
    }
    for(j=0;j<h2;j++)
    {
        s2[j]=b[h2-1-j]-'0';         //同上
    }
   

    for(i=0;i<h1;i++)
    for(j=0;j<h2;j++)
    {
        s[i+j]=s[i+j]+s1[i]*s2[j];    //大数相乘的做法,依次相乘
    }
    for(i=0;i<=h1+h2;i++)         //处理一下进位
    {
        int k=s[i]+c;
        s[i]=k%10;
        c=k/10;
    }

   

////以上就是大数相乘的做法

     for(i=h1+h2;i>=0;i--)
    {
        w=w+s[i];
    }
    int m=w;          //找一个数纪录这个 各位数字相加的和
    while(m>9)      //如果m<9的话,就说明现在的数字是一位数,所以跳出,如果不是, 就说明这个数字至少是两位数,所以要进行一下操作
    {
        m=0;          //预处理

        int   u;

        for(i=0;w>10;i++)
        {
            u=w%10;     //每次取个位数
            w=w/10;       //删去个位数
            m=m+u;        //每次相加
        }
        m=m+w;            //当w>10的时候,最后加上w
    }
    printf("%d\n",m);      //循环处理之后,m最终得到个位数,输出
    }
    return 0;

///////////////综上所述 ,就是用大数相乘的方法进行操作,比较麻烦




首先举个例子::::(30*80)%9=(30%9)*(80%9)%9,,,,结果一样哦

下面就是简单的方法,前辈说是摸九法:

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        long long a,b;
        scanf("%lld %lld",&a,&b);           //注意到范围,所以用%lld
       

        if(a==0||b==0)                       //有一个数字是0,结果是0
        printf("0\n");

        else
        {
        int tp;
        tp=(a%9)*(b%9)%9;               //我感觉就是分开对9去余,再相乘而已
        if(tp==0)                                   //如果tp是0,则结果为9
        tp=9;
        printf("%d\n",tp);

        }
    }
    return 0;
}


有什么问题,欢迎一起讨论哦,一起学习!




0 0
原创粉丝点击