数数字
Description
统计一下 aaa ⋯ aaa * b(n 个 a × b) 的结果里面有多少个数字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 1
2 3 3 9 10 3 3 0 10
Sample Output 1
10 0
思路:如果a*b<10,那么不会产生进位,如果a*b=d,就有n个d,否则没有
如果a*b>=10,会产生进位,
如果n<3,直接算出来结果,判断有多少个就可以;
如果n>=3,可以发现(或者说推出)最多有4个不同的数字,
设结果从右往左1~(n+1)位,第一位会出现1次,第二位会出现1次,第(n+1)位会出现1次,剩下的都和第n位一样(即出现n-2次) (注意:其他那三个数有可能有相同的,如:7777*8=62216),
所以我们只要求出(aaa*b),在根据规律就可以知道每个数字出现了几次。
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
int T;
scanf("%d",&T);
int a,b,d,n;
while(T--){
scanf("%d%d%d%d",&a,&b,&d,&n);
int x,ans=0;
int p[10];
if(a*b<10){
x=a*b;
if(x==d)
printf("%d\n",n);
else
printf("0\n");
}
else if(n<3){
for(int i=1;i<=n;i++)
ans=ans*10+a;
ans*=b;
int cnt=0;
while(ans){
x=ans%10;
ans/=10;
if(x==d) cnt++;
}
printf("%d\n",cnt);
}
else {
ans=(a*100+a*10+a)*b;
for(int i=1;i<=4;i++){
p[i]=ans%10;
ans/=10;
}
int cnt=0;
if(d==p[1])
cnt++;
if(d==p[2])
cnt++;
if(d==p[3])
cnt+=n-2;
if(d==p[4])
cnt++;
printf("%d\n",cnt);
}
}
return 0;
}