51nod--1770数数字

来源:互联网 发布:linux程序设计pdf下载 编辑:程序博客网 时间:2024/05/01 19:32
为该问题添加一个话题 隐藏话题
1770 数数字
基准时间限制:1 秒 空间限制:262144 KB 分值: 20 难度:3级算法题
 收藏
 关注

统计一下  的结果里面有多少个数字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示例
23 3 9 103 3 0 10
Output示例
100
刚开始范围看错了,用了大数,显然超时了,就当是复习了一遍大数乘法
第二次想到除了首位和末位,中间应该都一样,然而并不是这样,如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;}



0 0
原创粉丝点击