RE+只得10分,求助!!

P1591 阶乘数码

@[FYH666666](/user/1099417) 虽然但是,你的5!输出为5050000
by queenbee @ 2024-04-13 19:51:33


@[FYH666666](/user/1099417) ```cpp #include<bits/stdc++.h> using namespace std; int t; int q[100000]; int main(){ cin>>t; while(t--){ int jw=0,len=1,a,b; for(int i=1;i<=100000;i++) q[i]=0; q[1]=1; scanf("%d%d",&a,&b); for(int i=2;i<=a;i++){ jw=0; for(int j=1;j<=len;j++){ q[j]=q[j]*i+jw; jw=q[j]/10; q[j]=q[j]%10; } while(jw>0){ len++; q[len]=jw%10; jw/=10; } } // for(int i=len;i>=1;i--) printf("%d",q[i]); // printf("\n"); long long cnt=0; for(int i=1;i<=len;i++){ if(q[i]==b) cnt++; } printf("%ld\n",cnt); } return 0; } ``` 这样阶乘对了,但全WA
by queenbee @ 2024-04-13 19:56:46


@[FYH666666](/user/1099417) AC代码```cpp #include<bits/stdc++.h> using namespace std; int t; int main(){ scanf("%d",&t); while(t--){ int q[100000]; int jw=0,len=1,a,b; for(int i=1;i<=100000;i++) q[i]=0; q[1]=1; scanf("%d%d",&a,&b); for(int i=2;i<=a;i++){ jw=0; for(int j=1;j<=len;j++){ q[j]=q[j]*i+jw; jw=q[j]/10; q[j]=q[j]%10; } while(jw>0){ len++; q[len]=jw%10; jw/=10; } } // for(int i=len;i>=1;i--) printf("%d",q[i]); // printf("\n"); long long cnt=0; for(int i=1;i<=len;i++){ if(q[i]==b) cnt++; } printf("%ld\n",cnt); } return 0; } ```
by bulopi @ 2024-04-13 19:57:46


@[FYH666666](/user/1099417) AC代码 ```cpp #include<bits/stdc++.h> using namespace std; int t; int main(){ scanf("%d",&t); while(t--){ int q[100000]; int jw=0,len=1,a,b; for(int i=1;i<=100000;i++) q[i]=0; q[1]=1; scanf("%d%d",&a,&b); for(int i=2;i<=a;i++){ jw=0; for(int j=1;j<=len;j++){ q[j]=q[j]*i+jw; jw=q[j]/10; q[j]=q[j]%10; } while(jw>0){ len++; q[len]=jw%10; jw/=10; } } long long cnt=0; for(int i=1;i<=len;i++){ if(q[i]==b) cnt++; } printf("%ld\n",cnt); } return 0; } ```
by bulopi @ 2024-04-13 19:58:35


@[bulopi](/user/948361) 为啥q在while里定义才能A?
by queenbee @ 2024-04-13 20:01:48


## 具体错误有以下几点: 1. 下面这样的方式循环是错误的 ```cpp while(t-->=0){ t--; ………… } ``` 可改为 ```cpp while(t--){ ………… } ``` 2. 高精度进位的那个循环要放在外面,不然算法逻辑都是错的,原来是这样: ```cpp for(int j=1;j<=len;j++){ q[j]=q[j]*i+jw; jw=q[j]/10; q[j]=q[j]%10; while(jw>0){ len++; q[len]=jw%10; jw/=10; } } ``` 可以改为这样: ```cpp for(int j=1;j<=len;j++){ q[j]=q[j]*i+jw; jw=q[j]/10; q[j]=q[j]%10; } while(jw>0){ len++; q[len]=jw%10; jw/=10; } ``` 3. 还有就是数组开小了,要加个0 [AC记录](https://www.luogu.com.cn/record/155709088)(球关)
by bulopi @ 2024-04-13 20:03:57


@[bulopi](/user/948361) 建议开到100001,虽然我不知道为什么在遍历1~100000是没有超,但是在main外面定义会WA
by queenbee @ 2024-04-13 20:09:11


@[bulopi](/user/948361) 已关感谢啦
by FYH666666 @ 2024-04-13 20:34:53


@[queenbee](/user/789564) 关注啦谢谢
by FYH666666 @ 2024-04-13 20:35:26


|