数数字(51Nod - 1770)

版权声明:版权所有--转载的小伙伴请告知博主并注明来源哦~ https://blog.csdn.net/u011145745/article/details/82154008

I - 数数字

来源: 51Nod - 1770 

Problem Description

统计一下   的结果里面有多少个数字d,a,b,d均为一位数。

样例解释:

3333333333*3=9999999999,里面有10个9。

Input

多组测试数据。 
第一行有一个整数T,表示测试数据的数目。(1≤T≤5000) 
接下来有T行,每一行表示一组测试数据,有4个整数a,b,d,n。 (1≤a,b≤9,0≤d≤9,1≤n≤10^9)

Output

对于每一组数据,输出一个整数占一行,表示答案。

Sample Input

2
3 3 9 10
3 3 0 10

Sample Output

10
0

Hint:可以分情况来判断。起初直接暴力,显然会超时。找找规律,后来分了三大种情况:

一、1个重复数字;  二、2个重复数字;  三、3个及以上重复数字。

前两种情况好判断。第三种情况,无论重复n次n值为多大,我们只需要计算三位数与b值的乘积,之后只通过判断相乘以后的那个三位数或四位数即可;然后又分2种:

1、是3位数则肯定全是相同的,再来判定是否与d相同,是则直接加n。

2、四位数分别拿出来,从左数第一位和第三位、四位都是独立的,单独判定进行++即可,第二位数在这n个数相乘之后出现n-2次,如果相同则+=n-2即可。

博主示例代码如下:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

using namespace std;

int main()
{
    int T, a, b, d, n;
    scanf("%d", &T);
    while(T--)
    {
        int sum = 0, x = 1, i, t = 0;
        scanf("%d %d %d %d", &a, &b, &d, &n);
        if(n == 1) // 只重复一次的情况
        {
            sum = a * b;
            while(sum)
            {
                if(sum % 10 == d) t++;
                sum /= 10;
            }
        }
        else if(n == 2) // 重复两次的情况
        {
            for(i = 0; i < 2; i++)
            {
                sum += a * b * x;
                x *= 10;
            }
            while(sum)
            {
                if(sum % 10 == d) t++;
                sum /= 10;
            }
        }
        else // 重复3次及以上
        {
            for(i = 0; i < 3; i++)
            {
                sum += a * b * x;
                x *= 10;
            }
            int c[5];
            i = 0;
            while(sum)
            {
                c[++i] = sum % 10;  // 将每一位拆开存下来
                sum /= 10;
            }
            if(i == 3 && c[1] == d) t += n;
            else if(i == 4)
            {
                if(c[1] == d) t++;
                if(c[3] == d) t += n - 2; // 这里之所以是c[3]是因为存的时候是倒着存进去的,就相当于那个四位数的左数第二个
                if(c[2] == d) t++;
                if(c[4] == d) t++;
            }
        }
        printf("%d\n", t);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/u011145745/article/details/82154008