青少年编程知识记录 codecoming

【题解】大数取模

【题目描述】

求m%n。

【输入描述】

两个数,m和n。

【输出描述】

m模n的值。

【样例输入】

3

【样例输出】

2

【数据范围】

对于30%的数据, 1<m<10^18

对于70%的数据, m>10^18

【题目分析】

  • 题目描述非常简单,去m模n即可,但是从数据范围上看并不简单,题目的数据范围明显超过long long。所以,这个题目考虑用高精度的思想配合数论的知识进行求解

  • 使用高精度,用字符数组进行计算,那么转化用 a[i]-'0',所以数组的每一个a[i]只放一个数。

  • 用到了数论里的知识  (a+b)%p =(a%b + b%p) % p





假如1234是用高精度表示,那么这四个数字单独存在数组中,那么(1 2 3 4)%n  等价于 (1000 + 200+30+4)%n 

上面的知识我们拆分开就是:(1000 %n + 200 %n + 30%n +4 %n)%n。那么,基础代码就是 : ans*10+s[i]-'0'

 

【参考代码】

#include<bits/stdc++.h>  using namespace std;  int main() {  	int n;  	char m[1000];    	cin>>m;  	cin>>n;  	int ans=0;  	for(int i=0; m[i]!='\0'; i++) {  		int temp=  (m[i]-'0');  		ans=((ans*10)%n  + temp %n)%n;  	}  	cout<<ans%n;  	return 0;  }



(adsbygoogle = window.adsbygoogle || []).push({});