本文主要是介绍BSG白山极客挑战赛 数数字,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
统计一下 aaa ⋯ aaan个a × b 的结果里面有多少个数字d,a,b,d均为一位数。
样例解释:
3333333333*3=9999999999,里面有10个9。
多组测试数据。 第一行有一个整数T,表示测试数据的数目。(1≤T≤5000) 接下来有T行,每一行表示一组测试数据,有4个整数a,b,d,n。 (1≤a,b≤9,0≤d≤9,
1≤n≤10^9)
对于每一组数据,输出一个整数占一行,表示答案。
2 3 3 9 10 3 3 0 10
10 0
刚开始看到这道题,我还以为是,模拟呢,结果我看到 n 的范围的后,瞬间懵逼,肯定不是模拟了,肯定是找规律了。
首先,因为每位的数值都一样,所以在不进位的情况下每位的结果肯定都一样,但是加上进位就不好说了,但是经过计算你会发现,就算加上进位,在千位 或者 万位开始,他的结果的值都开始不变了,进位的数值都是一样的了,只有万位以下的值会受进位的影响而产生差别,所以,只算后几位就可以了,因为我这里算的是 后 6 位,如果不超过 6 位的,直接计算就行,
附上代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <algorithm>
#include <vector>
#include <cmath>
#include <map>
#define LL long long
#define MAX_N 50000
using namespace std;int main()
{int t;scanf("%d",&t);while(t--){ int a,b,d,n;scanf("%d%d%d%d",&a,&b,&d,&n);map<int ,int> Map;if(n >= 6) // 大于 6 位 和小于 6 位分成两种方式算{int num = a * 100000 + a * 10000 + a * 1000 + a* 100 + a * 10 + a;int sum = num * b;Map[sum % 1000000 / 100000] = n - 6; // 去除 计算的用的 后 6 位,其他的都和 百万位上的相同 while(sum) // sum 的第一位也就是全数的第一位{Map[sum%10]++;sum /= 10;}}else{int num = 0;for(int i = 0;i < n;i++){num = num * 10 + a;}int sum = num * b;while(sum){Map[sum%10]++;sum /= 10;}}Map[d]++;printf("%d\n",Map[d] - 1);}return 0;
}
这篇关于BSG白山极客挑战赛 数数字的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!