版权声明:版权所有--转载的小伙伴请告知博主并注明来源哦~ 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即可。
扫描二维码关注公众号,回复:
2996035 查看本文章
博主示例代码如下:
#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;
}