BSG白山极客挑战赛A-数数字



统计一下 aaa ⋯ aaa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
对于每一组数据,输出一个整数占一行,表示答案。


Input示例
2
3 3 9 10
3 3 0 10


 Output示例
10
0

题意:如题。

题目链接:数数字

解题思路:首先就要注意到结果的规律性,因为重复进行a*b+进位对10求余,那么后续的每个数字肯定会恒定一个值,除了最高位,只需要求出开始出现恒定值得位置,然后用总长度减去这个位置即可,看这个值是否等于d,考虑要不要相加,最后再考虑最高位进位后会不会等于d即可。

刚开始我就没考虑进位的影响,结果WA了好多次,做题还是要细心!

代码:

#include
   
   
    
    
#include
    
    
#include
     
     
      
      
#include
      
      
       
       
#include
       
       
         #include 
        
          using namespace std; typedef long long ll; int main() { ll T,i,ans,a,b,c,d,n,flag; cin>>T; while(T--){ scanf("%I64d%I64d%I64d%I64d",&a,&b,&d,&n); ans=0,flag=0; for(i=0;i 
         
           9){ //考虑进位的情况 flag++; c-=10; } if(c==d && (a*b+flag)%10 == d){ //开始恒定这个数字,直至最高位 break; } else if(c==d) ans++; //没有恒定之前 d出现的次数 if(i>100){ //对10求余,最多100次就应该出现循环,超过了就代表无解了 i=n;break; } } ans+=(n-i); //数字恒定的长度 if (d && flag==d) ans++; //考虑最高位是否等于d,但要排除d=0的情况 // ceshi(a,b,d,n); printf("%I64d\n",ans); } } 
          
         
       
      
      
     
     
   
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值