统计一下
个
的结果里面有多少个数字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
对于每一组数据,输出一个整数占一行,表示答案。
Input示例
2 3 3 9 10 3 3 0 10
Output示例
10 0
刚开始范围看错了,用了大数,显然超时了,就当是复习了一遍大数乘法
第二次想到除了首位和末位,中间应该都一样,然而并不是这样,如8888*6=53328 但是中间一定存在循环节
记录每个数出现次数,当出现重复数字时,该数字个数就是加上剩余长度,注意第一个数可能和重复的数字不同
超时代码:
//超时代码:#include<cstdio> #include<algorithm> #include<cstring> using namespace std; int num[100],s[100]; int main(){ int t; scanf("%d",&t); while(t--){ int a,b,d,n;int sum=0; scanf("%d%d%d%d",&a,&b,&d,&n); memset(num,0,sizeof(num)); memset(s,0,sizeof(s)); for(int i=0;i<n;i++){ num[i]=a*b+s[i]; if(num[i]>9){ s[i+1]=num[i]/10; num[i]=num[i]%10; } if(num[i]==d) ++sum; } num[n]=s[n]; if(num[n]!=0&&num[n]==d) sum+=1; printf("%d\n",sum); } return 0; }
//正确代码: #include<cstdio> #include<cstring> int num[10]; int main() { int t,c,g,j; scanf("%d",&t); while(t--) { int a,b,d,n,tt=0; scanf("%d%d%d%d",&a,&b,&d,&n); int nu=a*b; if(nu<10) { if(d==nu) printf("%d\n",n); else printf("%d\n",tt); } else { memset(num,0,sizeof(num)); c=nu%10;//当前数字 g=nu/10;//进位数 n--; num[c]++; while(n){ c=(nu+g)%10; g=(nu+g)/10; if(num[c]!=0){ num[c]+=n; break; } else num[c]++; n--; } num[g]+=1;//第一位数即进位数 printf("%d\n",num[d]); } } return 0; }