1770 数数字

点击打开链接

统计一下 aaa  aaana × 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

一开始自己就发现了,中间都是重复的,所以只需要模拟很少的就可以了,所以就模拟了半天,发现一直WA,看了输入数据,知道了,情况不是自己想的那么简单,

3333*3=9999

3333*9=29997

8888*7=62216

我是真没有分析到,还有第三种这种情况,还会进两位,我的重复都是取得num[1],所以就错了好多遍。

但是自己应该错了,就去分析我们可能的情况,还有就是情况的分类,自己做的很烂,导致思路都很混乱。还有就是记忆化忘了数组的存储,还扫了好多遍,不是直接存取,当然每次都得memset

#include<cstdio>
#include<cstring>
#include<algorithm>
typedef long long ll;
using namespace std;

int num[10];
int main()
{
	int a,b,d,n,s;
	int T;
	scanf("%d",&T);
	while(T--){
		scanf("%d %d %d %d",&a,&b,&d,&n);
		memset(num,0,sizeof(num));//忘了 QAQ 
		if(n<=5){
			s=0;
			while(n--){
				s=s*10+a;
			}
			s*=b;
			while(s){
				num[s%10]++;
				s/=10;
			}
		}
		else{
			s=0;
			int t=5;
			while(t--){
				s=s*10+a;
			}
			s*=b;
			int ge=s%10;
			int shi=(s/10)%10;
			int bai=(s/100)%10;
			s=s/1000;
			while(s)
			{
				num[s%10]++;
				s/=10;
			}
			num[ge]++;num[bai]++;num[shi]++;num[bai]+=n-5;
		}
		printf("%d\n",num[d]);
	} 
	return 0;
}

没用数组记忆化,做的很烂

#include<cstdio>
#include<cstring>
#include<algorithm>
typedef long long ll;
using namespace std;

int a,b,d,n;

int num[10],ans[10];
int main()
{
	int T;
	scanf("%d",&T);
	while(T--) {
		scanf("%d %d %d %d",&a,&b,&d,&n);
		if(a*b<10) {
			if(d==a*b)
				printf("%d\n",n);
			else
				printf("0\n");
			continue;
		} else {
			int cnt=0,c=0,ed=0;
			if(n<10) {
				for(int i=0; i<n; i++)
					num[i]=a*b;
				for(int i=0; i<n; i++) {
					ans[cnt++]=(c+num[i])%10;
					c=(c+num[i])/10;
				}
				if(c) ans[cnt++]=c;
				for(int i=0; i<cnt; i++)
					if(ans[i]==d)
						ed++;
			} else {
				for(int i=0; i<10; i++)
					num[i]=a*b;
				for(int i=0; i<10; i++) {
					ans[cnt++]=(c+num[i])%10;
					c=(c+num[i])/10;
				}
				if(c) ans[cnt++]=c;

				if(d==ans[9]) {
					for(int i=0; i<cnt; i++) if(ans[i]==d)ed++;
					ed+=n-10;
				} else {
					if(ans[cnt-1]==d)ed++;
					if(ans[0]==d) ed++;
					if(ans[1]==d) ed++;
				}

			}
			printf("%d\n",ed);
		}

	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值