求余数
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
现在给你一个自然数n,它的位数小于等于一百万,现在你要做的就是求出这个数除10003之后的余数
-
输入
-
第一行有一个整数m(1<=m<=8),表示有m组测试数据;
随后m行每行有一个自然数n。
输出
- 输出n整除10003之后的余数,每次输出占一行。 样例输入
-
3 4 5 465456541
样例输出
-
4 5 6948
来源
- 经典题目 上传者
思路:
这题一直找不到规律,原来是要用大整数求余。以下思路感谢 时间沙漏:
大整数求余数:
求模公式:
(a+b)modn=((amodn)+(bmodn))modn;
(a-b)modn=((amodn)-(bmodn)+n)modn ;
(a*b)modn=(amodn)(bmodn)modn;
首先,把大整数写成自左向右的形式,如 1234=((1*10+2)*10+3)*10+4;
然后利用上面的公式,每步求模 ,例如:
scanf("%s%d",n,&m);
int len=strlen(n);
int ans=0;
for(i=0;i<len;i++)
{
ans=(int)(((long long)ans*10+n[i]-'0')%m);
}
printf("%d\n",ans);
*/
AC代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<string> using namespace std; typedef long long ll; int main() { freopen("input.txt","r",stdin); int n,i,ans,len; string s; cin >> n; while(n--){ cin >> s; len=s.length();ans=0; for(i=0;i<len;++i){ ans=(int)(((long long)ans*10+s[i]-'0')%10003); } printf("%d\n",ans); } return 0; }
-
第一行有一个整数m(1<=m<=8),表示有m组测试数据;